2017-03-17 48 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條件得到滿足。我已經注意到他們都是分享董事會[8],但是我知道這不是故事板的問題,就好像我硬編碼贏得滿足其中一個錯誤條件的勝利仍然不起作用。任何人都可以看到發生了什麼問題?

+0

三個外部'if'語句有什麼意義?每個「板子」條目都有哪些值? – rmaddy

+0

我猜'0'是空白的,'1'是玩家1,'2'是玩家2.所以外面的ifs在那裏是爲了防止識別連續的3個空白空間作爲勝利。 – vacawama

+0

如果你完成一個遊戲並打印板陣列,它是否反映了遊戲結束狀態? – Magnas

回答

2

你的邏輯是有缺陷的。一旦你檢查了外部if,你已經承諾只檢查一些可能的情況。

舉例來說,如果空間0不爲空,那麼你只檢查情況0-1-20-3-6,但你不檢查0-4-8那麼你會錯過這種可能性。 0-4-8案件在第一個else if案件中處理,但如果board[0] != 0您永遠不會到達那裏。

您可以使用3 if s而不是else 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

有關「其他」的好消息! - 我盯着代碼,並沒有看到它:) –

+0

代碼看起來也對我。然後我嘗試了'checkWin(board:[1,0,0,0,1,0,0,0,1])',並且我驚訝地返回了'false'。這使得單元測試用例很好。 – vacawama

+0

對我來說你的代碼返回'true' – muescha

1

一點點更緊湊:

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:

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 
} 

,或者如果你喜歡把它放在一個枚舉:

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 
}