JPS(Jump Point Search) C# 跳点寻路算法完整代码实现

1.引言

        ①:本文不提供跳点寻路算法基本概念,因为别的博主有很多写的非常好,看本文之前最好先去了解一下跳点寻路算法的基本概念与思路。

        ②:代码写的是很基础的语法,适合初学者,不包含高级写法,因为跟我一样的初学者看那些高级语法代码,简直头疼,云里雾里,所以写完整的C#代码只是为初学者有个基本的代码过程概念,想深入研究还得靠其他博主的文章。

2.代码

  2.1 寻路类

//寻路类
class JpsSearch
{
    //模拟地图 初定地图大小  10*20
    //1:起点  9:终点    8:障碍     7:寻路的路经
    byte[,] map = new byte[,]
    {
        {0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0 },
        {0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0 },
        {0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0 },
        {0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0 },
        {0,0,0,0,1,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0 },
        {0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,8,0,0 },
        {0,0,0,0,0,0,0,0,0,0,0,8,0,8,0,0,8,0,0,0 },
        {0,0,0,0,0,0,0,0,0,0,0,8,0,8,0,0,8,9,8,0 },
        {0,0,0,0,0,0,0,0,0,0,0,8,0,8,8,0,0,8,0,0 },
        {0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0 },
    };

    //地图大小
    int mapX = 10;
    int mapY = 20;


    //起点和终点
    Point startPoint;
    Point endPoint;

    //开启表  
    List<Point> openList;
    //封闭表
    List<Point> closeList;

    public void FindMain()
    {
        //定义起点
        startPoint = new Point(4, 4);
        startPoint.G = 0;
        startPoint.H = 0;

        //定义终点
        endPoint = new Point(7, 17);
        endPoint.G = 0;
        endPoint.H = 0;

        //开启表
        openList = new List<Point>();
        //封闭表
        closeList = new List<Point>();


        //openList 链表中第一个
        Point firstPoint;

        //跳点
        Point jumpPoint;

        //邻居节点
        Point neighbourPoint;

        //当前点的邻居点
        List<Point> neighbourList = new List<Point>();

        //方向
        int xDIr, yDir;

        //将起点加入开启表中
        if(startPoint.x == endPoint.x && startPoint.y == endPoint.y )
        {
            startPoint = endPoint;
        }
        else
        {
            openList.Add(startPoint);
        }


        while(openList.Count >0)
        {
                
            //获取第总估计路程最少F的节点,默认以及从小到大排序
            firstPoint = openList.First();
            openList.RemoveAt(0);

            //放入封闭表中
            closeList.Add(firstPoint);

            //获取当前节点的邻居节点
            neighbourList = NeighboursList(firstPoint);
            //遍历所有邻居节点
            for (int i = 0; i < neighbourList.Count; i++)
            {
                //记录一个邻居节点
                neighbourPoint = neighbourList[i];
                //先检测当前邻居节点是否是终点
                if(neighbourPoint.x == endPoint.x && neighbourPoint.y == endPoint.y)
                {
                    endPoint.parentPoint = firstPoint;
                    openList.Clear();
                    break;
                }

                //方向
                xDIr = Math_Dir(neighbourPoint.x - firstPoint.x);
                yDir = Math_Dir(neighbourPoint.y - firstPoint.y);

                //找到跳跃点
                jumpPoint = SearchPoint(neighbourPoint.x,neighbourPoint.y,xDIr,yDir);
                   
                if(jumpPoint != null)
                {
           
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值