在2D离散游戏中构建位置

时间:2011-03-22 17:51:11

标签: algorithm artificial-intelligence game-ai

我在网格宇宙中工作 - 对象只存在于二维矩阵中的整数位置。

有些条款:

方形 - 离散位置。每个正方形都有一个int x和int y坐标,没有两个正方形具有相同的x和y对。

相邻:如果x或y坐标的差值大小不大于1,则正方形X与另一个正方形Y相邻。更简单地说,所有正方形立即位于N,NE,E,SE, S,SW,W和NW方向相邻。

Legend:
'?' - Unknown Traversibility
'X' - Non Traversable Square
'O' - Building (Non Traversable)
' ' - Traversable Square

问题:

鉴于以下一般情况:

? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ?
? ? ? O O ? ? ?
? ? ? O O ? ? ?
? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ?
如果建筑物与四座建筑物中的一座建筑物相邻,我想建造两座建筑物,使得它们共用一个共同的相邻广场,该广场也与四座现有建筑物中的至少一座建筑物相邻,这个共同的相邻广场是没有阻止。

基本有效解决方案:

X X X X X X X X          X X X     X X X          X X X X X X X X
X X X X X X X X          X X X     X X X          X X X X X X X X
X X X X X X X X          X X X     X X X          X X X X X X X X
X X X O O X X X          X X X O O X X X          X X X O O X X X
X X X O O X X X          X X X O O X X X          X X O O O X X X
                         X X X O   X X X                O X X X X
      O O                X X X O   X X X                X X X X X
                         X X X     X X X                X X X X X 

目前,我迭代遍历四个建筑物旁边的所有可穿越广场,并寻找具有3个相邻可穿越广场的正方形,但这有时会产生如下情况:

X X X X X X X X          X X X X X X X X          X X X X X X X X
X X X X X X X X          X X X X X X X X          X X X X X   X X
X X X X X X X X          X X   O     X X          X     X X   O X
X X X O O X X X          X X   O O O X X          X     O O O X X
X X X O O X X X          X X   O O   X X          X X   O O   X X
X X X     X X X          X X         X X          X X         X X
X X X O O X X X          X X X     X X X          X X X     X X X
X X X     X X X          X X X     X X X          X X X     X X X 

关于如何优化算法的任何想法?

编辑:添加了另一个失败案例。

编辑:我还想知道是否有可能满足这些条件的配置。我不能保证一个可行的解决方案,如果没有办法成功做到这一点,我不想尝试。

3 个答案:

答案 0 :(得分:1)

检查以确保您的新建筑物不是正交相邻将消除诸如问题案例1之类的情况,并检查以确保您的新建筑物不超过一个与任何原件相邻将清除问题案例2。

如果您可以安全地假设您没有比问题案例2更加紧缩,这应该有效。如果只有一个出口,那么唯一的解决方案将需要违反上面提出的“不超过一个”条件。

答案 1 :(得分:1)

您的无效案例是由于将自由空间分成两部分对吗?在这种情况下,粗略的方法是在建筑物放置后对自由空间进行洪水填充,并查看连接的空间是否具有正确的尺寸(比建筑物放置前小2个方格)。这似乎过分了。您真的想知道自由空间方块的图形是否仍然连接。更具体地说,您想知道新建筑物周围的所有自由空间方块是否仍然连接。它们必须是本地连接的,还是路径可以任意长?即这是有效的:

X X X X X X X X
X           X X
X   X X X   X X
X   X X X   X X
X     O     X X
X X   O O O X X
X X   O O   X X
X X         X X
X X X     X X X
X X X     X X X

如果可以,这是一个难题,因为该路径可能很长。

答案 2 :(得分:1)

我能想到的唯一解决方案是从公共相邻正方形到地图边缘进行寻路。在我看来,所有的问题都归结为“相邻的方块被阻挡”,因此确保它不被阻挡的方法是找到从该方块到地图开放边缘的路径。

我不知道这是否是最有效的方法,但它实现起来相当简单,因为A *寻路例程已经相当广泛地实现了。实际上,因为你不需要最短的路径,只需一个路径,你可以简单地从相邻的方块开始填充自由空间,直到你到达地图的边缘。