1
function check4Winner(){    
    winningCombinations = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]];     
    for(var a = 0; a < winningCombinations.length; a++){
        if(squares[winningCombinations[a][0]]==currentPlayer&&
           squares[winningCombinations[a][1]]==currentPlayer&&
           squares[winningCombinations[a][2]]==currentPlayer){
             winner=true;
             alert(currentPlayer+ " WON!");              
        }           
    }//forloop  
}//end check4Winner().
4

5 回答 5

2

我也会return跳出循环来防止重复的获胜者对话框:

function check4Winner(){    
    var winningCombinations = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]];

    for (var a = 0; a < winningCombinations.length; a++) {
        if (squares[winningCombinations[a][0]]==currentPlayer &&
            squares[winningCombinations[a][1]]==currentPlayer &&
            squares[winningCombinations[a][2]]==currentPlayer) {
             alert(currentPlayer+ " WON!");

             return true;           
        }           
    }

    return false;
}
于 2012-10-04T01:16:11.573 回答
0

考虑将 8 种可能的获胜组合表示为二进制数(或转换为十进制,但二进制很明显),其中 1 表示选定的正方形:

var winners = {'111000000':'', '000111000':'', '000000111':'', // hz
               '100100100':'', '010010010':'', '001001001':'', // vt
               '100010001':'', '001010100':''};                // diag

然后在 3 圈后检查用户的选择是否使用以下方法转换为适当的二进制数in

if (currentScore in winners) { 
  // ta da!
}

编辑

哦,转弯后保持分数:

// Start with no score
var score = '000000000';

// Update score where num is selected square (0 to 8 inclusive)
score = score.substring(0, num) + '1' + score.substring(++num);

您可以使用正则表达式来减少代码:

var winners  = /111000000|000111000|000000111|100100100|010010010|001001001|100010001|001010100/;
if (winners.test(score)) // ta da!

var winners = /^(448|56|7|292|146|73|273|84)$/; // using decimal numbers
if (winners.test(parseInt(score, 2))) // ta da!

有多少种方法可以给猫剥皮?

于 2012-10-04T03:14:08.460 回答
0

我能想到的唯一能做的就是收集有关获胜组合出现频率的统计数据。

然后,您可以根据该频率对您检查的组合进行排序,将出现频率更高的获胜组合放在列表的开头。

于 2012-10-04T01:11:14.823 回答
0

您可以尝试在 Google 上搜索其他代码,例如

并在这里测试哪个更快:http: //jsperf.com/

于 2012-10-04T01:15:12.790 回答
0

我可以想到另一种方法来检查是否有赢家。这里是:

 var x, y, win;
            //RUN THRU ARRAYS ALL WIN POSS == A WIN
            for (x = 0; x < winningCombinations .length; x++) //if all three are equal to current string (either x or o)
            {
                for(y = 0;y < winningCombinations [x].length;y++)
                {
                    if(document.getElementById(win_Array[x][y]).innerText == check) {
                        counter++;
                    }
                    if(counter == 3)
                    {
                    alert(Check + 'Won!')
                    } 
                }
                counter = 0; //resets count before checking next possible wins
            }

让我解释一下这里发生了什么。第一个 for 循环从索引 0 开始。第二个 for 循环遍历第一个索引的所有 3 个索引。举例说明:它遍历每一个获胜组合并检查它是否等于 X 或 O。我的变量check由最后轮到谁来定义。因此,如果轮到 X,则检查 = 'X'; 每当 if 语句在框中找到 X 或 O 时,或者在您的情况下,获胜组合为真,它就会向计数器添加 +1。当计数器达到 3 时,这意味着它发现有 3 个 X 或 O,并且行彼此相等。counter = 0 部分在上部 for 循环的 x 值更改之前重置计数器。这可以防止程序在任何地方找到 3 个 X 或 O 并说您赢了。至于提醒谁赢了,这完全取决于您的变量以及您如何跟踪转弯。我建议同时传递一个计数器变量和一个检查变量。计数器变量将计算进行了多少次移动,如果它是 = 到 9,并且没有任何胜利,那么这是一场猫的游戏。像我说的检查变量应该取决于轮到谁了。我希望我解释得很好……

于 2014-04-26T08:05:41.173 回答