需要Javascript TicTacToe-Game的解释

时间:2014-11-03 20:49:41

标签: javascript tic-tac-toe

我正在寻找解释为什么Javascript中的代码有效。

理念如下:

             *     273                 84
             *        \               /
             *          1 |   2 |   4  = 7
             *       -----+-----+-----
             *          8 |  16 |  32  = 56
             *       -----+-----+-----
             *         64 | 128 | 256  = 448
             *       =================
             *         73   146   292

每次玩家设置他的数字时,该字段的数量都会添加到他的分数中。 该领域的数字是胜利。

现在有这个检查:

wins = [7, 56, 448, 73, 146, 292, 273, 84],
win = function (score) {
    var i;
    for (i = 0; i < wins.length; i += 1) {
        if ((wins[i] & score) === wins[i]) {
            return true;
        }
    }
    return false;
},

现在我不明白:如果玩家在字段中设置数字(字段中的数字,顺序事项)1,16,4,2,那么他的得分为23.代码如何知道即使他没有得分7,他仍然连续3次? (这是最上面的一行)因为代码只将得分与胜利进行比较,而23则不是胜利!

2 个答案:

答案 0 :(得分:1)

算法不只是使用简单的数学来计算胜利。它使用按位运算执行位掩码来检查胜利。

每个方块都有不同的位值(从电路板的右上角开始):

1 = 000000001
2 = 000000010
4 = 000000100
...
9 = 100000000

然后添加获胜的方块以获得获胜组合:

7   = 000000111
56  = 000111000
448 = 111000000
...

然后我们可以使用你设置的1,16,4,2的例子:

23 = 0000001111

当我们使用按位和操作来检查它具有的获胜组合时:

  000001111 (23)
& 000000111 (7)
  ---------
  000000111 (7)

您可以看到结果与获胜组合相同,这是您的算法正在检查的内容。

答案 1 :(得分:0)

它没有与数字进行比较,而是比较了哪些比特被设置。行wins[i] & score === wins[i]表示它正在比较wins [i]和得分[wins]之间的任何常见位。

以下是使用您在问题中的值1,16,4,2。

的示例
1 = 1
2 = 10
4 = 100
7 = 111
16 = 10000

因此,如果您选择了所有这些字段,它是10111二进制,将其与7进行比较,翻转的公共位是111(7),因此它知道有一个胜利,因为这三个都已设置。