2015-04-16 66 views
1

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

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])的网格(显然我称之为图:))。

在此先感谢。

+1

使用2d数组或更好,但2d向量会使这更容易。 – NathanOliver

回答

0

我认为这个错误来自于你如何存储数据以及它是如何存储的。如果我理解正确,那么您的代码片段当前将查找相同行(或可能是列)上的几个邻居作为您的第i位置。

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

另外,使用二维数组(或更好,但一个std::vector<std::vector<int> >将可能使事情变得更清洁和更小的误差易发,其性能成本将是在这种情况下可以忽略不计。

1

你的条件是不正确的。如果玩家在网格的右边缘,然后我-3将是网格的左侧。

处理这个问题你可以添加额外的检查,看看你是否在边缘。例如

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

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