我正在使用python中的实时等距RPG,并希望将移动设备作为平台。我遇到困难的主要领域是我的寻路。我尝试了一些算法,包括A *和一些调整,以更好地适应我正在使用的地图。
我对我的算法结果感到满意 - 它们在确定性的同时给出了一些智能的假象,并且在任一方向上都是一致的,这样两个以两个角色为目标位置的角色就会在中间碰撞。
我的问题是虽然PC上的结果看起来很好,我可以要求所有的处理能力,但在我的手机上却是另一个故事,并且在计算算法时经常会出现第二次或更多延迟。出于这个原因,我正在考虑使用用C编写的性能最密集的代码为此编写一个库,但是如果有一个现有的解决方案,或者更好的方式我可以做到这一点,我会全力以赴。
我偶然发现了python-pathfinding,但这似乎比我为自己的用例构建的要慢。
我的地图是由水平建造的,这些水平被墙壁(可见或不可见)包围,并且必须通过门(可见或不可见)链接。
我目前的方法是使用两种不同的算法:
在一个房间内,我将单个图块搜索为节点,每个边界作为等成本边缘,在目标位置的方向上使用深度优先
在每个门都是节点的房间之间。使用第一算法计算通过房间(从门到门)的最短可能路径,并将其存储在哈希表中作为这些节点之间的边缘成本。然后计算可以遍历从一个节点到另一个节点的边集,并将其存储在哈希表中,并且不允许在同一路径中多次包含相同的边。
我在启动时产生了一个单独的进程,它使用第一个算法生成第二个算法的图形,这解决了我的许多问题,房间往往相对较小,因此即时路径的惩罚 - 发现保持低于其他情况,然后是更长的距离:
答案 0 :(得分:5)
首先,我知道一个非常有效和通用的库来处理A *搜索算法。它是lib2dp。您可以轻松地将python生成的图形插入此库并快速回答。
其次,A *基本上很适合找到最佳路径:
如果您违反其中一条规则,您可能需要考虑一种名为“D*”的替代算法。
当然,这在性能方面有巨大的成本。因此,您可以为您的计划找到最佳权衡。
答案 1 :(得分:4)
如果你可以将你的游戏环境缩小为图形,那么http://networkx.lanl.gov/有很多很好的内置算法用于此类事情。
答案 2 :(得分:2)
答案 3 :(得分:1)
您可能需要查看libtcod和libtcodpy
Python包装器。但就个人而言,我不太喜欢包装器不是非常Pythonic,是一个不必要的单片脚本,过度使用函数名称前缀(至少,我最后一次使用它)。我在某一点上重构了包装并为Python 3修复了它,但那是一年前的事情,所以事情可能已经改变了。