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().
答案 0 :(得分: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;
}
答案 1 :(得分:0)
我唯一能想到的就是收集有关获胜组合发生频率的统计数据。
然后您可以根据频率对您检查的组合进行排序,将更频繁出现的获胜组合放在列表的开头。
答案 2 :(得分:0)
您可以尝试在Google上搜索其他代码,例如
并测试哪一个更快:http://jsperf.com/
答案 3 :(得分:0)
考虑将8种可能的获胜组合表示为二进制数(或转换为十进制,但二进制是显而易见的),其中1表示选定的正方形:
var winners = {'111000000':'', '000111000':'', '000000111':'', // hz
'100100100':'', '010010010':'', '001001001':'', // vt
'100010001':'', '001010100':''}; // diag
如果用户的选择使用in
转换为相应的二进制数,则在3回合后检查:
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!
你可以用多少种方法给猫打毛?
答案 4 :(得分: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,那么check ='X';每次if语句在框中找到X或O,或者在您的情况下,获胜组合为真,它会向计数器添加+1。当计数器达到3时,这意味着它发现有3个X或O,并且行彼此相等。 counter = 0部分在upper for循环的x值改变之前重置计数器。这可以防止程序在任何地方找到3个X或O,并说你赢了。至于警告谁赢了,这一切都取决于你的变量以及你如何跟踪转弯。我建议传递一个计数器变量和一个检查变量。计数器变量将计算所做的移动次数,如果它是= 9,并且没有任何获胜,那么它就是猫的游戏。像我说的检查变量应该取决于轮到谁了。我希望我能很好地解释这一点......