2017-10-16 73 views
-8

我正在編寫一個小TicTacToe。現在,我在「isRow()」功能,我得到了下面的代碼很奇怪的錯誤:調試井字棋邏輯

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) 
} 

現在,當我打電話hasWon()功能時,我的遊戲陣列看起來像這樣:

[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以防遊戲數組看起來像上面那樣。但是,當我的代碼看起來像它這樣做的,如果我的陣列看起來像這樣返回任何東西,而不是0

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

如有問題,我會在一小時後回來 – UnknownProgrammer

+3

_「如有問題,我會回來一小時」 _ - 不這樣做。正如[問]中所解釋的,留待一段時間回答要求澄清的意見。 – CodeCaster

+1

您*調試了您的代碼嗎?設置一個斷點。單步執行功能。檢查變量。你的代碼在什麼時候不是你所期望的? –

回答

-1

問題是這樣的部分:

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

else部分被否定的情況第一個if語句,這就是:

game[pattern[0]] != 0 && 
    game[pattern[0]] == game[pattern[1]] && 
    game[pattern[1]] == game[pattern[2]] 

它說「是否存在由模式描述的三個非0的行,列或對角線」。

所以你else if是基本的說法「是否存在由圖案主板不包含任何0描述的三種非0的行,列或對角線」。

else if中,您返回0,我認爲這意味着平局。

從表面上看,這似乎是有道理的,但不要忘記,你正在循環所有的模式在這裏!如果一個圖案連續不包含三個1或2,並且該板被填滿,則它不一定是平局。

您需要先完成檢查全部模式,如果沒有模式連續有3個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