我有一个表示n×n跳棋棋盘的结构,我有一个方法是 createAndInitBoard
它将返回一个大小为n×n的二维数组,其中包括 cell
即 cell *
*`. 该函数应分配所需的内存,并给每个单元格初始化一个颜色和一个状态。
给出的代码如下。
enum cellColor { bright, dark };
enum cellStatus { emptyC, whitePiece, blackPiece };
struct cell {
cellColor color;
cellStatus status;
};
cellColor computeColor(int r, int c) {
if ((r % 2 == 0 && c % 2 == 0) || (r % 2 != 0 && c % 2 != 0)) {
return bright;
}
return dark;
}
到目前为止,我已经完成了以下工作。
cell** createAndInitBoard(int n) {
cell** B = {};
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
B[i][j].color = computeColor(i, j);
if ((i % 2 == 0 && j % 2 == 0) || (i % 2 != 0 && j % 2 != 0)) {
B[i][j].status = emptyC;
}
else {
if (i < 3) {
B[i][j].status = blackPiece;
}
if (i > 4) {
B[i][j].status = whitePiece;
}
}
}
}
return B;
}
当然,就目前而言,这只适用于8×8的板子。我也在试图想出一些条件,可以计算一个n×n的板子.但我得到了一个错误,我认为这与我初始化单元格的方式有关。
cell** B = {};
有什么办法可以解决这个问题,甚至如何改进我的代码?
定义和初始化
cell** B = {};
会 零初始化 指针 B
. 零初始化一个指针意味着它将是一个 无效 指针。空指针不能被取消引用(例如数组索引)。
自然的C++解决方案是使用一个向量来代替(因为在编译时不知道大小)。
std::vector<std::vector<cell>> B(n, std::vector<cell>(n));
否则你需要使用 new[]
:
cell** B = new cell*[n];
for (size_t i = 0; i < n; ++i)
{
B[i] = new cell[n];
};
但你要记得 delete[]
所有的指针都在后面 (聪明的指针 不过解决了这个删除问题)。)