Python Libtcod:如何使用可变移动成本地形进行寻路?

时间:2015-05-23 01:50:36

标签: python algorithm dijkstra libtcod

我正在使用Libtcod和Python构建一个回合制战略游戏。游戏地图具有可变地形,每个图块可以是5种类型中的一种:

  • 平原 - 成本1移动
  • 森林 - 费用2
  • River - 费用4
  • 希尔 - 费用3
  • 山 - 无法通行

每种类型都有自己的移动成本,因此成本更低"移动点"例如,穿过平原而不是通过森林。我想显示一个单位可以移动的所有方格,给定它的移动范围/起始移动点。

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算法的重点是什么?也就是说,该算法应该考虑每个图块的可变成本,然后相应地构建路径。

地图本身已经有应用的地形和移动成本,我只需要一种方法来将该数据与路径查找联系起来。

2 个答案:

答案 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)下的地形返回上面列出的值