扫雷邻居数量

时间:2015-04-16 13:27:56

标签: c++ minesweeper neighbours

我试图复制扫雷,我遇到了计算地雷邻居的问题。这似乎是一件非常容易实现的事情,但由于某种原因,我无法在任何地方获得理想的结果。我有一个1d的int数组代表每个tile。我想要一种方法来分别考虑它的每个邻居,因为它可能具有可变的网格大小。这是我的代码的样子:

int num = 0;

if (i + 1 < 16 && graph[i + 1] == -1)
    num++;
if (i - 1 >= 0 && graph[i - 1] == -1)
    num++;
if (i + 3 < 16 && graph[i + 3] == -1)
    num++;
if (i - 3 >= 0 && graph[i - 3] == -1)
    num++;
if (i + 4 < 16 && graph[i + 4] == -1)
    num++;
if (i - 4 >= 0 && graph[i - 4] == -1)
    num++;
if (i + 5 < 16 && graph[i + 5] == -1)
    num++;
if (i - 5 >= 0 && graph[i - 5] == -1)
    num++;

return num;

我没有得到最左边和最右边的瓷砖我想要的结果。有时候最下面和最上面的瓷砖也有问题。我的代码使用固定大小为4x4(int [16])的网格(显然我称之为图:))。

提前致谢。

2 个答案:

答案 0 :(得分:1)

您的条件不正确。如果玩家位于网格的右边缘,那么i-3将是网格的左侧。

要解决此问题,您可以添加其他检查,以确定您是否处于优势地位。 e.g。

if (i - 3 >= 0 && (i+1) % 4 > 0 && graph[i - 3] == -1)
    num++;

您需要对大多数其他if语句进行类似的检查(除了+/- 4以外)。

答案 1 :(得分:0)

我认为错误来自于您认为数据存储方式与实际存储方式的关系。如果我理解正确,您的代码段目前会查看同一行(或可能是列)中的几个邻居作为i位置。

这个答案包含有关如何将2D网格线性化成一维数组的良好解释:Convert a 2D array index into a 1D index

或者,使用2D数组(或更好的是,std::vector<std::vector<int> >可能会使事情更清晰,更不容易出错。在这种情况下,性能成本可以忽略不计。