C++ 2D 数组在调用附近的小区时循环到行中的第一个单元



我正在用C++编写一个扫雷程序,目前我正在尝试为 2D 网格上的每个单元格分配一个值,用于它周围的 8 个单元格"甜甜圈"内的地雷。我正在使用 2D 字符串数组来保存每个单元格的值。"X"表示地雷。

我有"安全措施"来防止阵列试图找到不存在的单元格的值,但右侧的单元格仍然循环以检测最左侧的炸弹。

以下是一些检测本地炸弹的代码:

//main
int i = 0;
int j = 0;
int numNearbyBombs = 0;
while (i < (ySize)) //Nearby Bomb Detection
{
while (j < (xSize))
{
if ((hiddenBoard[i][j] != "X"))
{
if (j != xSize) //Safety
{
if (hiddenBoard[i][j + 1] == "X") //Checks to the right
{
++numNearbyBombs;
}
}
//Check other directions
//Replace hiddenBoard[i][j] with numNearbyBombs
numNearbyBombs = 0;
}
++j;
}
++i;
j = 0;
}

我已经尝试修改"安全"(if(语句以在(j == (xSize - 1))时跳闸,但这似乎不起作用。

一些示例输出:

1  2  3
A X  4  X
B X  X  5
C X  4  X

输出看起来不错,除了 B3 处的"5"应该是"3"。由于某种原因,代码在 B1 和 C1 处检测到"X",但奇怪的是没有在 A1 处检测到。

澄清一下,我希望 B3 只找到 A3、B2 和 C3 作为炸弹。但是,代码将 B1 和 C1 也作为炸弹。

代码的问题在于你有循环条件j < (xSize),然后是安全条件j != xSize,这是无用的,因为循环条件已经保证了第二个条件为真。

此外,这两个条件都不会阻止j + 1成为xSize。但是,可接受的值范围是从 0 到 xSize - 1。因此,您正在检查超出可接受边界的炸弹,这就是您得到错误结果的原因。

以下是重写的代码,以正确检查所有八个方向:

// Nearby Bomb Detection
for (int i = 0; i < ySize; i++) {
for (int j = 0; j < xSize; j++) {
if (hiddenBoard[i][j] != "X") {
int numNearbyBombs = 0;
if (j + 1 < xSize && hiddenBoard[i][j + 1] == "X")          // Checks to the right
++numNearbyBombs;
if (j - 1 >= 0 && hiddenBoard[i][j - 1] == "X")             // Checks to the left
++numNearbyBombs;
if (i - 1 >= 0) {
if (hiddenBoard[i - 1][j] == "X")                       // Checks strictly to the top
++numNearbyBombs;
if (j + 1 < xSize && hiddenBoard[i - 1][j + 1] == "X")  // Checks top right
++numNearbyBombs;
if (j - 1 >= 0 && hiddenBoard[i - 1][j - 1] == "X")     // Checks top left
++numNearbyBombs;
}
if (i + 1 < ySize) {
if (hiddenBoard[i + 1][j] == "X")                       // Checks strictly to the bottom
++numNearbyBombs;
if (j + 1 < xSize && hiddenBoard[i + 1][j + 1] == "X")  // Checks bottom right
++numNearbyBombs;
if (j - 1 >= 0 && hiddenBoard[i + 1][j - 1] == "X")     // Checks bottom left
++numNearbyBombs;
}
//Replace hiddenBoard[i][j] with numNearbyBombs
}
}
}

我希望这有所帮助。

最新更新