2015-12-16 1 views
0

Я пишу эту программу tic tac toe, используя классы. Я написал эту функцию под названием makeAMove(). Эта функция должна проверять ход игрока, но продолжает показывать, что это недействительный ход, и он просит игрока снова войти. Вероятно, есть несколько логических ошибок, но я их просто не вижу. Может ли кто-нибудь помочь? Это класс, который использует объект с именем Cell board[ROW][COL] и еще один объект с именем Player players[2]. Маркерами являются либо X, либо O, а iVal - это начальное значение платы (каждая ячейка на плате имеет номер от 1 до 9). Здесь приведены winGame() и switchPlayer() для справки. Хотя я думаю, что моя функция winGame() в порядке, я знаю, что могу сделать это, используя суммы. Другими словами, каждая ячейка имеет внутренний маркер, такой как -1 или 1, и если сумма строк, столбцов и т. Д. Составляет -3 или 3, внутренний маркер, соответствующий игроку, выдает победителя. Если у вас есть представление о том, как это сделать, не стесняйтесь делиться, в противном случае, мой winGam e в порядке.Tic Tac Toe Trouble (некоторые логические ошибки)

int TicTacToe::switchPlayer(){ 
     if (currentPlayer == 0) 
       currentPlayer = 1; 
     else if (currentPlayer == 1) 
       currentPlayer = 0; 

     return (currentPlayer); 
} 
// 
//method to make a move 
// 
void TicTacToe::makeAMove(){ 
     char move; 
     int turns = 1; 
     do{ 
       cout << "Player " << (getCurrentPlayer() + 1) << " make a move." << endl; 
       cin >> move; 
       for (int i = 0; i < ROW; i++){ 
         for (int j = 0; j < COL; j++){ 
           //This is where my problem begins 
           if (board[i][j].getiVal() == move){ 
             board[i][j].setiVal(players[currentPlayer].getMarker()); 
             DrawBoard(); 
             switchPlayer(); 
             turns++; 
           } 

           else if (board[i][j].getiVal() == 'X' || board[i][j].getiVal() == 'O'){ 
             cout << "Invalid move, please reenter. " << endl; 
             cin >> move; 
           }//the else if statement always outputs:x 
         } 
       } 
     } while (turns <= 9 || !winGame()); 
     cout << "Congratulations " << (getCurrentPlayer() + 1) << "you won the game!" << endl; 
} 
bool TicTacToe::winGame(){ 
     bool validate = false; 
     int k = 0; 
     for (int i = 0; i < ROW; i++){ 
       //check column wins 
       if (board[0][i].getMarker() == board[1][i].getMarker() && board[1][i].getMarker() == board[2][i].getMarker()){ 
         players[currentPlayer].setNumWin(k++); 
         validate = true; 
         break; 
       } 
       //check row wins 
       else if (board[i][0].getMarker() == board[i][1].getMarker() && board[i][1].getMarker() == board[i][2].getMarker()){ 
         players[currentPlayer].setNumWin(k++); 
         validate = true; 
         break; 
       } 
     } 

     if(board[0][0].getMarker() == board[1][1].getMarker() && board[1][1].getMarker() == board[2][2].getMarker()){ 
       players[currentPlayer].setNumWin(k++); 
       validate = true; 
     } 
     else if (board[0][2].getMarker() == board[1][1].getMarker() && board[1][1].getMarker() == board[2][0].getMarker()){ 
       players[currentPlayer].setNumWin(k++); 
       validate = true; 
     } 

     return (validate); 
} 

Это пример запуска программы

+--+--+--+ 
    |1 |2 |3 | 
    +--+--+--+ 
    |4 |5 |6 | 
    +--+--+--+ 
    |7 |8 |9 | 
    +--+--+--+ 
    Player 1 make a move. 
    1 

    +--+--+--+ 
    |O |2 |3 | 
    +--+--+--+ 
    |4 |5 |6 | 
    +--+--+--+ 
    |7 |8 |9 | 
    +--+--+--+ 
    Player 2 make a move. 
    5 
    Invalid move, please reenter. 
    6 

    +--+--+--+ 
    |O |2 |3 | 
    +--+--+--+ 
    |4 |5 |X | 
    +--+--+--+ 
    |7 |8 |9 | 
    +--+--+--+ 
    Player 1 make a move. 

ответ

1

Логическая ошибка здесь может быть сведена к следующему:

for (int i = 0; i < ROW; i++){ 
    for (int j = 0; j < COL; j++){ 
     if (board[i][j].getiVal() == move){ 

       // Not important what happens here 
     } 
    else if (board[i][j].getiVal() == 'X' || board[i][j].getiVal() == 'O'){ 
       cout << "Invalid move, please reenter. " << endl; 

       // Not important what happens here 
    } 

Логическая ошибка может быть идентифицирована здесь с помощью " Rubber Duck "для отладки.

Подход «Резиновая утка» для отладки предполагает использование резиновой утки, которая плавает в ванной, помещая ее рядом с экраном монитора, а затем пытается объяснить резиновой утке, что делает ваш код, и вы продолжаете объяснять, пока не выясните проблему самостоятельно.

Здесь вы начнете с объяснения своей резиновой утки, что ваш код будет сканировать матрицу tic-tac-toe, строку за раз и колонку за раз, начиная с верхнего левого угла , и заканчивается в правом нижнем углу. Вот что здесь делают вложенные петли.

Резиновая утка согласна, и вы продолжите объяснение этого кода.

Теперь вы рассказать свою резиновую утку, что ваш код будет держать сканирования крестики-нолики борту, пока не увидит либо move или X или O в текущем положении это сканирование. Если он видит X или O, ваш код будет жаловаться на то, что перемещение недействительно.

Поэтому, если первая ячейка, ячейка в верхнем левом углу, содержит «X» или «O», этот код увидит ее на первой итерации во внутреннем цикле и сообщит об ошибке, независимо от того, что еще содержится в остальной части тик-таковой матрицы.

На этом этапе вы успешно идентифицировали логическую ошибку здесь, используя подход Rubber Duck для отладки.

+0

Большое спасибо за ваш ответ! Я просто немного смущен относительно того, как настроить настройку своих X и O –

+1

Если вы понимаете, что такое логическая проблема, тогда решение должно быть очевидным. Подсказка: если следующий шаг для ячейки #n, где n - от 1 до 9, то следующее перемещение для строки (n-1)/3, столбец (n-1)% 3. Попробуйте эту математику самостоятельно, чтобы проверить это разрушающее землю открытие (когда n = 6, например, это происходит в строке (6-1)/3 = 1, столбец (6-1)% 3 = 2), затем попробуйте выясните, почему математика работает так. Остальное должно быть очевидно. Вложенные для циклов вообще не нужны. –

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

  • Нет связанных вопросов^_^