2016-12-03 29 views
1
for (c = 0; c < SIZE-4; ++c) 
    for (r = 0; r < SIZE; ++r) 
     if (board[r][c] == cross && board[r][c+1] == cross && board[r][c+2] == cross && board[r][c+3] == cross && board[r][c+4] == cross) 
      return true; 

我對我的井字棋在C工作(自定義尺寸板,5需要連續贏)。我有這真的很長的'如果',我想縮短。我也有這個代碼4次,因爲行,列,diag,antidiag,所以它需要一些修復。使我的代碼用C短

+4

這更適合[Code Review](https://codereview.stackexchange.com)。 – Downvoter

+0

@Downvoter不,這不是一個完整的例子。 – enderland

+0

複雜檢查等複雜任務通常可以通過專用功能更好地完成;) – Blag

回答

2

移動一些代碼到一個功能可能是有益的,是這樣的:

bool rowHasNCrosses(int board[][SIZE], int r, int c, int n) { 
    for (int i = 0; i < n; i++) { 
    if (((c + i) >= SIZE) || (board[r][c+i] != cross)) return false; 
    } 
    return true; 
} 

for (int c = 0; c < SIZE - 4; ++c) { 
    for (int r = 0; r < SIZE; ++r) { 
    if (rowHasNCrosses(board, r, c, 5)) return true; 
    } 
} 

然後,您可以做列和對角線的測試類似的事情。不過,我懷疑是否有比這更有效的算法來確定遊戲是否獲勝。

+0

我試圖想到一個更好的算法,但沒有任何成功。 感謝您解答這個問題的答案,但這並不是那麼短,因爲每個for循環都有不同的限制,所以我不能只使用一個,並將所有功能都放在那裏。 – GregX

+1

這很好,並且可能會開始使用強力解決方案來檢查整個主板,因爲它是一塊小板。該彈簧想到一個明顯的優化是,你只需要測試遊戲贏得玩家走棋後,然後你只需要測試相鄰的那個位置(上,下,診斷)的空間,所以你不必測試整個板子。 – jarmod

+0

當玩家放入角落時會發生什麼情況。我怎樣才能防止過度索引? – GregX