前段時間遇到一個跨地圖尋路的需求,需要在任意兩個地圖之間自動尋路。我們的尋路算法用的是AStar,每個地圖都有一份格子數(shù)據(jù),地圖之間有傳送門通過。

首先這是一個最短路徑問題,常用的最短路徑算法有Dijkstra、Floyd。這里我的思路是選擇Dijkstra來實現(xiàn)。

具體的Dijkstar算法原理可以參考這兩篇文章:(反正我是學(xué)完就忘記了 笑哭~)

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

1.定義圖的數(shù)據(jù)結(jié)構(gòu)

    int MAXV;//最大頂點個數(shù)
    const int INF = int.MaxValue;    //INF表示∞ 無窮大

    struct MGraph                    //圖的定義
    {        public int[][] edges;       //鄰接矩陣
        public int n, e;             //頂點數(shù),弧數(shù)
        public VexterMapId[] vexs; //存放頂點信息
    };

把mapID設(shè)置到每個頂點數(shù)據(jù)里

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

2.根據(jù)傳送門配置,生成邊(連通頂點之間)。這里我是沒有計算AStar權(quán)值的,也就是默認(rèn)每張相鄰地圖連接邊的權(quán)值都是1。這樣其實是不精確的,如果你們游戲?qū)_度要求比較高的話,就要計算同一個地圖里的傳送點之間AStar路徑的權(quán)值。

        //建立圖的臨接矩陣
        for (int&nb
        
		

網(wǎng)友評論