2013-03-18 2 views
0

Я создаю игру tic tac toe как проект с 2-мерным массивом, и у меня возникают некоторые проблемы с проверкой пятен, чтобы увидеть, есть ли победитель. Может кто-нибудь помочь мне отладить это? Вот функция checkwinner и основная функция.Как проверить 2 размерного массива для победителя в игре tic tac toe

char CheckWinner(char board[3][3]) 
{ 
    int i = 0; 
    int j = 0; 

        if (board[i][j] =='X' && board[i][j+1] == 'X' && board[i][j+2]== 'X') 
        { W = X;} 
        else if (board[i+1][j] && board[i+1][i+1] && board[i+1][j+2]== 'X') 
        { W = X;} 
        else if (board[i+2][j] && board[i+2][j+1] && board[i+2][j+2]== 'X') 
        { W = X;} 
        else if (board[i][j] && board[i+1][j] && board[i+2][j]== 'X') 
        { W = X;} 
        else if (board[i][j+1] && board[i+1][j+1] && board[i+2][j+1]== 'X') 
        { W = X;} 
        else if (board[i][j+2] && board[i+1][j+2] && board[i+2][j+2]== 'X') 
        { W =X;} 
        else if (board[i][j] && board[i+1][j+1] && board[i+2][j+2]=='X') 
        { W = X;} 
        else if (board[i+2][j] && board[i+1][j+1] && board[i][j+2]== 'X') 
        { W = X;} 

        else if (board[i][j] && board[i][j+1] && board[i][j+2]== 'O') 
        { W = O;} 
        else if (board[i+1][j] && board[i+1][j+1] && board[i+1][j+2]== 'O') 
        { W = O;} 
        else if (board[i+2][j] && board[i+2][j+1] && board[i+2][j+2]== 'O') 
        { W = O;} 
        else if (board[i][j] && board[i+1][j] && board[i+2][j]== 'O') 
        { W = O;} 
        else if (board[i][j+1] && board[i+1][j+1] && board[i+2][j+1]== 'O') 
        { W = O;} 
        else if (board[i][j+2] && board[i+1][j+2] && board[i+2][j+2]== 'O') 
        { W = O;} 
        else if (board[i][j] && board[i+1][j+1] && board[i+2][j+2]== 'O') 
        { W = O;} 
        else if (board[i+2][j] && board[i+1][j+1] && board[i][j+2]== 'O') 
        { W = O;} 



    return W; 
} 
int main() 
{ 
    char board[3][3]; 
    char Win = CheckWinner(board); 
    int r = 0; 


    InitializeBoard(board); 

    for (int r = 0; r < 4 ; r++) 
    { 
     PlayX(board); 
     PlayO(board); 
     PrintBoard(board); 
    } 
    CheckWinner(board); 
    cout << Win ; 

    if (Win == X) 
    { 
     cout << "The winner is Player 1."; 
    } 
    else if (Win == O) 
    { 
     cout << "The winner is Player 2."; 
    } 
    else if (Win == TIE) 
    { 
     cout << " IT'S A TIE"; 
    } 
    else; 


    system("PAUSE"); 
return 0; 
+2

Отладка, что именно? Какая ошибка/ошибка, которую вы получаете? – Tushar

+1

Пожалуйста, укажите точное сообщение об ошибке. – rana

+0

Хорошо, я остановил сообщение об ошибке. Это была тривиальная опечатка выше в другой функции. Корри. –

ответ

1

Вы сразу же назначить CheckWinner результат Win, а затем играть в игру из, а затем вызвать CheckWinner снова, не назначая ее результат Win. Таким образом, когда вы проверяете Win в следующей строке, у вас есть исходный результат, когда плата даже не была инициализирована.

+0

Это предположительно, чтобы проверить 8 различных способов, которыми вы можете выиграть для x и o. –

+0

Ответ, который заканчивается вопросом? Должен ли это быть комментарий? – Shoe

+0

Не обращайте внимания. Ваше первое предложение заставляет меня чувствовать себя таким глупым, я должен был это осознать раньше. Это заставляет мою игру работать, поэтому все было правильно, я просто не назначил Win CheckWinner в правильном месте. Спасибо. –

0

Возможно, это связано с назначением буквального О или X в возвращаемое значение, которое должно быть символом. Таким образом, вместо O или X это должно быть «O» или «X». Если O или X не определены как переменная char вне опубликованного кода.

+0

const char X = 'X' и const char O = 'O' Я пробовал это в обоих направлениях. –

3

Вы можете оптимизировать условный код следующим:

typedef char piece; 

piece iswin() const 
{ 
    piece ret = 'T'; 

    // Checks for horizontal win 
    for (int i = 0; i < 3; ++i) 
     if (*arr[i] == arr[i][1] && arr[i][1] == arr[i][2]) 
      if ((ret = *arr[i]) != 'T') 
       return ret; 

    // Checks for vertical win 
    for (int i = 0; i < 3; ++i) 
     if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i]) 
      if ((ret = arr[0][i]) != 'T') 
       return ret; 

    // Check for diagonal win (upper left to bottom right) 
    if (**arr == arr[1][1] && arr[1][1] == arr[2][2]) 
     if ((ret = **arr) != 'T') 
      return ret; 

    // Check for diagonal win (upper right to bottom left) 
    if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0]) 
     if ((ret = arr[0][2]) != 'T') 
      return ret; 

    return ret; 
} 

// checking the result: 
switch (winner) { 
    case 'T': /* tie */ break; 
    case 'X': /* X won */ break; 
    case 'O': /* O won */ break; 
} 

Это немного чище. И это делает 6 петель вместо 9.

+0

по какой-то причине это не работает слишком хорошо. –

+0

-1, для использования двойного сравнения x == y == z неверно – 2013-04-15 16:42:23

+1

@Armin, да спасибо. Исправлена. Я, должно быть, был пьян, когда написал это. – Shoe

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