优化Javascript

时间:2014-02-01 01:29:58

标签: javascript

所以我决定构建一个小小的Tic-Tac-Toe游戏,我将X和O存储在一个数组中,并且有一个检查阵列的功能,看看是否有人赢了。

现在我正在做一个巨大的巨人IF

if ((board[0] == valueToCheck && board[1] == valueToCheck && board[2] == valueToCheck) ||
    (board[3] == valueToCheck && board[4] == valueToCheck && board[5] == valueToCheck) ||
    (board[6] == valueToCheck && board[7] == valueToCheck && board[8] == valueToCheck) ||
    (board[0] == valueToCheck && board[3] == valueToCheck && board[6] == valueToCheck) ||
    (board[1] == valueToCheck && board[4] == valueToCheck && board[7] == valueToCheck) ||
    (board[2] == valueToCheck && board[5] == valueToCheck && board[8] == valueToCheck) ||
    (board[0] == valueToCheck && board[4] == valueToCheck && board[8] == valueToCheck) ||
    (board[2] == valueToCheck && board[4] == valueToCheck && board[6] == valueToCheck)) {

我只是想知道是否有一种更优化的方式来做到这一点,因为我即将建立一个计算机化的对手,它应该检查它的对手是否即将赢,哦,我不使用jQuery < / p>

4 个答案:

答案 0 :(得分:1)

您可以使用数组来存储可能的组合来简化它:

var combinations = [
    [0, 1, 2],
    [3, 4, 5],
    [6, 7, 8],
    [0, 3, 6],
    [1, 4, 7],
    [2, 5, 8],
    [0, 4, 8],
    [2, 4, 6]
];

var win = false;
for(var i = 0 ; i < combinations.length ; i++) {
    var c = combinations[i];
    if(board[c[0]] == valueToCheck && board[c[1]] == valueToCheck && board[c[2]] == valueToCheck) {
        win = true;
        break;
    }
}

if(win) {
    // ...
}

答案 1 :(得分:0)

我会以某种方式序列化电路板(例如作为一串空格,X和O),然后简单地将当前字符串与已知的结束游戏字符串进行比较。

 | |
-+-+-
X| |
-+-+-
 | |O

成为

var gameState = "   X    O";

答案 2 :(得分:0)

以下是使用数组someevery的简短方法。使用旧浏览器时不是compatible

var wins = [
   [0,1,2], [3,4,5], [6,7,8], // rows
   [0,3,6], [1,4,7], [2,5,8], // columns
   [0,4,8], [2,4,6] ];        // diagonals

var is_value = function(i) { return board[i] == valueToCheck; };

if( wins.some(function(a){return a.every(is_value);}) ) { ... }

答案 3 :(得分:0)

将每个方块表示为18位数字中的两位:

00 =空白, 10 = “O”, 11 = “X”

,方块按以下顺序排列:

1|2|3
-+-+-
4|5|6
-+-+-
7|8|9

以便顶行中的X(所有其他正方形为空)由整数258048(二进制为111111000000000000)表示。

现在,如果您想要查看X是否赢了,您可以使用按位AND(&amp;)来对抗8种可能的获胜组合:

if (
    (gameBoard & 258048 === 258048) ||   // top row full of X's
    (gameBoard & 4032 === 4032)     ||   // middle row full of X's
    // etc.
   ) { // X has won }

理想情况下,你将每个获胜的组合(再次,只有8个)放在一个数组中并像这样运行:

if (
    (gameBoard & winningXCombo[0] === winningXCombo[0]) ||   // top row full of X's
    (gameBoard & winningXCombo[1] === winningXCombo[1]) ||   // middle row full of X's
    // etc.
   ) { // X has won }

而且,如果你真的想要优化,请先检查通过中心广场的4个获胜组合。在与智能对手的比赛中,获胜者很可能拥有中心广场。首先检查这些组合将使您在评估条件时利用短路。