2015-04-16 103 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之外的所有內容)進行類似檢查。