我编写了一个简单的A *路径查找算法,可以快速找到通过基于图块的地牢的方法,其中图块包含墙的信息。
地牢的一个例子(为简单起见,只有一条路径):
但是现在我想添加可变数量的" Bombs"算法允许路径查找忽略1个墙。但是现在它再也找不到最好的路径了,
编辑:实际上它看起来像这样:https://i.stack.imgur.com/kPoAA.png
虽然正确的路径是第二张图片
问题是"关闭节点"现在干扰可能的路径。任何关于如何解决这个问题的想法都将不胜感激!
答案 0 :(得分:1)
您的“游戏状态”将不再仅由您的位置定义,而是由表示您已离开的炸弹数量的整数定义。如果你在wikipedia上遵循A *的伪代码,这意味着你不能简单地将closedSet
实现为布尔网格。它应该可以实现为,例如,哈希映射/哈希集,其中每个条目包含以下数据:
通过访问搜索过程中的某个位置,您将不再将该位置标记为已关闭。你会将位置+炸弹数量的组合标记为已关闭。这样,如果稍后在相同的搜索过程中你遇到一个位置,你在同一个位置,但剩下更多的炸弹,你不会忽略它关闭,但实际上会继续搜索这种可能性。
请注意,如果最大可能的炸弹数量相对较低,您还可以将closedSet
实现为布尔网格数组,首先按炸弹数量进行索引,然后按x和y坐标进行索引。找出某个特定职位是否已经关闭。
答案 1 :(得分:0)
这是不是意味着你只是假装根本没有任何墙?
使用A *查找从开始到结束的最短路径,然后检查您需要经过的墙数。如果你有足够的炸弹,你可以使用这条路径。否则,请尝试下一个最长的路径,依此类推。
顺便说一句:你可能想查看http://gamedev.stackexchange.com这样的问题。
答案 2 :(得分:0)
你需要调整成本函数来为炸弹花费一些东西,然后通常以第二枚炸弹的无限成本运行算法。为了使炸弹大约中途使用,使用成本函数进行游戏,它应该花费大约启发式A-B距离乘以空瓦的成本。如果你有两枚炸弹,成本的一半,当然那么使用三枚炸弹的费用是无限的。
但是不要期待非常好的结果。 A *不是为这种优化而设计的。