所以我试图通过创建一个基本的国际象棋游戏来学习C ++。 随着附加的皱纹,用户可以创建非标准尺寸的板(即,不一定是8×8)
一旦我从用户那里收到了电路板的尺寸,我应该设置为以固定尺寸创建它。所以我想在这里使用数组。
编译器不喜欢我的声明:
tile arrayOfTiles[numX][numY];
似乎告诉我它想要一个常数作为数组索引。 这是我甚至可以用数组做的事吗?
class gameBoard{
public:
gameBoard(int x=8, int y=8)
: numX(x),
numY(y)
{
//construct board
tile arrayOfTiles[numX][numY];
/*
for (int i=0; i<numX; i++) {
for (int j=0; j<numY; j++){
arrayOfTiles[i][j]=tile();
}
}
*/
}
protected:
int numX; //total number of rows, typically 8 (A-H) on a chessboard
int numY; //total number of columns, typically 8 (1-8) on a chessboard
};
答案 0 :(得分:4)
使用std::vector
:
std::vector<std::vector<tile>> arrayOfTiles(numX, std::vector<tile>(numY));
使用typedef
来简化它:
typedef std::vector<tile> vectiles;
std::vector<vectiles> arrayOfTiles(numX, vectiles(numY));
vectiles
是图块的向量,arrayOfTiles
是vectiles
的向量。您可以将其视为二维数组。
for(size_t i = 0 ; i < numX; ++i)
{
for(size_t j = 0 ; j < numY; ++j)
//use arrayOfTiles[i][j]
}
您可以分别使用numX
和numY
,而不是arrayOfTiles.size()
和arrayOfTiles[i].size()
。
答案 1 :(得分:0)
你可以在这里做的最好的事情是让gameBoard
在内部持有arrayOfTiles
作为其数据成员之一,而不是C风格的数组,而应该使用std::vector
代替:
protected:
std::vector< std::vector<tile> > arrayOfTiles;
然后你可以在初始化列表中初始化它:
public:
gameBoard(int x = 8, int y = 8)
: numX(x), numY(y), arrayOfTiles(x, std::vector<tile>(y));
{
// ...
}