检查数组

时间:2016-09-26 14:31:32

标签: javascript jquery tic-tac-toe

我正在努力构建一个tic-tac-toe游戏,其中各种组合可能会产生胜利者。我创建了一个包含获胜组合的数组(我使用的是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");
       }
  }
}

2 个答案:

答案 0 :(得分:1)

我会创建两个循环:

  1. 在第一个循环中你的阵列计算机检查用户是否有三个可能的选项中的两个,如果是,则阻止第三个字段。

  2. 第二个循环 - 如果第一个循环结束而没有移动。在第二台计算机中尝试通过从阵列中完成一个未阻止的赢取可能性来获胜(在完成计算机之后,应该保留它直到它将被阻止或计算机获胜)。

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

    • for computer win - structure将删除用户占用字段的行,并且计算机不再可以通过该行获胜
    • 对于用户获胜 - 结构将删除计算机已占用任何字段的行,并且用户不再可以通过该行获胜

    感谢额外的结构检查两件事 - 阻止用户,并找到可能的win行需要更少的循环计数。

    我的解决方案基于您的原创理念 - 胜利组合阵列。

答案 1 :(得分:0)

我会有所不同。您可以在代码中使用更多的游戏结构。以免想象游戏领域的以下结构,其中粗体数字描绘了可能的获胜行号:

  

0 1 2 3 4
    5 0 1 2
    6 3 4 5
    7 6 7 8

现在,您可以生成单元格编号到获胜行的地图

0 - 0,1,5 // meaning that when 0 contains X, it may be a part of winning combos 0,1 and 5
1 - 2,5
2 - 3,4,5
3 - 1,6
4 - 0,2,6
5 - 3,6
6 - 1,4,7
7 - 2,7
8 - 0,3,7

现在,想象一下,你有一个8号的数组,每行一个[0,0,0,0,0,0,0,0]。您必须在单元格上运行循环,对于每个单元格中包含X,您需要为单元格映射到的组合所有行增加一个计数器。例如,如果使用X检查单元格1,则数组将变为:[0,0,1,0,0,1,0,0]。迭代完所有9个单元格之后,你的组合数组将包含0到3之间的数字。Ofc,如果其中任何一个是3,那么游戏结束。你对第一个有2个条目的条目感兴趣。 Ofc,您可以在迭代字段时对X和O进行计算。

此解决方案允许您在场上进行1次传球来计算游戏