Операторы if-else, вложенные в оператор switch, всегда выводят оператор else - PullRequest
0 голосов
/ 06 июля 2019

Я на начальной стадии создания игры в крестики-нолики на 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;
        }
    }

Я хочу, чтобы он просто отображал новую доску с добавленной фигурой, а не говорил «Попробуй еще раз», или чтобы игрок повторил свой ход.

1 Ответ

0 голосов
/ 06 июля 2019

Вы даже можете найти проблему без отладки.Обзор показывает, что вы делаете

        place_pieces(player_input, x_turn);
        if (place_pieces(player_input, x_turn) == true) {

Итак, вы сначала помещаете фрагмент, а затем, в операторе if, снова вызываете функцию.И только в операторе if вы проверяете возвращаемое значение.

Если вы вызываете свою функцию 2 раза с одним и тем же параметром, то во 2-й раз место всегда будет занято.

Ваше недоразумение заключается в том, что вы думаете, что в операторе if будет проверено только возвращаемое значение.Но это неправда.Функция будет вызвана снова.

Это так называемый побочный эффект.Вы не должны вызывать функции в операторах if или других логических выражениях.

Решение легко.Объявите переменную bool, получите результат, а затем проверьте bool в if:

        bool result = place_pieces(player_input, x_turn);
        if (result) {

Надеюсь, это поможет.,.

...