当前位置: 首页 > article >正文

游戏AI实现-寻路算法(DFS)

​深度优先搜索算法(英语:Depth-First-Search,缩写为DFS)是一种用于遍历或搜索树或图的算法。

寻路地图搭建:

游戏AI实现-寻路地图搭建-CSDN博客

算法过程:遍历方向为从竖直向上沿顺时针方向

1.首先将开始节点放入队列中。注:黄色代表已检测、灰色代表已检测不符合的节点。

------------------>

2.从队列中取出第一个节点,检测是否为目标点。

  如果是则返回目标点,否则将没有检测过的子节点加入到队列中。

按照从遍历方向不停的将子节点加入队列。。。。

3.如果当前不存在未检测的直接子节点,则将父节点加入到队列中,

   重复步骤2,直到找到目标点。

代码实现:

寻路算法类:

public class DFS : FindPathAlgorithm
{
    public DFS(int[,] mapData, int xCount, int zCount) : base(mapData, xCount, zCount){}

    public override List<Vector2Int> FindPath(Vector2Int startPos, Vector2Int goalPos)
    {
        DataNode dataNode = this.DFSFind(startPos, goalPos);
        if (dataNode == null)
        {
            Debug.LogError("寻路有误,请检查参数是否正确");
            return null;
        }
        return Utils.GetPath(dataNode);
    }


    public DataNode DFSFind(Vector2Int startPos, Vector2Int goalPos)
    {
        //存储要检测的点
        Queue<DataNode> frontier = new Queue<DataNode>();
        //存储已经检测的点
        List<Vector2Int> reached = new List<Vector2Int>();

        frontier.Enqueue(new DataNode(startPos, null));
        reached.Add(startPos);

        while (frontier.Count > 0)
        {
            DataNode currentNode = frontier.Dequeue();
            if (currentNode.pos == goalPos)
            {
                return new DataNode(goalPos, currentNode.parent);
            }

            Vector2Int nextNodePos = GetNextNode(currentNode.pos, reached);
            //如果没有找到合适的子节点,就将当前节点的父节点加入队列
            if(nextNodePos.x >= 99999999)
            {
                frontier.Enqueue(currentNode.parent);
            }
            else
            {
                frontier.Enqueue(new DataNode(nextNodePos, currentNode));
                reached.Add(nextNodePos);
            }
        }
        return null;
    }

    Vector2Int GetNextNode(Vector2Int current, List<Vector2Int> reached) {
        for (int i = 0; i < Utils.pointDir.Count; i++)
        {
            Vector2Int neighbor = current + Utils.pointDir[i];
            if (this.IsCanAdd(neighbor, reached))
            {
                return neighbor;
            }
        }
        return Vector2Int.one * int.MaxValue;
    }

    bool IsCanAdd(Vector2Int current, List<Vector2Int> reached)
    {
        if (reached.Contains(current))
            return false;
        if (current.x >= 0 && current.y >= 0 && current.x < xCount && current.y < zCount)
        {
            //如果是障碍物,则不能被Add
            if (this.mapData[current.y, current.x] == 1)
            {
                return false;
            }
            return true; 
        }
        return false;
    }
}

结果:

参考链接:

DFS Pathfinding | Unity (youtube.com)

深度优先搜索 - 维基百科,自由的百科全书 (wikipedia.org)

Depth First Search (DFS) Explained: Algorithm, Examples, and Code - YouTube


http://www.kler.cn/a/444131.html

相关文章:

  • 13.罗意文面试
  • 熟悉u8g2图形库C语言函数
  • webGL硬核知识:图形渲染管渲染流程,各个阶段对应的API调用方式
  • aosp15 - Activity生命周期切换
  • 回归预测 | MATLAB实现CNN-BiGRU-Attention卷积神经网络结合双向门控循环单元融合注意力机制多输入单输出回归预测
  • K8s 节点 NotReady 后 Pod的变化
  • ESP-AT 固件:物联网智能 “引擎”
  • C语言学习day22:URLDownloadToFile函数/开发文件下载工具
  • [python]使用flask-caching缓存数据
  • QT图形/视图架构详解(二)
  • Oracle 技术精选学习
  • VScode使用教程(菜鸟版)
  • Day26下 - BERT项目实战
  • 2024 年的科技趋势
  • vue-cli 5接入模块联邦 module federation
  • 【GO环境安装】mac系统+GoLand使用
  • nginx 记录完整的 request 及 response
  • 使用JustAuth实现gittee登录
  • 中型项目下的 MySQL 挑战与应对
  • 利用Python爬虫实现数据收集与挖掘
  • 音视频入门基础:MPEG2-TS专题(18)——PES流简介
  • HTML基本标签详解
  • MySQL Explain 分析SQL语句性能
  • PostgreSQL: 事务年龄
  • python学opencv|读取图像(十四)BGR图像和HSV图像通道拆分
  • 医院与医疗设备供应商网络安全事故综述