我正在使用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)
但是我不知道自定义函数应该做什么。根据文件,它应该
...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*算法,就可以增加地图上特定类型/属性的分片/点的暂定分数(从开始算起)。在
如果你看第660行,我将
tentative_g_score
(成本从开始算起)增加了8,所以这就像是说“只有在替代方案走了8步才能绕过它的情况下才建造一座桥。”包括你的a*算法的瓷砖数据,而不仅仅是笛卡尔坐标,是一种很好的基于地图属性对算法进行调整的方法。在我尽可能地了解PathIn的功能。在
path_new_using_function
将使用相邻单元格调用您的path_func
,因此您只需让它返回上面列出的值,具体取决于(xFrom, yFrom)
和/或(xTo, yTo)
。在相关问题 更多 >
编程相关推荐