一、简介
AStar(A*)算法,是一种在静态网格中求解最短路径直接有效的搜索方法。在游戏开发中,A * 算法常应用于部分RPG游戏和策略战棋类游戏。对于Unity开发者来说,掌握A * 算法也是十分有必要的。不过在了解A算法之前,有必要先回顾一下深度优先算法(DFS)、广度优先算法(BFS)以及迪杰斯特拉算法(Dijkstra),这是理解和掌握A算法的必要基础。
二、前置知识
1、深度优先算法(DFS)
所谓深度优先,通俗一点解释就是:先选择一个方向头也不回的一条路走到黑,再回头从另一个方向又一条路走到黑,如此往复直到走遍整张图。
算法的基本流程是:
获取给定起点周围未访问的邻接节点
对这些邻接节点进行递归,直到所有节点访问完毕
private void StartDFS(int x, int y, bool[] visits = null)
{
if (visits == null)
{
visits = new bool[map.Length * map[0].Length];
}
if (x >= 0 && x <= map.Length && y >= 0 && y <= map[0].Length)
{
int index = x + y * map.Length + 1;
if (!visits[index - 1])
{
visits[index - 1] = true;
Debug.Log("(x:+" + x + ",y:" + y + ")");
StartDFS(x - 1, y, visits);//左边的邻接节点
StartDFS(x + 1, y, visits);//右边的邻接节点
StartDFS(x, y - 1, visits);//下边的邻接节点
StartDFS(x, y + 1, visits);//上边的邻接节点
}
}
}
上面我的访问优先级是左、右、下、上。
为了更好地进行理解,可以调换一下顺序,比如:上、右、下、左

3、广度优先算法(BFS)
而广度优先顾名思义就是优先访问周围的邻接节点,像水流一样慢慢的向外扩张,直到走遍整张图。
算法的基本流程是:
1、把给定起点入队
2、从队列中出队一个点
3、获取该点周围邻接的未访问节点,并逐个入队
4、重复2,3步骤直到所有点访问完毕
private void StartBFS(int x, int y)
{
bool[] visits = new bool[map.Length * map[0].Length];
Queue<int> bfs = new Queue<int>();
int index = x + y * map.Length + 1;
bfs.Enqueue(index);
visits[index - 1] = true;
while (bfs.Count > 0)
{
int currIndex = bfs.Dequeue();
int currX = (currIndex - 1) % map.Length;
int currY = (currIndex - 1) / map.Length;
m_QueuePoints.Enqueue(currIndex);
AddPoint(currX - 1, currY, bfs, visits);
AddPoint(currX + 1, currY, bfs, visits);
AddPoint(currX, currY - 1, bfs, visits);
AddPoint(currX, currY + 1, bfs, visits);
}
}
private void AddPoint(int x, int y, Queue<int> bfs, bool[] visits)
{

最低0.47元/天 解锁文章
2591

被折叠的 条评论
为什么被折叠?



