Программа на C ++, ошибка преобразования целочисленного ввода в тип char - PullRequest
0 голосов
/ 16 мая 2018

В настоящее время я делаю очень простую программу tictactoe, но у меня возникла небольшая проблема.Я создал игровую доску с использованием двумерного массива символов (не сумасшедший поклонник использования символов для этого, но подумал, что это был самый простой способ, позволяющий мне вводить X и O в массив для вывода на экран).

В функции PlayerOneMove () я предлагаю пользователю ввести ячейку (1-9), где он хотел бы разместить свою игровую фигуру.Ввод сохраняется в виде символа.Затем я передаю его выбор ячейки функции MakeMove (), которая проверяет, хранится ли введенный пользователем символ в массиве.Однако функция всегда возвращает false.

Я понимаю, что это проблема с компилятором, который видит входные данные как целое число и не соответствует символу в массиве (потому что если я заменю элементы в массиве набуквы, а затем введите букву, она находит совпадение), но я не уверен, как решить эту проблему.Я попытался добавить значение ASCII к символу и изменить ввод char на целочисленный ввод, а затем статическое приведение его к char безрезультатно.Буду признателен за любую помощь, прежде чем я решу полностью уничтожить массив символов !!

class TicTacToe {
    private: 
    char board[3][3] =
        {
            {'1','2','3'},
            {'4','5','6'},
            {'7','8','9'}
        };
    public:
    void DrawBoard();
    void PlayerOneMove();
    bool MakePlay(char, char);
};

void TicTacToe::PlayerOneMove() {
    char cell;
    cout << "Player One, please select a cell: ";
    cin >> cell;

    while (!MakePlay(cell, 'O')) {
        cout << "That cell is unavailable. Please select another cell: ";
        cin >> cell;
    }
}

bool TicTacToe::MakePlay(char cell, char player) {
    for (int row = 0; row < 3; row++) {
        for (int col = 0; col < 3; col++) {
            if (board[row][col] == cell) {
                board[row][col] = player;
                return true;
            }
            else return false;
        }
    }
}

int main() {
    TicTacToe game;
    game.DrawBoard();
    game.PlayerOneMove();

    return 0;
}

пример: https://imgur.com/a/1XZK6Wa

1 Ответ

0 голосов
/ 16 мая 2018

У вас есть логическая ошибка в MakePlay.

Когда вы вводите вложенные циклы for, он проверит, соответствует ли вход первой ячейке, если нет, он вернет false.Остальные ячейки никогда не будут проверены.

Что вы хотите сделать, это проверить все ячейки, если они не соответствуют ни одной из них, затем вернуть false.

Вы можете переписатьэто так:

bool TicTacToe::MakePlay(char cell, char player) {
    bool found_cell = false;
    for (int row = 0; row < 3; row++) {
        for (int col = 0; col < 3; col++) {
            if (board[row][col] == cell) {
                board[row][col] = player;
                found_cell = true;
            }
        }
    }
    return found_cell;
}
...