【问题标题】:Tile Based A* Pathfinding, but with a bomb基于图块的 A* 寻路,但带有炸弹
【发布时间】:2017-01-29 14:26:35
【问题描述】:

我编写了一个简单的 A* 寻路算法,可以快速找到穿过基于地牢的地牢的方法,地牢中地牢包含墙壁的信息。

地牢的一个例子(为简单起见,只有 1 条路径):

但是现在我想在算法中添加可变数量的“炸弹”,这将允许寻路忽略 1 面墙。然而现在它再也找不到最好的路径了,

例如,仅使用 1 个炸弹,生成的路径看起来像这里的第一张图片:

编辑:实际上它看起来像这样:https://i.stack.imgur.com/kPoAA.png

虽然正确的路径是第二张图片

问题是“封闭节点”现在会干扰可能的路径。任何关于如何解决这个问题的想法都将不胜感激!

【问题讨论】:

  • 您能否对地图进行预处理,或者在您开始搜索时它们完全未知?
  • 在寻路的开始,只有开始和结束瓦片以及它们在网格上的位置是已知的。

标签: path-finding a-star


【解决方案1】:

您的“游戏状态”将不再仅由您所在的位置来定义,还由一个表示您剩余的炸弹数量的整数来定义。如果您在 wikipedia 上遵循 A* 的伪代码,这意味着您不能简单地将 closedSet 实现为布尔网格。它可能应该被实现为,例如,哈希映射/哈希集,其中每个条目都包含以下数据:

  • x坐标
  • y坐标
  • 剩余炸弹数量

通过在搜索过程中访问某个职位,您将不再仅将该职位标记为已关闭。您会将位置 + 剩余炸弹数量的组合标记为已关闭。这样,如果稍后在同一搜索过程中您遇到了您在同一位置的位置,但还剩下更多炸弹,您不会因为已关闭而忽略它,而是实际上会继续搜索这种可能性。

请注意,如果最大可能的炸弹数量相对较低,您还可以将closedSet 实现为布尔网格数组,您首先按炸弹数量索引,然后按 x 和 y 坐标找出特定仓位是否平仓。

【讨论】:

  • 您好,感谢您的回答以及来自 DMGregory 在gamedev.stackexchange.com/questions/136509 上的回答,我能够使它工作,我最终不只是为每个炸弹使用添加一个维度,因为担心会有不同维度上的路径相互阻塞,但每次使用炸弹时都会创建一个“全新”维度,该维度具有自己的封闭列表(这是原始封闭列表的副本,直到使用炸弹+在此维度上关闭的任何新节点)如果稍后使用另一个炸弹,它会通过复制它的父封闭节点列表来创建另一个封闭列表!感谢您的回答!
【解决方案2】:

这不是说你只是假装根本没有墙

使用 A* 找到从头到尾的最短路径,然后检查您必须穿过多少堵墙。如果你有足够的炸弹,你可以使用路径。否则,尝试下一个最长的路径,依此类推。

顺便说一句:您可能需要查看http://gamedev.stackexchange.com 以了解此类问题。

【讨论】:

  • 感谢您的回答,但是使用 A* 永远不会有“下一条最短路径”,例如使用您忽略墙壁的方法,结果将是 this 只有绿色路径才是路径即返回,其他路径未完成,因为算法在开发它们之前找到了路径
  • 虽然如果路径无效(使用超过分配的炸弹)我可以让算法继续运行,但我会遇到与 OP 中描述的封闭节点阻塞路径相同的问题。我也去看看gamedev,谢谢你的建议!
【解决方案3】:

您需要调整成本函数来为炸弹付出一些代价,然后以无限成本正常运行算法来制造第二枚炸弹。为了在一半左右得到炸弹,使用成本函数,它的成本大概应该是启发式 A-B 距离乘以空瓷砖的成本。如果你有两颗炸弹,成本减半,当然使用三颗炸弹的成本是无限的。

但不要期望非常好的结果。 A* 不是为这种优化而设计的。

【讨论】:

    猜你喜欢
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多