前段時間遇到一個跨地圖尋路的需求,需要在任意兩個地圖之間自動尋路。我們的尋路算法用的是AStar,每個地圖都有一份格子數(shù)據(jù),地圖之間有傳送門通過。
首先這是一個最短路徑問題,常用的最短路徑算法有Dijkstra、Floyd。這里我的思路是選擇Dijkstra來實現(xiàn)。
具體的Dijkstar算法原理可以參考這兩篇文章:(反正我是學完就忘記了 笑哭~)
透徹理解迪杰斯特拉算法
最短路徑—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ù)據(jù)里
for (int i = 0; i < MAXV; i++) { g.vexs[i].mapID = mapNodeList[i]; }
2.根據(jù)傳送門配置,生成邊(連通頂點之間)。這里我是沒有計算AStar權(quán)值的,也就是默認每張相鄰地圖連接邊的權(quán)值都是1。這樣其實是不精確的,如果你們游戲?qū)_度要求比較高的話,就要計算同一個地圖里的傳送點之間AStar路徑的權(quán)值。
//建立圖的臨接矩陣 for (int&nb