我正在使用Libtcod和Python构建一个回合制战略游戏。游戏地图具有可变地形,每个图块可以是5种类型中的一种:
每种类型都有自己的移动成本,因此成本更低"移动点"例如,穿过平原而不是通过森林。我想显示一个单位可以移动的所有方格,给定它的移动范围/起始移动点。
Libtcod具有为A *和Dijtskra构建的寻路功能,显示给定范围内的所有方块并不考虑地形是微不足道的。
但是,我无法弄清楚如何实现地形成本,而无需编写自己的寻路算法。看看我知道的文档与它有关:
def path_func(xFrom,yFrom,xTo,yTo,userData) : ...
path_new_using_function(width, height, path_func, user_data=0, diagonalCost=1.41)
dijkstra_new_using_function(width, height, path_func, user_data=0, diagonalCost=1.41)
但我无法弄清楚自定义函数应该做什么。根据文档,它应该
...将坐标xFrom,yFrom的步行费用返回到坐标 x要,一拖。费用必须> 0.0f如果单元格xTo,yTo是可步行的。它 必须等于0.0f,如果不是。
但是,dijtskra算法的重点是什么?也就是说,该算法应该考虑每个图块的可变成本,然后相应地构建路径。
地图本身已经有应用的地形和移动成本,我只需要一种方法来将该数据与路径查找联系起来。
答案 0 :(得分:2)
我为审美行走路径生成制作了自己的A *算法实现;根据A *,其中包括仅在可能的情况下放置的桥梁,考虑增加的步数:
https://github.com/lillian-lemmer/sshrpg/blob/master/plotbrush/mapgen.py#L622
正如您所看到的,您需要做的就是操纵A *算法,以增加地图上特定类型/属性的瓦片/点的暂定分数(开始时的成本)。
如果你在第660行看一下,我将tentative_g_score
(开始时的成本)增加8来换水,所以这就像是说“如果替代方案是步行8步来绕过它,那就建立一座桥梁。 “使用A *算法包括切片数据,而不仅仅是笛卡尔坐标,是根据地图属性对算法进行调整的好方法。
答案 1 :(得分:0)
据我了解,使用tcod的内置寻路功能可以很好地实现您想要的目标。
path_new_using_function
会与相邻的单元格一起调用您的path_func
,因此您可以简单地让它根据(xFrom, yFrom)
和/或(xTo, yTo)
下的地形返回上面列出的值