用于2D网格的.NET Collection?

时间:2012-12-03 23:26:17

标签: c# .net

我将尝试编程游戏。我的游戏需要在传统游戏网格上运行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)。

2 个答案:

答案 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)

在这种情况下,阵列听起来是正确的选择。请记住,提供的大多数数据结构都试图提供不同的功能。

鉴于您需要的唯一抽象方法(邻居)是一种快速实现,因此没有理由使用任何更复杂的方法作为基础。