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

Python Libtcod: How to do pathfinding with variable move cost terrain?

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

每种类型都有自己的移动成本,例如,在平原上移动比在森林中移动花费更少"move points"。我想显示一个单位可以移动到给定移动 range/starting 移动点的所有方块。

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)

但我不知道自定义函数应该做什么。根据文档,它应该

...return the walk cost from coordinates xFrom,yFrom to coordinates xTo,yTo. The cost must be > 0.0f if the cell xTo,yTo is walkable. It must be equal to 0.0f if it's not.

但是,这不是 dijtskra 算法的重点吗?也就是说,该算法应该考虑每个瓦片的可变成本,然后相应地构建路径。

地图本身已经应用了地形和移动成本,我只需要一种方法将这些数据与寻路联系起来。

我自己实现了用于美学步行路径生成的 A* 算法;根据 A*,考虑到增加的步数,其中包括仅在可能时才放置的桥:

https://github.com/lillian-lemmer/sshrpg/blob/master/plotbrush/mapgen.py#L622

如您所见,您需要做的就是操纵 A* 算法来增加地图上 tiles/points 的特定 types/attributes 的暂定分数(开始成本)。

如果您查看第 660 行,我将水的 tentative_g_score(开始成本)增加了 8,所以这就像说 "only build a bridge if the alternative is walking 8~ steps to get around it." 在您的 A* 算法中包含图块数据,而不是只是笛卡尔坐标,是根据地图的属性对算法进行调整的好方法。

据我了解,tcod内置的寻路功能可以很好地实现你想要的。

path_new_using_function 会调用你的 path_func 和相邻的单元格,所以你可以根据下面的地形 return 简单地使用它 return 你上面列出的值 (xFrom, yFrom) and/or (xTo, yTo).