2012-12-03 156 views
0

我要在編程時嘗試一下我的帽子。我的遊戲需要在傳統遊戲網格上運行A*路徑查找算法。2d網格的.NET集合?

像這樣的例子:(S =開始,G =目標,X =牆)

------------------------------- 
| | | | | | | | | G| | 
------------------------------- 
| | | | | | | | | | | 
------------------------------- 
| | X| X| X| X| | | | | | 
------------------------------- 
| | | | | X| | | | | | 
------------------------------- 
| S| | | | | | | | | | 
------------------------------- 

要實現A *,我需要能夠得到的任何節點的 「鄰居」。 (例如,開始有3個鄰居(上圖,對角線和右圖)。)

想到在數據層映射它的方法是2維數組或鏈表。

該陣列看起來是最高性能且易於拆卸的。所以,如果S[0][4],那麼它的鄰居是[0 + 1][4](右),[0][4 - 1](上圖),[0 + 1][4 - 1](對角線)

但已經做的.NET應用程序開發了幾年,基本陣列顯得有點老同學給我。因此,在我走下這條路之前,我想我會問是否有一個很好的.NET集合類型,我可以用它來繪製出一個網格(在數據層,而不是UI)。

+1

您確定要採集類型?我會通過包裝數組並創建索引屬性來創建我的GameGrid類。 –

回答

2

在這種情況下,陣列聽起來像是正確的選擇。請記住,大多數提供的數據結構都試圖提供不同的功能。

鑑於您需要的唯一抽象方法(鄰居)是一個快速實現,因此有理由使用更復雜的任何東西作爲您的基礎。

2

您不需要繪製出整個網格。更容易的是按需生成給定節點的鄰居。即節點(x,y)的鄰居將是{x-1, x, x+1} x {y-1, y, y+1} - (x, y)。如果這些點中的任何點位於網格維度之外,則不會考慮它們。如果這些地點中有任何一處有牆,那麼您也會忽略它們。所以現在你只需要考慮如何有效地檢查某個位置的牆壁。因爲在這個特定問題中可以使用上面的方法找到節點的鄰居,所以我認爲你不需要這裏的鄰接列表或鄰接矩陣。

編輯: 在檢查一個位置的牆壁時,我曾經使用從座標到整數的映射來完成。即(x, y) => x + y*MaxWidth。您爲每個座標獲得一個唯一的整數。現在,您只需將散列表中的整數存儲在散列表或類似的東西中進行高效查找。如果網格的尺寸相當大,此方法將勝過2d數組表示。