2

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

  • 平原 - 移动成本 1
  • 森林 - 成本 2
  • 河 - 费用 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 到坐标 xTo,yTo 的步行成本。如果单元格 xTo,yTo 是可步行的,则成本必须 > 0.0f。如果不是,它必须等于 0.0f。

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

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

4

2 回答 2

2

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

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

正如您所看到的,您需要做的就是操作 A* 算法是增加地图上特定类型/属性的图块/点的暂定分数(从开始的成本)。

如果您查看第 660 行,我将tentative_g_score(从一开始的成本)增加了 8 个水,所以这就像说“只有在替代方案是步行 8~ 步才能绕过它时才建一座桥”。在 A* 算法中包含切片数据,而不仅仅是笛卡尔坐标,是根据地图属性对算法进行调整的好方法。

于 2015-05-23T02:04:17.547 回答
0

据我了解,使用 tcod 的内置寻路功能很可能实现您想要实现的目标。

path_new_using_functionpath_func使用相邻的单元格调用您,因此您可以简单地让它根据下面的地形(xFrom, yFrom)和/或返回上面列出的值(xTo, yTo)

于 2019-03-04T12:03:32.793 回答