2016-12-03 3 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; 

Я работаю над своим Tic-Tac-Toe в C (с нестандартной доской, 5 необходимых в выигрыше). У меня это действительно-очень длинное «если», которое я хочу сделать короче. У меня также есть этот код 4 раза из-за строки, столбца, diag, antidiag, поэтому для этого требуется некоторое исправление.Кодирование кода Короче в C

+4

Это лучше подходит для [Обзор кода] (https://codereview.stackexchange.com). – Downvoter

+0

@ Downvoter no it is not, это не совсем полный пример. – enderland

+0

Повторяющаяся задача, такая как сложная проверка, обычно лучше выполняется с помощью выделенной функции;) – Blag

ответ

2

Moving часть кода в функции может быть полезным, что-то вроде этого:

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

Я попытался придумать лучший алгоритм, но безуспешно. Спасибо за ответ, это решает проблему, но это не так короче, потому что у каждого цикла есть разные пределы, поэтому я не могу использовать только один и поставить туда все свои функции. – GregX

+1

Это нормально, и, вероятно, стоит начать с решения грубой силы, которое проверяет всю доску, учитывая, что это небольшая доска. Одна очевидная оптимизация, которая приходит на ум, заключается в том, что вам нужно только проверить игру, выигранную после того, как игрок совершит переезд, а затем вам нужно будет только проверить пробелы, прилегающие к этой позиции (вверх, вниз, диаг), чтобы вам не приходилось проверить всю доску. – jarmod

+0

И что происходит, когда игрок ставит в угол, например. Как предотвратить чрезмерное индексирование? – GregX

Смежные вопросы