Я на начальной стадии создания игры в крестики-нолики на C ++, и для того, чтобы разместить «кусочки» на доске, я использую оператор switch. Внутри коммутатора есть операторы if-else, чтобы проверить, занято ли запрошенное пространство. Однако всякий раз, когда я вводю спот, он выполняет оператор if (помещает кусок), а затем также выполняет оператор else (говорит: «Попробуй еще раз» и заставляет игрока повторить свой ход).
Я пытался переместить оператор 'break' перед оператором else и внутри if, но, похоже, он создает больше ошибок, чем исправляет. Я также попытался явно кодировать операторы else-if вместо просто else, но это тоже не сработало.
Включить заявление:
bool place_pieces(int input, bool turn)
{
bool occupied{ false };
switch (input) {
case 7:
if (board[0][0] != 'x' && board[0][0] != 'o') {
if (turn == true)
board[0][0] = 'x';
else
board[0][0] = 'o';
}
else if (board[0][0] == 'x' || board[0][0] == 'o') {
occupied = true;
cout << "Try again" << endl;
}
break;
case 8:
if (board[0][1] != 'x' && board [0][1] != 'o') {
if (turn == true)
board[0][1] = 'x';
else
board[0][1] = 'o';
}
else if (board[0][1] == 'x' || board[0][1] == 'o') {
occupied = true;
cout << "Try again" << endl;
}
break;
case 9:
if (board[0][2] != 'x' && board[0][2] != 'o') {
if (turn == true)
board[0][2] = 'x';
else
board[0][2] = 'o';
}
else if (board[0][2] == 'x' || board[0][2] == 'o') {
occupied = true;
cout << "Try again" << endl;
}
break;
case 4:
if (board[1][0] != 'x' && board[1][0] != 'o') {
if (turn == true)
board[1][0] = 'x';
else
board[1][0] = 'o';
}
else if (board[1][0] == 'x' || board[1][0] == 'o') {
occupied = true;
cout << "Try again" << endl;
}
break;
case 5:
if (board[1][1] != 'x' && board[1][1] != 'o') {
if (turn == true)
board[1][1] = 'x';
else
board[1][1] = 'o';
}
else if (board[1][1] == 'x' || board[1][1] == 'o') {
occupied = true;
cout << "Try again" << endl;
}
break;
case 6:
if (board[1][2] != 'x' && board[1][2] != 'o') {
if (turn == true)
board[1][2] = 'x';
else
board[1][2] = 'o';
}
else if (board[1][2] == 'x' || board[1][2] == 'o') {
occupied = true;
cout << "Try again" << endl;
}
break;
case 1:
if (board[2][0] != 'x' && board[2][0] != 'o') {
if (turn == true)
board[2][0] = 'x';
else
board[2][0] = 'o';
}
else if (board[2][0] == 'x' || board[2][0] == 'o') {
occupied = true;
cout << "Try again" << endl;
}
break;
case 2:
if (board[2][1] != 'x' && board[2][1] != 'o') {
if (turn == true)
board[2][1] = 'x';
else
board[2][1] = 'o';
}
else if (board[2][1] == 'x' || board[2][1] == 'o') {
occupied = true;
cout << "Try again" << endl;
}
break;
case 3:
if (board[2][2] != 'x' && board[2][2] != 'o') {
if (turn == true)
board[2][2] = 'x';
else
board[2][2] = 'o';
}
else if (board[2][2] == 'x' || board[2][2] == 'o') {
occupied = true;
cout << "Try again" << endl;
}
break;
}
return occupied;
}
Игровой цикл:
while (!game_over) {
x_turn = true;
cout << "Player 1: ";
cin >> player_input;
place_pieces(player_input, x_turn);
if (place_pieces(player_input, x_turn) == true) {
draw_board();
cout << endl;
continue;
}
else {
draw_board();
cout << endl;
}
x_turn = false;
cout << "Player 2: ";
cin >> player_input;
place_pieces(player_input, x_turn);
if (place_pieces(player_input, x_turn) == true) {
draw_board();
cout << endl;
continue;
}
else {
draw_board();
cout << endl;
}
}
Я хочу, чтобы он просто отображал новую доску с добавленной фигурой, а не говорил «Попробуй еще раз», или чтобы игрок повторил свой ход.