我正在我(很少)的空闲时间里做一个roguelike。每个级别基本上是由路径连接在一起的几个矩形房间。不过,我希望房间之间的路径看起来很自然。例如,我不会考虑以下看起来很自然:
B
X
X
X
XX
XX
XX
AXX
我真的想要更像这样的东西:
B
X
XXXX
X
X
X
X
AXXXXXXXX
这些路径必须满足一些属性:
我希望使用A *,但说实话,我不知道我的启发式是什么。我也考虑过使用遗传算法,但我不知道这种方法最终会有多实用。
我的问题是,获得我想要的结果的好方法是什么?请不要只指定像“A *”或“Dijkstra算法”这样的方法,因为我还需要一个良好的启发式方法的帮助。
答案 0 :(得分:4)
在你弄清楚如何制作路径之前,你必须找出一种更精确的方式来陈述你想要的东西。一种方法是为每条路径分配一个分数,然后搜索高分路径。以下是一些需要考虑的问题:
您喜欢长直道跑道吗?你如何量化这种偏好? (要使搜索算法收敛,如果您的评分函数是非线性的,将会更容易。)
如果您不想直接前往目的地,您可能需要奖励主线以外的步骤。例如,在从A到B的路径上,考虑每个点,然后采取三个步骤并计算点之间的方向。现在取该方向差异的余弦和从A到B的方向。否定它。线上的步数-1对你而言,垂直的步数是中性的,并且距离线数+1的步数为你。
以下是一些很好的后续步骤:
然后您将准备考虑搜索算法。
答案 1 :(得分:1)
我认为寻路是一个错误的术语:通常涉及找到从A到B的有效路线,而你的问题不在于找到那条路线,而在于创建适合你目的的路线。您故意创建次优路径,其质量难以量化。因此,我不认为具有任何启发式的搜索算法将是该问题的最佳解决方案。如果您有一个强制性标准(工作路径)和一些模糊的,未定义的标准(自然观察和缠绕),最好从满足强制性要求开始,并尝试将其变为其他要求。这样你总会有一些有用的东西。
我建议,鉴于您似乎更喜欢水平和垂直路径以直角转弯,从A到B的直线2段路径开始。(A *与曼哈顿距离启发式可以找到这个,但是你自己就这么容易了。)然后沿着两个分段中的一个和该分段的两个端点之一取一个随机点,并将该线的该分段平行移动一段随机距离。然后添加2个额外的线段以将线的新位置连接到旧连接点。你的第二个例子显示了这个算法的一次迭代:如果A是(0,0)而B是(5,7)那么你随机选择第二个线段(垂直线段),在(0,5)选择端点)和(5,5)的中点,然后将该部分向右推3个单位,然后重新加入。
答案 2 :(得分:0)
这是一个想法---
从A开始并沿着随机方向移动 - 向左,向上或向下。每次移动后,滚动一个随机数以查看您是否转动。让我们说75%的时间你继续朝着同一个方向旅行,25%的时间你会转向。当你转弯时,总是转向更靠近B的方向。这意味着如果你向左或向右移动,你将不得不向上,如果你向上移动,做出一个向右/向左的选择根据你目前在球门右侧或左侧的距离。此外,如果你击中世界的一个边界,转过来!
编码应该不会太难。我有一种感觉,你只是想让它变得比它需要的更复杂......