我正在使用C ++编写一个简单的基于文本的Battle Ship游戏。我正在尝试在控制台中正确地制作网格/电路板。我的格式正确,但我发现2D数组的元素不正确。 以下是一个例子。 我已将2D网格中的所有元素设置为 Z ,但出于某种原因,它们都显示为 Y 。为什么要更改变量?
#include <iostream>
using namespace std;
enum Grid {X, Y, Z};
const int GRID_SIZE = 10;
Grid grid[GRID_SIZE][GRID_SIZE] = {Z};
void displayGrid();
int main()
{
displayGrid();
cin.get();
return 0;
}
void displayGrid()
{
// Display top column of the grid, containing numbers.
cout << "\t |";
for (int i = 0; i < GRID_SIZE; i++)
cout << i << "|";
cout << endl;
Grid gridContent;
for (int y = 0; y < GRID_SIZE; y++)
{
cout << "\t" << y << "|";
for (int x = 0; x < GRID_SIZE; x++)
{
gridContent = grid[y][x];
if (gridContent = X)
cout << "X|";
else if (gridContent = Y)
cout << "Y|";
else if (gridContent = Z)
cout << "Z|";
}
cout << "\n";
}
}
答案 0 :(得分:4)
首先:
Grid grid[GRID_SIZE][GRID_SIZE] = {Z}
仅使用grid
初始化数组Z
的第一个元素(其余元素为0,请参阅aggregate initialization)。您需要main
内的嵌套循环,将所有元素初始化为Z
,例如
for(int i = 0; i < GRID_SIZE; ++i)
for(int j = 0; j < GRID_SIZE; ++j)
grid[i][j] = Z;
<强>第二强>:
if (gridContent = X)
将gridContent
设置为X
(此错误也会出现在其他if
中)。要测试相等性,需要使用==
代替。
第三:如果您真的想了解之前显示Y
的原因,那是因为
if(gridContent = X)
评估为false
,因为X
转换为0
,然后将其分配给gridContent
。因此,程序进入另一个
if(gridContent = Y)
将gridContent
设置为Y
,并且因为后者不为零,if
条件的计算结果为true
。您在循环中执行此操作,因此最终将所有元素显示为Y
。不完全是你想要的。
最佳做法
避免这些错误的一种方法是编译所有警告。例如,g++ -Wall -Wextra test.cpp
吐出
警告:建议用作真值的赋值括号[-Whatarentheses]
if (gridContent = X)
和clang ++更有帮助
警告:使用作业条件作为条件 没有括号[-Whatarentheses]
所以你肯定知道出了什么问题。
另一种方法是始终将rvalue置于等式测试的左侧,如
if(X == gridContent)
此处X
是一个右值,如果您错误地键入=
而不是==
,则编译器会发出错误,例如
错误:左值作为赋值的左操作数
因为您无法分配到右值。
最后,尝试使用标准容器而不是原始数组,例如std::vector<>
。