2017-07-15 16 views
0

我在想,必須有一個更簡單的方法來做到這一點。任何人都可以給我一些建議嗎?我正在驗證一個tic tac腳趾板,並且可能會推翻它。一個更簡單的方法來驗證一個井字棋牌

const checkSetForSingleValue = set => { 
 
    if (set.size === 1) { 
 
    let val = set.values().next().value; 
 
    if (val) return val; 
 
    } 
 
    return false; 
 
}; 
 

 
const checkForWin = board => { 
 
    let set, col, val; 
 
    for (let i=0; i<board.length; i++) { 
 
    set = new Set(board[i]); 
 
    val = checkSetForSingleValue(set); 
 
    if (val) return val; 
 

 
    // we only need to loop through columns once 
 
    if (i !== 0) continue; 
 

 
    for (let j=0; j<board[i].length; j++) { 
 
     set = new Set([board[0][j], board[1][j], board[2][j]]); 
 
     val = checkSetForSingleValue(set); 
 
     if (val) return val; 
 
    } 
 
    } 
 

 
    // check for diagonal win 
 
    if (board[1][1]) { // make sure center isn't null 
 
    set = new Set([board[0][0], board[1][1], board[2][2]]); 
 
    val = checkSetForSingleValue(set); 
 
    if (val) return val; 
 

 
    set = new Set([board[0][2], board[1][1], board[2][0]]); 
 
    val = checkSetForSingleValue(set); 
 
    if (val) return val; 
 
    } 
 

 
    return false; 
 
}; 
 

 
let board = [ 
 
    ['o', 'x', 'x'], 
 
    ['o', null, null], 
 
    ['o', 'o', 'x'] 
 
]; 
 

 
alert(checkForWin(board)); 
 

 
board = [ 
 
    ['o', 'x', 'x'], 
 
    ['o', 'x', null], 
 
    ['x', 'o', 'x'] 
 
]; 
 

 
alert(checkForWin(board));

+0

看起來不錯。無論如何,使用matrtix 3x3進行計算不會有任何影響。可能你的任務可以用數學矩陣魔法來解決,但我並不擅長。而且,從我的觀點來看,您應該使用'true-false-null'而不是''x' - 'o'-null'。在我的情況下,你應該改變你的代碼,因爲你的檢查將失敗。 – degr

回答

0

我們可以產生的可能勝,如清單

[[0,0],[0,1],[0,2]] // [x,y] 

那麼我們只需要迭代一次,並找到一個可能的匹配。我們可以產生很容易像這樣(和可能緩存,然後再縮小):

var wins=[ 
...[0,1,2].map((y,_,row)=>row.map(x=>[x,y])),//vertical 
...[0,1,2].map((x,_,row)=>row.map(y=>[x,y])),//horizontal 
...[[[0,0],[1,1],[2,2]],[[0,2],[1,1],[2,0]]]//diagonal 
]; 

要檢查電路板然後簡單地重複:

board = [ 
    ['o', 'x', 'x'], 
    ['o', 'x', null], 
    ['x', 'o', 'x'] 
]; 

var win=wins.find(win=>win.reduce((s,[x,y])=>s===board[x][y]?s:false,board[win[0][0]][win[0][1]])); 
console.log(board[win[0][0]][win[0][1]]+" won"); 
0

我認爲這是非常簡單,只需檢查有效條件.. 。

const checkForWin = board => { 
    let flag = false; 
    for (let i=0;i<3;i++){ 
      if((board[i][0] == 'o' && board[i][1] == 'o' && board[i][2] == 'o') || (board[0][i] == 'o' && board[1][i] == 'o' && board[2][i] == 'o')){ 
       return true; 
      } 
    } 

    if((board[0][0] == 'o' && board[1][1] == 'o' && board[2][2] == 'o') || (board[2][0] == 'o' && board[1][1] == 'o' && board[0][2] == 'o')){ 
     return true; 
    } 

    return false; 
}; 

let board = [ 
    ['o', 'x', 'x'], 
    ['o', null, null], 
    ['o', 'o', 'x'] 
]; 

alert(checkForWin(board)); 

board = [ 
    ['o', 'x', 'x'], 
    ['o', 'x', null], 
    ['x', 'o', 'x'] 
]; 

alert(checkForWin(board)); 
0

都會響起@Chirag Goti的迴應......

const checkForWin = board => { 
    let b = board; 

    for (let i=0; i<b.length; i++) { 
    if (b[i][0] && b[i][0] === b[i][1] && b[i][1] === b[i][2]) { 
     return b[i][0]; 
    } else if (b[0][i] && b[0][i] === b[1][i] && b[1][i] === b[2][i]) { 
     return b[i][0]; 
    } 
    } 

    if (b[1][1]) { 
    if (b[0][0] === b[1][1] && b[1][1] === b[2][2] || 
     b[0][2] === b[1][1] && b[1][1] === b[2][0]) { 
     return b[1][1]; 
    } 
    } 

    return false; 
}; 
相關問題