Так что я узнал о программировании неделю назад. Я решил сделать игру 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";
}
}
В 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'
поскольку второе сравнение всегда терпит неудачу.
Такая же ситуация повторяется для всех трех строк.
Для моего понимания вы не можете написать:
grid[0][0] == grid[0][1] == grid[0][2]
Вы должны иметь:
grid[0][0] == grid[0][1] && grid[0][1]== grid[0][2]
В C++ это двоичные операторы, и поэтому ==
можно применять только к двум переменным, а не к цепям до трех. Теперь он сравнивает первый результат (true/false) с третьим числом.
Мои источники:
Ваша программа была бы намного меньше, если бы вы использовали один массив и число ящиков с 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;
}
cstdlib
. Также я бы порекомендовал вам указать, чтоmain
функция возвращаетint
используя объявлениеint main()
даже если ваш компилятор позволяет вам его пропустить.