Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检查数组的值_Javascript_Jquery_Tic Tac Toe - Fatal编程技术网

Javascript 检查数组的值

Javascript 检查数组的值,javascript,jquery,tic-tac-toe,Javascript,Jquery,Tic Tac Toe,我正在开发一个tic-tac-toe游戏,在这个游戏中,多种组合可能会产生赢家。我创建了一个数组来保存获胜的组合(我使用jquery,因此我将它们存储为字符串,对应于HTML中的ID): 我已经编写了一些代码,成功地检查了这些组合中是否有任何组合包含全部“x”或全部“y”,当它们包含时,就会确定一个获胜者。然而,我现在要做的是找出一种方法来测试3个组合中的2个是否包含“x”或“y”。如果他们这样做了,那么计算机应该尝试通过填充剩余的方块来“阻止”获胜的组合 例如:我想检查每个组合,如果#0和#1

我正在开发一个tic-tac-toe游戏,在这个游戏中,多种组合可能会产生赢家。我创建了一个数组来保存获胜的组合(我使用jquery,因此我将它们存储为字符串,对应于HTML中的ID):

我已经编写了一些代码,成功地检查了这些组合中是否有任何组合包含全部“x”或全部“y”,当它们包含时,就会确定一个获胜者。然而,我现在要做的是找出一种方法来测试3个组合中的2个是否包含“x”或“y”。如果他们这样做了,那么计算机应该尝试通过填充剩余的方块来“阻止”获胜的组合

例如:我想检查每个组合,如果#0和#1都等于“X”,那么计算机应该在#2中加一个“O”来阻止获胜

我很难构思如何做到这一点。我知道其他人已经为这类事情实现了极大极小算法,但我还是一个初学者,真的不知道它们是如何工作的

更多信息

    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");
       }
  }
}
有人问我是如何代表董事会的,我是如何检查当前的胜负的

游戏板:

        <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");
       }
  }
}
函数checkForWin(){
对于(变量i=0;i=0&&$(winningCombos[i][1]).text().indexOf(“X”)>=0&$(winningCombos[i][2]).text().indexOf(“X”)>=0){
gameOver(“x”)
}如果($(winningCombos[i][0]).text().indexOf(“O”)>=0&&$(winningCombos[i][1]).text().indexOf(“O”)>=0&&$(winningCombos[i][2]).text().indexOf(“O”)>=0){
gameOver(“o”);
}
}
}

我将创建两个循环:

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

  • 第二个循环-如果第一个循环结束时没有移动。在第二台计算机中,尝试通过从阵列中完成一个未被阻止的赢的可能性来赢(选择行完成后,计算机应保持在该行上,直到它被阻止或计算机赢为止)

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

    • 对于计算机,win-structure将删除用户获取字段的行,并且计算机不再能够按该行进行赢取
    • 对于用户,win-structure将删除计算机已占用任何字段的行,并且用户无法再通过该行进行赢取
    感谢额外的结构检查这两件事-阻塞用户,并找到可能的win行需要更少的循环计数


    我的解决方案是基于您最初的想法-赢组合阵列。

    我会有点不同。您可以在代码中使用更多的游戏结构。请想象一下游戏场的以下结构,其中粗体数字表示可能获胜的行号:

    01234
    50112
    63 4 5
    7678

    现在,您可以生成一个单元格编号到获胜行的映射

    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]对应一个数字。你必须在你的单元格上运行一个循环,对于每个有X的单元格,你要为单元格映射到的所有行增加一个计数器。例如,如果使用X检查单元格1,则数组将变为:[0,0,1,0,0,1,0,0]。迭代所有9个单元格后,组合数组将包含从0到3的数字。Ofc,如果其中任何一个是3,那么游戏结束。你对第一个有2个的条目感兴趣。Ofc,在迭代该字段时,可以对X和O进行计算


    此解决方案允许您在场地上进行1次传球,以计算比赛结果

    ,因此循环并检查三者中的两个是否相等。表示游戏场的数据结构是什么样的?或者,如果你没有,你目前如何检查赢家?我实际上会跳过硬编码赢家组合。取而代之的是,水平、垂直、对角线依次循环播放板“网格”,然后计算一行中有多少场比赛。