Массивы не ведут себя так, как ожидалось в Tic Tac Toe?

0

Я сделал тиктакту!...почти.

Код:

int main()
{
    //initialize
    char board[3][3] =
    {   '-','-','-',
        '-','-','-',
        '-','-','-'};
    bool gameOver = false;
    std::string playerTurn = "player 1";
    char chX, chY; //choice x and y
    int x = 1;

    //game loop
    do
    {
        std::cout << "\n\n\n\n\n\n\n\n\n\n";
        std::cout << "Input X, then Y.\np1 = X, p2 = O.";
        std::cout << "\n\nTurn: " << playerTurn;
        std::cout << "\n\n\n\n\n\n\n\n\n\n";
        std::cout << "+---+---+---+" << std::endl;
        std::cout << "| " << board[0][0] << " | " << board[0][1] << " | " << board[0][2] << " | " << std::endl;
        std::cout << "+---+---+---+" << std::endl;
        std::cout << "| " << board[1][0] << " | " << board[1][1] << " | " << board[1][2] << " | " << std::endl;
        std::cout << "+---+---+---+" << std::endl;
        std::cout << "| " << board[2][0] << " | " << board[2][1] << " | " << board[2][2] << " | " << std::endl;
        std::cout << "+---+---+---+" << std::endl;

        //get input and change board value
        std::cin >> chX;
        std::cin >> chY;
        if (playerTurn == "player 1")
            board[chX][chY] = 'X';
        else if (playerTurn == "player 2")
            board[chX][chY] = 'O';

        //change turns
        if (playerTurn == "player 1")
            playerTurn = "player 2";
        else if (playerTurn == "player 2")
            playerTurn = "player 1";

    } while (gameOver == false);
    return 0;
}

моя проблема:

//get input and change board value
std::cin >> chX;
std::cin >> chY;
if (playerTurn == "player 1")
    board[chX][chY] = 'X';
else if (playerTurn == "player 2")
    board[chX][chY] = 'O';

Этот кусок предназначен для изменения координат X и Y на X/O в зависимости от того, кто его превращает. Однако это не изменяет плату вообще и не возвращает ошибку. Также: board[0][0] = 't'; успешно изменит значение и напечатает t в месте [0][0].

Есть что-то, что мне не хватает? Может быть, проблема в другом месте кода? (Я извиняюсь заранее, если проблема слишком простая - возможно, у меня было слишком много кофе.)

  • 2
    @ s.bandara playerTurn - это std::string которую можно сравнить с литеральной строкой.
  • 0
    В целом, я бы рекомендовал не хранить информацию о поворотах игрока в виде string . Вы можете сделать это с меньшим, более простым типом данных.
Показать ещё 2 комментария
Теги:
arrays

3 ответа

3
Лучший ответ

Это всего лишь небольшая ошибка - вы определили chX и chY как char, и если пользователь вводит, например, "1", это код ASCII для "1", а не целочисленное значение 1.

Просто измените свою декларацию на

  int chX, chY;

и он должен работать.

  • 0
    Ба. Должен был поймать это. Благодарю вас!
  • 0
    Пожалуйста. Если это решит вашу проблему, попробуйте принять ответ.
Показать ещё 1 комментарий
0

Правильное изменение chY и chX от chars до ints вызывает то, как массивы индексируются.

Затем используйте это для кода ввода

std::cout << "Enter X corrdinate: ";
std::cin >> chX;
std::cout << "\n";
std::cin.clear();
std::cout << "Enter Y corrdinate: ";
std::cin >> chY;
std::cin.clear();
if (playerTurn == "player 1")
    board[chX][chY] = 'X';
else if (playerTurn == "player 2")
    board[chX][chY] = 'O';

Id также создает вторую массивную плату типа int, чтобы вы могли проверить, выиграл ли игрок

0
char chX,chY; // valid values -127..128
std::cin >> chX; //gets ascii code of '0', '1' or whichever value you enter
std::cin >> chY;

Проблема cin вернет код ascii символов, которые вы вводите; '0' = 48; Чтобы получить целочисленное значение, просто вычтите "0":

  std::cin >> chX; 
    std::cin >> chY;
    chX -= '0';
    chy -= '0';

Ещё вопросы

Сообщество Overcoder
Наверх
Меню