我正在用我(非常少的)空闲时间开发一个roguelike游戏。每个关卡基本上都是由一些矩形房间通过路径连接在一起的。我希望房间之间的路径看起来自然且蜿蜒。例如,我不认为以下路径看起来自然:
B
X
X
X
XX
XX
XX
AXX
我真正想要的是这样的:
B
X
XXXX
X
X
X
X
AXXXXXXXX
这些路径必须满足以下几个属性:
- 我必须能够指定一个区域,它们在这个区域内受到限制。
- 我必须能够参数化它们的蜿蜒程度和长度。
- 这些线条不应该看起来像它们从一条路径开始并在另一条路径结束。例如,上面的第一个例子看起来好像是从 A 开始并在 B 结束,因为它基本上反复改变方向直到与 B 对齐,然后就直接过去了。
我本来希望使用 A* 算法,但老实说,我不知道我的启发式函数应该是什么。我也考虑过使用遗传算法,但我不知道这种方法最终会有多实用。
我的问题是,有什么好的方法可以得到我想要的结果?请不要仅仅指定一种方法,如“A*”或“Dijkstra 算法”,因为我还需要关于一个好的启发式函数的帮助。
回答:
在你弄清楚如何生成路径之前,你必须找到一种更精确的方式来表达你想要什么。一种方法是给每个路径分配一个分数,然后搜索高分路径。以下是一些需要考虑的问题:
-
你更喜欢长的直线段还是短的?你将如何量化这种偏好?(为了让搜索算法收敛,如果你的评分函数是非线性的,将会更容易。)
-
如果你不想直接到达目的地,你可能想奖励那些偏离主线的步骤。例如,在从 A 到 B 的路径上,考虑每个点,然后走三步并计算点之间的方向。现在取该方向与从 A 到 B 的直线方向的余弦值。取其负数。在线上的步骤对你来说算作 -1,垂直的步骤是中性的,而偏离线的步骤对你来说算作 +1。
以下是一些好的后续步骤:
- 想出更多评分的想法。
- 手工绘制十几个路径,并根据你喜欢的程度对它们进行排序。
- 对于每个路径,手工创建几个小的变体。
- 在所有路径上运行你的评分函数。不断调整,直到你得到一个评分函数,它喜欢你喜欢的东西。
然后你就可以开始考虑搜索算法了。