Игра Tic Tac Toe не будет работать

0

Так что я узнал о программировании неделю назад. Я решил сделать игру tic tac toe в качестве хобби проекта, у меня есть рудиментарный метод ввода игры и работает, но один аспект не работает. Я сделал очень упрощенную часть кода, чтобы проверить, выиграл ли кто-нибудь, когда было сыграно 5 ходов. Когда-то кто-то побеждает, он должен отображать "Game Over!". но это не по какой-то причине. Может ли кто-нибудь помочь? _____________ Примечание. Метод проверки того, выиграл ли кто-то еще, не является полным в коде. Это только для строк, потому что, когда я тестировал его, он не работал.

#include <iostream>
#include <cstdlib>

using namespace std;
int main()
{
    char grid[3][3];
    int p;
    cout << "Enter column number. \n";
    cin >> p;
    int o;
    cout << "Enter row number. \n";
    cin >> o;
    for (int y = 0; y < 3; y++)
    {
        for (int x = 0; x < 3; x++)
        {
            grid[x][y] = '-';
            grid[o][p] = 'X';
            cout << grid[x][y] << " ";
        }
        cout << endl;
    }
    int q;
    cout << "Enter column number. \n";
    cin >> q;
    int r;
    cout << "Enter row number. \n";
    cin >> r;
    for (int y = 0; y < 3; y++)
    {
        for (int x = 0; x < 3; x++)
        {
            grid[x][y] = '-';
            grid[o][p] = 'X';
            grid[r][q] = 'O';
            cout << grid[x][y] << " ";
        }
        cout << endl;
    }
    int s;
    cout << "Enter column number. \n";
    cin >> s;
    int t;
    cout << "Enter row number. \n";
    cin >> t;
    for (int y = 0; y < 3; y++)
    {
        for (int x = 0; x < 3; x++)
        {
            grid[x][y] = '-';
            grid[o][p] = 'X';
            grid[r][q] = 'O';
            grid[t][s] = 'X';
            cout << grid[x][y] << " ";
        }
        cout << endl;
    }
    int v;
    cout << "Enter column number. \n";
    cin >> v;
    int b;
    cout << "Enter row number. \n";
    cin >> b;
    for (int y = 0; y < 3; y++)
    {
        for (int x = 0; x < 3; x++)
        {
            grid[x][y] = '-';
            grid[o][p] = 'X';
            grid[r][q] = 'O';
            grid[t][s] = 'X';
            grid[b][v] = 'O';
            cout << grid[x][y] << " ";
        }
        cout << endl;
    }
    int f;
    cout << "Enter column number. \n";
    cin >> f;
    int g;
    cout << "Enter row number. \n";
    cin >> g;
    for (int y = 0; y < 3; y++)
    {
        for (int x = 0; x < 3; x++)
        {
            grid[x][y] = '-';
            grid[o][p] = 'X';
            grid[r][q] = 'O';
            grid[t][s] = 'X';
            grid[b][v] = 'O';
            grid[g][f] = 'X';
            cout << grid[x][y] << " ";
        }
        cout << endl;
    }
    if (grid[0][0] == grid[0][1] == grid[0][2] || grid[1][0] == grid[1][1] == grid[1][2] || grid[2][0] == grid[2][1] == grid[2][2])
    {
        cout << "Game Over! \n\n";
    }
    int i;
    cout << "Enter column number. \n";
    cin >> i;
    int u;
    cout << "Enter row number. \n";
    cin >> u;
    for (int y = 0; y < 3; y++)
    {
        for (int x = 0; x < 3; x++)
        {
            grid[x][y] = '-';
            grid[o][p] = 'X';
            grid[r][q] = 'O';
            grid[t][s] = 'X';
            grid[b][v] = 'O';
            grid[g][f] = 'X';
            grid[u][i] = 'O';
            cout << grid[x][y] << " ";
        }
        cout << endl;
    }
    if (grid[0][0] == grid[0][1] == grid[0][2] || grid[1][0] == grid[1][1] == grid[1][2] || grid[2][0] == grid[2][1] == grid[2][2])
    {
        cout << "Game Over! \n\n";
    }
    int a1;
    cout << "Enter column number. \n";
    cin >> a1;
    int e1;
    cout << "Enter row number. \n";
    cin >> e1;
    for (int y = 0; y < 3; y++)
    {
        for (int x = 0; x < 3; x++)
        {
            grid[x][y] = '-';
            grid[o][p] = 'X';
            grid[r][q] = 'O';
            grid[t][s] = 'X';
            grid[b][v] = 'O';
            grid[g][f] = 'X';
            grid[u][i] = 'O';
            grid[e1][a1] = 'X';
            cout << grid[x][y] << " ";
        }
        cout << endl;
    }
    if (grid[0][0] == grid[0][1] == grid[0][2] || grid[1][0] == grid[1][1] == grid[1][2] || grid[2][0] == grid[2][1] == grid[2][2])
    {
        cout << "Game Over! \n\n";
    }
    int a8;
    cout << "Enter column number. \n";
    cin >> a8;
    int b8;
    cout << "Enter row number. \n";
    cin >> b8;
    for (int y = 0; y < 3; y++)
    {
        for (int x = 0; x < 3; x++)
        {
            grid[x][y] = '-';
            grid[o][p] = 'X';
            grid[r][q] = 'O';
            grid[t][s] = 'X';
            grid[b][v] = 'O';
            grid[g][f] = 'X';
            grid[u][i] = 'O';
            grid[e1][a1] = 'X';
            grid[b8][a8] = 'O';
            cout << grid[x][y] << " ";
        }
        cout << endl;
    }
    if (grid[0][0] == grid[0][1] == grid[0][2] || grid[1][0] == grid[1][1] == grid[1][2] || grid[2][0] == grid[2][1] == grid[2][2])
    {
        cout << "Game Over! \n\n";
    }
    int a9;
    cout << "Enter column number. \n";
    cin >> a9;
    int b9;
    cout << "Enter row number. \n";
    cin >> b9;
    for (int y = 0; y < 3; y++)
    {
        for (int x = 0; x < 3; x++)
        {
            grid[x][y] = '-';
            grid[o][p] = 'X';
            grid[r][q] = 'O';
            grid[t][s] = 'X';
            grid[b][v] = 'O';
            grid[g][f] = 'X';
            grid[u][i] = 'O';
            grid[e1][a1] = 'X';
            grid[b8][a8] = 'O';
            grid[b9][a9] = 'X';
            cout << grid[x][y] << " ";
        }
        cout << endl;
    }
    if (grid[0][0] == grid[0][1] == grid[0][2] || grid[1][0] == grid[1][1] == grid[1][2] || grid[2][0] == grid[2][1] == grid[2][2])
    {
        cout << "Game Over! \n\n";
    }
}
  • 4
    «Итак, я изучил программирование около недели назад» - как будто вы полностью закончили его, верно? -.-
  • 0
    На мой взгляд, вам не нужно включать cstdlib . Также я бы порекомендовал вам указать, что main функция возвращает int используя объявление int main() даже если ваш компилятор позволяет вам его пропустить.
