2017-08-16 11 views
1

私は機能しているTic Tac Toeプログラムを書いています。私の勝利条件を除いて、長すぎると醜いです。それはこのように見えます。Javascript - Tic Tac Toe - 勝利条件をループする方法は?

function checkWin(){ 
    if(board[0].textContent === "X" && 
    board[1].textContent === "X" && 
    board[2].textContent === "X" 
) { alert("Win")} 
    else if (
    board[3].textContent === "X" && 
    board[4].textContent === "X" && 
    board[5].textContent === "X" 
) { alert("Win")} 
    else if (
    board[6].textContent === "X" && 
    board[7].textContent === "X" && 
    board[8].textContent === "X" 
) { alert("Win")} 

} 

私はすべてのことを書いてもそれはもっと長くなるので、私はいくつかの勝利条件を書いています。私はどのように私は短いバージョンを書くことができますかと思っていた。 配列を作成してループすることを考えていましたが、どうやって解決するのか分かりません。 これはこのようなものになります。

var winConditions = [[0,1,2]、[3,4,5]、[6,7,8]、[0,3,6]、[1,4,7]、[2 、5,8]、[0,4,8]、[6,4,2]]

しかし、私はどのようにwinConditionsをループしてXとOと同じにするためにcheckWinを使うことができますか?

+0

解決するのは簡単な問題ではありません。既存のアルゴリズムのいずれかを使用しない限り、乱雑になることがあります。私がTTTゲームを最後に書いたとき、プレーヤーのタイルのどれかがボードと同じ長さの直線を形成しているかどうかを調べました。あなたが難しい方法でやりたいのでない限り、この問題の既存のアルゴリズムを調べてください。 – Carcigenicate

+0

https://stackoverflow.com/questions/1056316/algorithm-for-determining-tic-tac-toe-game-over – Carcigenicate

+0

もちろん、https://stackoverflow.com/questions/18548265/testing-tic-tac -toe-win-condition/18549674#18549674 –

答えて

0

ループと合計を実行しています。もちろん、これを最適化することができます。

var winConditions = [ /* what you defined */ ]; 

function winTest(board, side) { 
    for(var i = 0; i < winConditions.length; i++) { 
    var sum = 0; 
    var w = winConditions[i]; 

    for(var b = 0; b < w.length; b++) { 
     if(board[w[b]].textcontent === side) { 
     sum++ 
     } 
    } 

    if(sum === 3) { 
     return true; 
    } 
    } 
    return false; 
} 

// then, call it : 
var result = winTest(board, 'X'); 
0

ES6で

function checkWin(player){ 
 
    // player = 'X' or 'O' 
 

 
    const horizontal = [0,3,6].map(i=>{return[i,i+1,i+2]}); 
 
    const vertical = [0,1,2].map(i=>{return[i,i+3,i+6]}); 
 
    const diagonal = [[0,4,8],[2,4,6]]; 
 

 
    var allwins = [].concat(horizontal).concat(vertical).concat(diagonal); 
 
    
 
    let res = allwins.some(indices => { 
 
    return board[indices[0]] == player && board[indices[1]] == player && board[indices[2]] == player}) 
 
    return res; 
 
} 
 
// O O O 
 
// X X O 
 
// X X O 
 
var board=["X","X","O","X","X","O","O","O","O"]; 
 
console.log(checkWin("X"),"Expect: false"); // false 
 
console.log(checkWin("O"),"Expect: true"); // true 
 

 
// negative test case 
 
var board = []; 
 
console.log(checkWin("X"),"Expect: false"); // false 
 

 
// wierd case of only 1 player 
 
// X X X 
 
var board = ["X","X","X"] 
 
console.log(checkWin("X"),"Expect: true"); //true

0

怠惰なバージョンでは、1つの文字列にそれらを結合することができますし、RegExpでそれらをテストします。

function checkWin() 
{ 
    var str = "" 
    for (var i = 0; i < 9; i++) 
     str += board[i].textContent 

    if (/(X...?)\1X|^(...)*XXX|^..X.X.X/.test(str)) 
     alert("Win") 
}