游戏的寻路算法

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) 的直接方式。

【讨论】:

以上是关于游戏的寻路算法的主要内容,如果未能解决你的问题,请参考以下文章

基于深度优先搜索的寻路算法及其进一步的探究

Unity专题_简单的寻路导航

具有时间限制的图上的寻路(路由、旅行计划……)算法

5 X 5 方阵引出的寻路算法 之 路径遍历(完结)

Unity A星(A Star/A*)寻路算法

寻路算法之A*算法详解