我正在用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
}
}
}
我希望这有所帮助。