我正在开发一个井字游戏,各种组合可能会产生赢家。我创建了一个包含获胜组合的数组(我使用的是jquery,因此我将它们存储为与HTML中的ID对应的字符串):

var winningCombos = [
                ["#0", "#1", "#2"],
                ["#0", "#4", "#8"],
                ["#0", "#3", "#6"],
                ["#1", "#4", "#7"],
                ["#2", "#4", "#6"],
                ["#2", "#5", "#8"],
                ["#3", "#4", "#5"],
                ["#5", "#6", "#7"]
            ]


我已经编写了一些代码,可以成功地检查这些组合中的任何一个是否包含所有“ x”或全部“ y”,并且当它们组合在一起时,就可以确定赢家。但是,我现在要尝试的是找到一种方法来测试任何3个组合中的2个是否包含“ x”或“ y”。如果他们这样做,则计算机应尝试通过填充将给出获胜的剩余正方形来“阻止”获胜组合。

例如:我要检查每个组合,如果#0和#1都等于“ X”,则计算机应在#2中放置“ O”以阻止获胜。

我在概念上很难做到这一点。我知道其他人已经为这类事情实现了minimax算法,但是我仍然是一个初学者,真的不了解它们如何工作。

更多信息

有人问我如何代表董事会,以及我目前如何检查胜利。

游戏板:

        <div class="row" id="row1">
            <div class="square" id="0"></div>
            <div class="square" id="1"></div>
            <div class="square" id="2"></div>
        </div>

        <div class="row" id="row2">
            <div class="square" id="3"></div>
            <div class="square" id="4"></div>
            <div class="square" id="5"></div>
        </div>

        <div class="row" id="row3">
            <div class="square" id="6"></div>
            <div class="square" id="7"></div>
            <div class="square" id="8"></div>
        </div>


检查胜利

    function checkForWin() {
          for (var i = 0; i < winningCombos.length; i++) {
           //console.log($(winningCombos[i][0]).text().indexOf("X"));
           if ($(winningCombos[i][0]).text().indexOf("X") >= 0 && $(winningCombos[i][1]).text().indexOf("X") >= 0 && $(winningCombos[i][2]).text().indexOf("X") >= 0) {
           gameOver("x")
       } else if ($(winningCombos[i][0]).text().indexOf("O") >= 0 && $(winningCombos[i][1]).text().indexOf("O") >= 0 && $(winningCombos[i][2]).text().indexOf("O") >= 0) {
           gameOver("o");
       }
  }
}

最佳答案

我将创建两个循环:


在第一次循环中,您的阵列计算机将检查用户是否具有三个可能选项中的两个,如果有,则阻止第三个字段。
第二个循环-如果第一个循环没有移动而结束。在第二台计算机中,尝试通过完成阵列中未阻止的获胜可能性之一来取胜(在选择行完成计算机之后,应将其保留在其上,直到它将被阻止或计算机获胜)。


为了获得更好的性能,我将创建两个额外的结构:


对于计算机获胜-结构将删除用户赢得比赛的行,并且计算机不再可能获得该行的获胜
对于用户胜利-结构将删除计算机已占用任何字段的行,并且用户无法再通过该行赢得胜利


多亏了额外的结构可以同时检查这两项内容-阻止用户,并找到可能的获胜行,从而减少了循环次数。

我的解决方案基于您的原始想法-胜利组合阵列。

07-24 09:47
查看更多