我将尝试编程游戏。我的游戏需要在传统游戏网格上运行A*路径查找算法。
例如:(S = Start,G = Goal,X = Wall)
-------------------------------
| | | | | | | | | G| |
-------------------------------
| | | | | | | | | | |
-------------------------------
| | X| X| X| X| | | | | |
-------------------------------
| | | | | X| | | | | |
-------------------------------
| S| | | | | | | | | |
-------------------------------
要实现A *,我需要能够获得任何节点的“邻居”。 (例如,Start有3个邻居(Above,Diagonal和Right)。)
在数据层中将其映射的方式是二维数组或链接列表。
阵列看起来效果最好,很容易实现。因此,如果S
为[0][4]
,则其邻居为[0 + 1][4]
(右),[0][4 - 1]
(上方),[0 + 1][4 - 1]
(对角线)
但是几年来我已经完成了.NET应用程序的开发,基本的数组对我来说似乎有些老了。
所以在我走这条路之前,我想我会问是否有一个很好的.NET集合类型我可以用它来绘制网格(在数据层,而不是UI)。
答案 0 :(得分:3)
您不需要绘制整个网格。更容易的是按需生成给定节点的邻居。即节点(x,y)的邻居将是{x-1, x, x+1} x {y-1, y, y+1} - (x, y)
。如果这些点中的任何一个位于网格尺寸之外,则不会考虑它们。如果这些位置中的任何一个都有墙,您也会忽略它们。所以现在你只需要考虑如何有效地检查某个位置的墙壁。因为在这个特定问题中可以使用上述方法找到节点的邻居,所以我认为这里不需要邻接列表或邻接矩阵。
编辑:
在检查某个位置的墙壁时,我曾经使用从坐标到整数的映射来完成它。即(x, y) => x + y*MaxWidth
。每个坐标都会得到一个唯一的整数。现在,您只需使用哈希表中的整数或类似的内容来存储墙位置,以实现高效查找。如果网格的尺寸相当大,则此方法优于2d数组表示。
答案 1 :(得分:3)
在这种情况下,阵列听起来是正确的选择。请记住,提供的大多数数据结构都试图提供不同的功能。
鉴于您需要的唯一抽象方法(邻居)是一种快速实现,因此没有理由使用任何更复杂的方法作为基础。