Ошибка в игре крестики-нолики

avatar
Elijah Garcia
8 апреля 2018 в 05:19
170
3
-1

У меня возникли проблемы с этим кодом C++ при создании программы, имитирующей игру в крестики-нолики. Игра проходит «нормально», отображает победителя, проверяет ввод и т. д., но если игрок «X» выигрывает, игроку «O» по-прежнему разрешается сделать еще один ход до объявления победителя.

do
{
    int turn = 0;

    if (turn % 2 == 0)
    {
        cout << "Player X, Row and Column: ";
        cin >> row >> column;

        while (array[(row-1)][(column-1)] != '*')
        {
            cout << "Invalid move try again \n";
            cout << "Player X, Row and Column: ";
            cin >> row >> column;
        }

        array[row-1][column-1] = 'X';
        showArray(array);
        results = checkWin(array);
    }

    if (turn % 2 != 0)
    {
        cout << "Player O, Row and Column: ";
        cin >> row >> column;

        while (array[row-1][column-1] != '*')
        {
            cout << "Invalid move try again \n";
            cout << "Player O, Row and Column: ";
            cin >> row >> column;
        }
        array[row-1][column-1] = 'O';
        showArray(array);
        results = checkWin(array);
    }
    turn++;
}while (results == 0);

Я использую цикл do-while, который поочередно переключает двух игроков. Когда я помещаю увеличивающийся 'turn++;' вне обоих блоков if, программа позволяет двигаться только игроку «X». Когда я помещаю 'turn++;' оператор внутри плеера 'X' if block, он чередуется, но я сталкиваюсь с проблемой, описанной выше. Если у вас есть какие-либо предложения, пожалуйста, дайте их. Спасибо.

Источник
Atul Kumar
8 апреля 2018 в 05:24
0

Где условие розыгрыша?

Code-Apprentice
8 апреля 2018 в 05:32
0

Прочтите ericlippert.com/2014/03/05/how-to-debug-small-programs, чтобы получить несколько советов по отладке вашей программы.

Ответы (3)

avatar
Ash
8 апреля 2018 в 05:28
0

Каждый раз, когда ваш цикл выполняет итерацию, значение хода инициализируется равным 0, поэтому каждый раз, когда игрок 'X' получает шанс.

Поэтому поместите int turn = 0 вне цикла.

avatar
Jaskirat Singh
8 апреля 2018 в 05:26
0

Как сказал @hai_uit, переместите int turn = 0; из цикла. В большинстве случаев рекомендуется объявлять все переменные вне любых циклов или операторов if.

Elijah Garcia
8 апреля 2018 в 05:31
0

Спасибо! Да, я вижу, где переменная индекса/счетчика сбрасывается после каждого цикла.

avatar
Hai Hoang
8 апреля 2018 в 05:22
0

Удалите int turn = 0; из цикла. например:

int turn = 0;
do {
    doSomeThing();
    turn++;
} while(someThingHappen());

Если вы поместите int turn = 0 внутри цикла, каждый цикл будет начинаться с turn = 0