2015-08-11 5 views
-4

Это моя функция «getWin» в моей игре на tic-tac-toe на консоли C++. Он отлично работает в рамках этой простой программы, но просто из любопытства, что является более коротким/более эффективным способом написания функции, которая возвращает победителя (если таковой имеется) в игру с tic tac toe?C++ - Самая короткая функция проверки выигрышей для tic-tac-toe?

примечания - winArg является либо «X», либо «O», в зависимости от того, на каком проигрывателе вы тестируете. top_left, middle_center и т. д. перечислены типы. конечный оператор return, return 'n' ;, для тех случаев, когда еще нет победителя.

char getWin(char winArg) 
{ 
    if (board[top_left] == winArg) 
    { 
     if (board[top_center] == winArg) 
     { 
      if (board[top_right] == winArg) 
       return winArg; 
     } 
     if (board[middle_center] == winArg) 
     { 
      if (board[bottom_right] == winArg) 
       return winArg; 
     } 
     if (board[middle_left] == winArg) 
     { 
      if (board[bottom_left] == winArg) 
       return winArg; 
     } 
    } 
    if (board[top_right] == winArg) 
    { 
     if (board[middle_center] == winArg) 
     { 
      if (board[bottom_left] == winArg) 
       return winArg; 
     } 
     if (board[middle_right] == winArg) 
     { 
      if (board[bottom_right] == winArg) 
       return winArg; 
     } 
    } 
    if (board[bottom_right] == winArg) 
    { 
     if (board[bottom_center] == winArg) 
     { 
      if (board[bottom_left] == winArg) 
       return winArg; 
     } 
    } 
    //middle vertical and horizontal lines 
    if (board[top_center] == winArg && board[middle_center] == winArg && board[bottom_center] == winArg) 
    { 
     return winArg; 
    } 
    else if (board[middle_right] == winArg && board[middle_center] == winArg && board[middle_left] == winArg) 
    { 
     return winArg; 
    } 

    return 'n'; 
} 
+1

* «есть более короткий/более эффективный способ» * Там почти всегда есть для любой нетривиальной программы. –

+1

Кажется, что вы вручную пишете все возможные случаи ... –

+0

whoops ... теперь он говорит «что является более коротким/более эффективным способом». lol – Nikita

ответ

2

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

char lineWin(int a, int b, int c) { 
    if (board[a] == ' ')  return 'n'; 
    if (board[a] != board[b]) return 'n'; 
    if (board[b] != board[c]) return 'n'; 
    return board[a]; 
} 

Затем вы можете привести в порядок свой полный проверочный код что-то вроде :

char getWinner(void) { 
    char wnr; 

    // Horizontal lines. 

    if ((wnr = lineWin(top_left, top_center, top_right )) != 'n') return wnr; 
    if ((wnr = lineWin(middle_left, middle_center, middle_right)) != 'n') return wnr; 
    if ((wnr = lineWin(bottom_left, bottom_center, bottom_right)) != 'n') return wnr; 

    // Vertical lines. 

    if ((wnr = lineWin(top_left, middle_left, bottom_left )) != 'n') return wnr; 
    if ((wnr = lineWin(top_center, middle_center, bottom_center)) != 'n') return wnr; 
    if ((wnr = lineWin(top_right, middle_right, bottom_right)) != 'n') return wnr; 

    // Diagonal lines. 

    if ((wnr = lineWin(top_left, middle_center, bottom_right )) != 'n') return wnr; 
    if ((wnr = lineWin(top_right, middle_center, bottom_left )) != 'n') return wnr; 

    return 'n'; 
} 

Теперь имейте в виду, что это решение предназначено для игры 3x3 Tic-Tac-Toe. Если это все, что вы делаете, то это идеально и гораздо более подходит, чем алгоритмическое решение, которое для каждой ячейки проверяет восемь разных направлений для выигрыша, ограничивая проверку края доски.

Если вы собираетесь создать что-то для Connect-Four/Four-in-a-row или любой другой игры, у которой есть нетривиальное количество способов выиграть, тогда ваш подход должен быть другим. Хотя даже для этого вам еще не нужно переходить за борт с проверкой в ​​каждом направлении от каждой ячейки, вы все равно можете использовать a relatively simple algorithm.

+0

Да, конечно, это более читаемо. Я сохраню формулы для больших досок для отдельного вопроса, тогда XD – Nikita

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