2D数组不会在控制台网格中显示正确的内容

时间:2015-05-22 00:25:25

标签: c++ multidimensional-array visual-studio-2013 console enumerator

我正在使用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";
    }
}

1 个答案:

答案 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<>