【问题标题】:Check the values of an array检查数组的值
【发布时间】:2016-09-26 14:31:32
【问题描述】:

我正在开发一款井字游戏,在该游戏中,多种组合可能会产生赢家。我创建了一个包含获胜组合的数组(我使用的是 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”,当它们包含所有“y”时,就会确定获胜者。但是,我现在要做的是找出一种方法来测试任何组合中的 3 个中的 2 个是否包含“x”或“y”。如果他们这样做了,那么计算机应该尝试通过填充剩余的可以获胜的方格来“阻止”获胜组合。

例如:我想检查每个组合,如果#0和#1都等于“X”,那么计算机应该在#2中放置一个“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");
       }
  }
}

【问题讨论】:

  • 所以循环并检查三个中的两个是否相等。 filter
  • 代表比赛场地的数据结构是什么样的?或者如果您没有,您目前如何检查获胜者?
  • 我实际上会跳过对获胜组合进行硬编码。取而代之的是,水平、垂直、对角线遍历棋盘“网格”,然后计算一行中有多少匹配项。

标签: javascript jquery tic-tac-toe


【解决方案1】:

我会创建两个循环:

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

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

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

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

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

我的解决方案基于您的原始想法 - 获胜组合数组。

【讨论】:

    【解决方案2】:

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

    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 次传球以计算比赛

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2012-06-16
      • 2014-05-21
      • 1970-01-01
      相关资源
      最近更新 更多