unity常用算法-AStar(A*)算法

一、简介

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)
{
   
   
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值