Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.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 - Fatal编程技术网

优化Javascript

优化Javascript,javascript,Javascript,所以我决定建立一个小的井字游戏,我将X和O存储在一个数组中,并有一个功能来检查数组,看看是否有人赢了 现在我正在做一个大巨人如果 if ((board[0] == valueToCheck && board[1] == valueToCheck && board[2] == valueToCheck) || (board[3] == valueToCheck && board[4] == valueToCheck && bo

所以我决定建立一个小的井字游戏,我将X和O存储在一个数组中,并有一个功能来检查数组,看看是否有人赢了

现在我正在做一个大巨人如果

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,我会以某种方式序列化棋盘(例如,作为一个空格串,X和O)然后简单地将当前字符串与已知的游戏结束字符串进行比较

 | |
-+-+-
X| |
-+-+-
 | |O
变成

var gameState = "   X    O";

这里有一个使用数组的
some
every
的简单方法。不适用于旧浏览器

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);}) ) { ... }

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

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) {
    // ...
}
var组合=[
[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;
对于(变量i=0;i
将每个正方形表示为18位数字中的两位:

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

正方形的顺序如下:

1|2|3
-+-+-
4|5|6
-+-+-
7|8|9
因此,最上面一行中的X(所有其他平方为空)由整数258048(二进制为111111000000000000)表示

现在,如果您想查看X是否获胜,请对8种可能获胜的组合使用按位AND(&):

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个获胜组合。在与聪明对手的比赛中,胜利者最有可能占据中心广场。首先检查这些组合将使您能够在计算条件时利用短路。

当您说优化时,是指运行更快,还是使用更少的代码?“优化”意味着更少的cpu周期。“模糊化”是更少的代码。:)有很多可能获胜的州,但这是一个有趣的想法。我看不出这有什么好处。如果使用基本字符串比较实现比较,则需要所有可能的结束配置的巨大列表。如果你用一个更复杂的方法来实现比较,你可以不用序列化就很容易地实现。我想要的是易于实现,并且从海报现在的位置开始逐步升级。这怎么比OP中的代码更有效?这是完全相同的比较,除了这个答案有额外的循环开销。这比OP效率低。