前段时间遇到一个跨地图寻路的需求,需要在任意两个地图之间自动寻路。我们的寻路算法用的是AStar,每个地图都有一份格子数据,地图之间有传送门通过。

首先这是一个最短路径问题,常用的最短路径算法有Dijkstra、Floyd。这里我的思路是选择Dijkstra来实现。

具体的Dijkstar算法原理可以参考这两篇文章:(反正我是学完就忘记了 笑哭~)

透彻理解迪杰斯特拉算法
最短路径—Dijkstra算法和Floyd算法

1.定义图的数据结构

    int MAXV;//最大顶点个数
    const int INF = int.MaxValue;    //INF表示∞ 无穷大

    struct MGraph                    //图的定义
    {        public int[][] edges;       //邻接矩阵
        public int n, e;             //顶点数,弧数
        public VexterMapId[] vexs; //存放顶点信息
    };

把mapID设置到每个顶点数据里

        for (int i = 0; i < MAXV; i++)
        {
            g.vexs[i].mapID = mapNodeList[i];
        }

2.根据传送门配置,生成边(连通顶点之间)。这里我是没有计算AStar权值的,也就是默认每张相邻地图连接边的权值都是1。这样其实是不精确的,如果你们游戏对精确度要求比较高的话,就要计算同一个地图里的传送点之间AStar路径的权值。

        //建立图的临接矩阵
        for (int&nb