是否有更好的功能,然后check4winner()为我的tictactoe板

时间:2012-10-04 01:08:05

标签: javascript

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().

5 个答案:

答案 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)

答案 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,并且没有任何获胜,那么它就是猫的游戏。像我说的检查变量应该取决于轮到谁了。我希望我能很好地解释这一点......