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