游戏的寻路算法
Posted
技术标签:
【中文标题】游戏的寻路算法【英文标题】:Path-finding algorithm for a game 【发布时间】:2016-01-16 13:48:48 【问题描述】:我在大学里有这个任务,在那里我得到了一个涉及寻路的 C++ 游戏的代码。寻路是使用波函数进行的,分配要求我对寻路的工作方式进行一定的更改。
分配要求寻路总是选择离任何物体最远的路径,而不是空旷的空间。如下图所示:
这是我目前得到的结果:
下面我发布了更新功能中关于寻路的部分,因为我很确定我必须在这方面做出改变。
for (int y = 0, o = 0; y < LEVEL_HEIGHT; y++)
for (int x = 0; x < LEVEL_WIDTH; x++, o++)
int nCost = !bricks[o].type;
if (nCost)
for (int j = 0; j < 4; j++)
int dx = s_directions[j][0], dy = s_directions[j][1];
if ((y == 0 && dy < 0)
|| (y == LEVEL_HEIGHT - 1 && dy > 0)
|| (x == 0 && dx < 0)
|| (x == LEVEL_WIDTH - 1 && dx > 0)
|| bricks[o + dy * LEVEL_WIDTH + dx].type)
nCost = 2;
break;
pfWayCost[o] = (float)nCost;
如果需要进一步澄清问题,这里还有Wave function。
如果我有任何关于如何继续的想法,我将非常感激,因为我已经为此苦苦挣扎了很长一段时间了。
【问题讨论】:
如果你能用文字来描述差异而不是指向一个具体的例子会容易得多。 (您很有可能会在描述问题时解决问题。) 感谢您的建议,我已经添加了对分配的更深入的描述。 查看Voronoi Partitions,然后获取从开始到最近的分区边缘、从结束到最近的分区边缘以及从开始到结束沿着分区边缘的路径。通过警告,这对于平铺地图来说可能有点过分 据我所见,您将 1 的成本分配给空间之间的移动,将 2 的成本分配给从空间中不可能的移动。您应该选择成本,以便您想要的路径是最便宜的,因此您的成本应该以某种方式涉及到最近障碍物的距离。您使用浮点成本,因此您可以尝试 1 / d² 之类的东西。 (这种方法将涉及某种最近对象搜索或适当的权重预计算。) @M Oehm 我不确定我是否完全理解这一点。 'd' 在你的等式中代表什么? 【参考方案1】:您的问题可以简化为minimum-bottle-neck-spanning-tree。
为了减少,请执行以下操作:
-
计算空间中每个点/单元的成本,作为到对象的最小距离。
制作一个图,边对应于空间中的点,边的权重是上一步计算的成本。图的顶点对应单元格之间的边界。
对于具有 4 个成本为 10、20、3、5 的单元的一维空间:
|10|20|3|5|
图表如下所示:
A--(w=10)--B--(w=20)--C--(w=3)--D--(w=5)--E
节点 A-E 对应于单元格的边界。
-
例如运行Prim's algorithm 来查找MST。您正在寻找从入口点(在上面的示例中的 A)到结果树中的出口点 (E) 的直接方式。
【讨论】:
以上是关于游戏的寻路算法的主要内容,如果未能解决你的问题,请参考以下文章