如何找到障碍?


10

如何最好地表示以下情况-代理(@)需要达到目标($)。该路径被护城河(~~~)阻塞。可以使用耙子(或其他一些设备,如水上行走靴)来越过障碍物。

.....~~~...   . ground
...=.~~~...   = rake
.....~~~.$.   ~ water
.@...~~~...   @ agent
.....~~~...   $ goal

如果没有立即可用的路径,如何正确地从查找@$?我的道路是否应该不仅具有成本,还具有先决条件?

UPD:问题是目标无法实现,耙只是地图上许多可能的物体之一。那么问题是“如何使代理了解它需要耙子?”


我认为您应该澄清用例,因为这会影响解决该问题的方法。例如,如果用例是为敌人计算路径,那么您可能应该首先查看当前是否可以达到目标,如果没有让敌人得到耙子(即耙子是目标),然后找到第一个目标再次进球。
2012年

Answers:


6

我正在考虑一堆目标,因此必须对寻路进行注释

  • 从目标开始 get $
  • 尝试查找到的路径$-路径存在所需的水上行走能力。
  • 推进目标get waterwalking
  • 现在目标堆栈 get waterwalking, get $
  • 莫名其妙地发现耙子在水上行走,因此将其重命名为船。
  • 耙路。达到最高目标,将其从堆栈中弹出,目标是get $
  • 通往之路$-现在我们有能力并且可以实现目标。

1
+1我在游戏中做了类似的事情,并在“单位任务”和“ 寻路” 写了一篇有关它的文章。
MichaelHouse

当存在不使用rake的路径时,@ byte66无法处理特殊情况,但是使用rake会导致路径更短
Ali1S232 2012年

@Gajet你是对的。猜猜将需要一个不同的方法。
zzandy 2012年

1
这只是增加额外成本的问题。遇到水时,请增加将水上行走物品带到路径上的成本。A *将跳过水上行走,直到它成为最便宜的路径为止。
MichaelHouse

3

整个路径查找内容只是在图形上搜索最短路径。要解决您的问题,您需要应用的唯一更改是添加一些额外的边缘(表示船可以采用的路径),并执行简单的路径查找算法。不管您使用BFS,Dijkstra还是A *都没关系,只需实现带有一些额外边缘的普通路径查找算法即可。有关图形检查Wiki页面中路径查找的更多信息


+1使耙子与水成为单向链接,而水对地面的蜜蜂也与单向链接相连。
洛朗·库维杜

我不清楚如何将几何搜索和特征搜索绑定在一起。如何从去no path from @ to $goto rake, bring it to water, place it, goto $
zzandy 2012年

@zzandy进行路径查找时,对于每个图块,请尽可能转到最近的图块。您只需要添加一个条件,即如果当前节点是耙子,则可以直接从河流的另一侧添加一个节点以打开列表。
Ali1S232

但是,如果您可以携带设备怎么办?我以为那是他的意思(也是我的意思。)
kaoD

是的,我的意思是该设备可以(并且必须)被盗。@kaoD,您的答案不包括当业务代表认为需要耙子时的步骤。
zzandy 2012年

2

我会用某种行为树解决方案来做到这一点-您朝着目标前进,并注意所有阻碍A *的障碍。如果失败,则检查是否存在可以帮助克服这些障碍的对象,在这种情况下,该对象的路径。重复。这意味着,在获得使用工具的想法之前,代理需要尝试达到目标并失败,这可能会花费一些时间,尤其是在存在巨大的瓷砖世界都需要检查的情况下。但是,座席可能需要花一些时间来思考如何解决问题,所以看起来可能不太合适。

我可以想象一个真正的,核心的解决方案。向路径查找网格添加另一个维度。因此,对于2D地图,您将使寻路网格变为3D。在这个简单的示例中,这个新维度的深度只有2,但是在实际游戏中,它将迅速变大。

在z = 0时,您可以在正常情况下绘制地形图,这意味着水瓦片被认为是不可逾越的。

在z = 1时,您在绘制耙时会按原样绘制地形,这意味着水瓦片被认为是可步行的(但是,例如,如果您有墙壁瓦片,则这些瓦片可能会保持坚固)。

路径查找是x和y维度上的普通A *,这意味着每个网格单元都被视为可以访问其相邻网格。但是,在z维度上,不允许A *扩展。

除了耙子在哪里。耙对象充当路径查找网格中z = 0和z = 1之间的开口。

这意味着A *将在z = 0时向外填充水,击中水,然后用完所有选项-然后它将通过耙砖传播到z = 1,并且在z = 1时(水可步行)找到通往目标的道路。结果是NPC毫不犹豫地移动到耙子,然后将最短路径移动到目标。


在我的示例中,我将耙子更像是“水上步行靴”,这意味着如果有的话,它可以使您在水瓦片上行走。如果耙子实际上需要作为一块地形“建造”,并且覆盖有限数量的瓷砖,这些瓷砖可能或可能不足以覆盖整个水域,那么问题就更加棘手。我的解决方案确实允许一次性使用的物品,如果您使z = 1的运动自动再次降到z = 0。
Joar Jakobsson 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.