2014-11-03 55 views
-2

我在寻找解释为什么这段代码在Javascript的作品。需要说明的Javascript TicTacToe-游戏

理念看起来如下:

   *  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不是赢!

+0

你为什么想在PHP中做到这一点? PHP是服务器端语言。我可以看到PHP在这里被使用的唯一方法是用于多人版本,但实际的界面将使用Javascript来构建。 – 2014-11-03 20:56:39

+0

我试图制作一个多人游戏版本(分数,玩家和谁转向它是保存在一个MySQL数据库) 我希望一切都在PHP上,因为我不想在这个项目中使用ajax! – TheElbenreich 2014-11-03 21:01:50

+0

那么你应该在你的问题中说清楚。最简单的方法是使用Ajax,套接字(如果我诚实地使用套接字,看看Node.JS,它真的很酷),或者我敢说它...... IFrames。 – 2014-11-03 21:06:21

回答

0

它不是比较数字,而是比较哪些位被设置。行wins[i] & score === wins[i]意味着它比较胜利[i]和胜利[i]之间的任何公共比特。

下面是一个使用您的问题中的值的例子,1,16,4,2。

1 = 1 
2 = 10 
4 = 100 
7 = 111 
16 = 10000 

因此,如果你选择了所有这些领域的是二进制10111,比较,为7,被翻转的常见位是111(7),所以它知道有一个胜利,因为那些3全都设置好了。

+0

哦,谢谢!这更有意义!有没有关键字或我可以查找如何在PHP中执行此操作的方法?我需要寻找什么? – TheElbenreich 2014-11-03 20:57:36

+0

@TheElbenreich我的建议是,你打开一个不同的问题。 – 2014-11-03 21:00:34

+0

http://php.net/manual/en/language.operators.bitwise.php – Shriike 2014-11-03 21:28:14

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) 

你可以看到的结果是一样的为获胜组合,这是你的算法检查。