2017-10-16 8 views
-8

少しTicTacToeをコーディングしています。今私は「isRow()」関数でだと私は以下のコードで非常に奇妙なバグを得た:tic-tac-toeロジックのデバッグ

:私のゲームの配列は次のようになりますときに私はhasWon()関数を呼び出すとき今

var game = [0, 0, 0, 0, 0, 0, 0, 0, 0] 
let winPatterns = [[0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 3, 6], [1, 4, 7], [2, 5, 8], [0, 4, 8], [2, 4, 6]] 

func hasWon() -> Int 
{ 
    for pattern in winPatterns { 
     if (game[pattern[0]] != 0 && game[pattern[0]] == game[pattern[1]] && game[pattern[1]] == game[pattern[2]]) { 
      if (game[pattern[0]] == 1) { 
       return(1) 
      } 
      else { 
       return(2) 
      } 
     } 
     else if (!game.contains(0)) { 
      return(0) 
     } 
    } 

    return(-1) 
} 

[1, 2, 1, 1, 2, 2, 1, 1, 2]

マイhasWon()機能が0を返しますが、私はしばらくの間、この問題を解決しようとした後、それは1 を返す必要があり、私はこれに私のコードを変更:

func hasWon() -> Int 
{ 
    for pattern in winPatterns { 
     if (game[pattern[0]] != 0) { 
      if (game[pattern[0]] == game[pattern[1]]) { 
       if (game[pattern[1]] == game[pattern[2]]) { 
        if (game[pattern[0]] == 1) { 
         return(1) 
        } 
        else { 
         return(2) 
        } 
       } 
      } 
     } 
     else if (!game.contains(0)) { 
      return(0) 
     } 
    } 

ゲーム配列が上記のように見える場合は、0を返しました。

[1, 2, 1, 1, 2, 1, 2, 1, 2] 
+0

、私は_時間 – UnknownProgrammer

+3

に戻ってきます「の質問の場合、私は時間に戻ってきます」_ - それをしないでください。 [ask]で説明したように、解説を求めるコメントにはしばらくお待ちください。 – CodeCaster

+1

コードをデバッグしましたか?ブレークポイントを設定します。関数をシングルステップ実行します。変数を調べます。どの時点であなたのコードはあなたが期待するものではありませんか? –

答えて

-1

問題はこの部分である:

else if (!game.contains(0)) { 
    return(0) 
} 

else部分がで条件を否定されて、私の配列は次のようになります。しかし、もし私のコードは次のようになりますときには、代わりに0の何も返しません

「パターンで記述された行、列、または対角線に3つの非0がある場合」と記載されています。

だからあなたelse ifは、基本的な「3つの非0が連続して存在する場合、列、または斜めのパターンで記述し、ボード任意の0が含まれていません」と言っています。

else ifでは、0を返します。これはドローを意味します。

これは理にかなっているようですが、ここですべてのパターンをループしていることを忘れないでください! 1つのパターンに3つの1または2が連続していない場合、ボードが塗りつぶされていても必ずしも描画である必要はありません。

すべてのパターンを最初に確認し、パターンが1つまたは2つ連続していない場合は、ボードがいっぱいになっているかどうかを確認します。質問の場合は

func hasWon() -> Int 
{ 
    for pattern in winPatterns { 
     if (game[pattern[0]] != 0 && game[pattern[0]] == game[pattern[1]] && game[pattern[1]] == game[pattern[2]]) { 
      if (game[pattern[0]] == 1) { 
       return(1) 
      } 
      else { 
       return(2) 
      } 
     } 
    } 

    if (!game.contains(0)) { // note that I moved this out of the loop. 
     return(0) 
    } 

    return(-1) 
} 
+0

この素晴らしいアンサースイーパーのおかげで、私のコードは今とてもうまく動作します:)!そして、私の遅い応答には申し訳ありません。 – UnknownProgrammer