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 に答える
また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;
}
8 つの勝ちの組み合わせを 2 進数で表すことを検討してください (または 10 進数に変換しますが、2 進数は明らかです)。ここで、1 は選択された正方形を表します。
var winners = {'111000000':'', '000111000':'', '000000111':'', // hz
'100100100':'', '010010010':'', '001001001':'', // vt
'100010001':'', '001010100':''}; // diag
次に、3 ターン後に、ユーザーの選択が次を使用して適切な 2 進数に変換されるかどうかを確認します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!
猫の皮を剥く方法は何通りありますか?
私が考えられる唯一のことは、ウィニング コンビネーションの発生頻度に関する統計データを収集することです。
次に、その頻度に基づいてチェックする組み合わせを並べ替え、より頻繁に発生する勝利の組み合わせをリストの先頭に配置できます。
次のような他のコードをグーグルで検索してみてください
- http://www.javascriptkit.com/script/script2/tactoe.shtml
- http://www.dreamincode.net/forums/topic/247361-simple-tic-tac-toe-using-html5-css3-and-javascript/
- http://lppjunior.com/projects/jogo-da-velha/
ここでどちらが速いかをテストします: http://jsperf.com/
勝者がいるかどうかを確認する別の方法を考えることができます。そして、ここにあります:
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 から始まります。2 番目の for ループは、最初のインデックスの 3 つのインデックスすべてを実行します。説明すると: 勝利したすべてのコンボを実行し、X または O に等しいかどうかをチェックします。私の変数check
最後に誰の番だったかによって定義されます。X の番だった場合は、check = 'X'; if ステートメントがボックス内に X または O を見つけるたびに、またはあなたの場合は勝利の組み合わせが真であると、カウンターに +1 が追加されます。カウンターが 3 に達すると、3 つの X または O があり、行が互いに等しいことがわかったことを意味します。counter=0 の部分は、上の for ループの x の値が変化する前にカウンターをリセットします。これにより、プログラムが 3 つの X または O を見つけて、あなたが勝ったと言うのを防ぎます。誰が勝ったかのアラートに関しては、それはすべて、変数とターンをどのように追跡するかによって異なります。カウンター変数とチェック変数の両方を渡すことをお勧めします。カウンター変数は、どこで何回手を打ったかをカウントし、それが 9 までで、勝ちがない場合は猫のゲームです。私が言ったようなチェック変数は、それが誰の番であるかに依存するはずです。私はこれをうまく説明したと思います...