2017-03-17 6 views
1

以下は、誰かがチック・タック・トゥ・ボードで勝ったかどうかを確認するコードです。 (ボード[0] - ボード[8]上から下へチックタックトーボードを表すが、左から右へ):チック・タック・トゥ・マッチで勝利したかどうかを確認するロジックはありません

func checkWin(board: [Int]) -> Bool{ 
    if board[0] != 0 { 
     if board[0] == board[1] && board[1] == board[2] { 
      return true 
     } else if board[0] == board[3] && board[3] == board[6] { 
      return true 
     } 
    } else if board[4] != 0 { 
     if board[1] == board[4] && board[4] == board[7] { 
      return true 
     } else if board[3] == board[4] && board[4] == board[5] { 
      return true 
     } else if board[2] == board[4] && board[4] == board[6] { 
      return true 
     } else if board[0] == board[4] && board[4] == board[8] { // 
      return true 
     } 
    } else if board[8] != 0 { 
     if board[2] == board[5] && board[5] == board[8] { // 
      return true 
     } else if board[6] == board[7] && board[7] == board[8] { // 
      return true 
     } 
    } 
return false 
} 

しかし、端部における//で三線があってもtrueを返しません条件が満たされる。私は彼らがすべてボードを共有していることに気がつきましたが、これはストーリーボードの問題ではないことが分かりました。誰が何がうまくいかないのを見ることができますか?

+0

3つの外側の 'if'ステートメントのポイントは何ですか? 'board'エントリにはどのような値がありますか? – rmaddy

+0

「0」は空きスペース、1はプレイヤー1、2はプレイヤー2であると推測しています。したがって、3つの空白を3つの空白を勝利として認識するのを防ぐために外側のifがあります。 – vacawama

+0

ゲームを終えてボードアレイを印刷すると、ゲームの終了状態が反映されますか? – Magnas

答えて

2

あなたのロジックに欠陥があります。外側のifと確認したら、いくつかのケースをチェックするだけです。例えば

スペース0が空でない場合、その後、あなただけの例0-1-20-3-6をチェックされていますが、あなたはその可能性を逃してしまう0-4-8をチェックされていません。 0-4-8ケースは最初のelse ifケース内で処理されますが、board[0] != 0の場合は決してそこに着くことはありません。

else ifの代わりに3 ifを使用して修正できます。

func checkWin(board: [Int]) -> Bool{ 
    print(board) 
    if board[0] != 0 { 
     if board[0] == board[1] && board[1] == board[2] { 
      return true 
     } else if board[0] == board[3] && board[3] == board[6] { 
      return true 
     } 
    } 
    if board[4] != 0 { 
     if board[1] == board[4] && board[4] == board[7] { 
      return true 
     } else if board[3] == board[4] && board[4] == board[5] { 
      return true 
     } else if board[2] == board[4] && board[4] == board[6] { 
      return true 
     } else if board[0] == board[4] && board[4] == board[8] { // 
      return true 
     } 
    } 
    if board[8] != 0 { 
     if board[2] == board[5] && board[5] == board[8] { // 
      return true 
     } else if board[6] == board[7] && board[7] == board[8] { // 
      return true 
     } 
    } 
    return false 
} 
+0

"else if"に関する良いキャッチ! - 私はコードを見て、それを見ていない:) –

+0

コードは私にも同様に見えた。それから、 'checkWin(board:[1,0,0,0,1,0,0,0,1])'を試してみましたが、驚いたことに 'false'を返しました。これは良い単体テストケースのケースを作ります。 – vacawama

+0

私のためにあなたのコードは 'true'を返す – muescha

1

もう少しコンパクト:

func getWinner(board: [Int]) -> Int{ 

    let checks = [ 
     //rows 
     [0,1,2], 
     [3,4,5], 
     [6,7,8], 
     //columns 
     [0,3,6], 
     [1,4,7], 
     [2,5,8], 
     //cross 
     [0,4,8], 
     [2,4,6] 
    ] 

    for check in checks{ 
     if board[check[0]] != 0 
      && board[check[0]] == board[check[1]] 
      && board[check[1]] == board[check[2]] 
     { 
      return board[check[0]] 
     } 
    } 
    return 0 
} 

またはあなたがそれを置くしたい場合:

func checkWin(board: [Int]) -> Bool{ 

    let checks = [ 
     //rows 
     [0,1,2], 
     [3,4,5], 
     [6,7,8], 
     //columns 
     [0,3,6], 
     [1,4,7], 
     [2,5,8], 
     //cross 
     [0,4,8], 
     [2,4,6] 
    ] 

    for check in checks{ 
     if board[check[0]] != 0 
      && board[check[0]] == board[check[1]] 
      && board[check[1]] == board[check[2]] 
     {  
      return true 
     } 
    } 
    return false 
} 

良くもなし勝者のための勝者-IDまたは0を取得します列挙型:

enum Winner { 
    case none 
    case player(id: Int) 
} 

func checkWin(board: [Int]) -> Winner{ 

    let checks = [ 
     //rows 
     [0,1,2], 
     [3,4,5], 
     [6,7,8], 
     //columns 
     [0,3,6], 
     [1,4,7], 
     [2,5,8], 
     //cross 
     [0,4,8], 
     [2,4,6] 
    ] 

    for check in checks{ 
     if board[check[0]] != 0 
      && board[check[0]] == board[check[1]] 
      && board[check[1]] == board[check[2]] 
     { 
      return .player(id: board[check[0]]) 
     } 
    } 
    return .none 
} 
関連する問題