Показать ещё 3 комментария
Теги:
arrays

3 ответа

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

В C++ знак == не работает так, как это делается в классе алгебр. Выражение a == b == c имеет совсем другое значение в C++. В C++ он работает только с парами элементов и возвращает значение true или false. (См. Ниже).

Чтобы увидеть, все ли вещи равны друг другу, вам нужно сказать (a == b && b == c). Проверка сетки должна выглядеть так:

if ( (grid[0][0] == grid[0][1] && grid[0][1] == grid[0][2]) || 
     (grid[1][0] == grid[1][1] && grid[1][1] == grid[1][2]) ||
     (grid[2][0] == grid[2][1] && grid[2][1] == grid[2][2]) )

Вы также заметите, что я помещаю туда лишние круглые скобки. Они не являются строго необходимыми, но некоторые компиляторы предупреждают, когда вы смешиваете && и || в том же выражении. В скобках указывается, какие элементы вы собираетесь группировать вместе и подавите эти предупреждения.


Итак, что сделал компилятор C++ с вашим кодом? Вы записали grid[0][0] == grid[0][1] == grid[0][2]. Компилятор интерпретирует это как (grid[0][0] == grid[0][1]) == grid[0][2] соответствии с его правилами приоритета оператора.

Компилятор сначала сравнит grid[0][0] с grid[0][1]. Это приведет к true или false логическому значению (C++ bool) в зависимости от того, были ли они равны. Все идет нормально.

После сравнения он сравнит результат bool с grid[0][2]. Поскольку grid[0][2] является char, она повышает значение bool до числового значения. true становится 1, а false становится 0. Ни одно из ваших значений сетки не имеет значения 0 или 1 - все они либо '-', 'X' либо 'O' поскольку второе сравнение всегда терпит неудачу.

Такая же ситуация повторяется для всех трех строк.

  • 0
    Огромное спасибо.
3

Для моего понимания вы не можете написать:

grid[0][0] == grid[0][1] == grid[0][2]

Вы должны иметь:

grid[0][0] == grid[0][1] && grid[0][1]== grid[0][2]

В C++ это двоичные операторы, и поэтому == можно применять только к двум переменным, а не к цепям до трех. Теперь он сравнивает первый результат (true/false) с третьим числом.

Мои источники:

C++ Игра Tic Tac Toe

1

Ваша программа была бы намного меньше, если бы вы использовали один массив и число ящиков с 1 по 9:

+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
| 4 | 5 | 6 |
+---+---+---+
| 7 | 8 | 9 |
+---+---+---+

Массив будет так:

const unsigned int BOARD_CAPACITY = 9;
unsigned int board[BOARD_CAPACITY + 1];

Массив board объявляется одним дополнительным слотом, поэтому вы можете безопасно использовать индексы с 1 по 9.

Проверка одной строки:

bool row_wins = false;
if ((board[1] == board[2]) && (board[2] == board[3]))
{
  row_wins = true;
}
  • 0
    Это должно быть от 0 до 8. Только еретики начинают индексировать с 1

Ещё вопросы

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