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)
                {
           
在Python中实现JPSJump Point Search搜索)算法通常用于路径寻找问题,特别是在处理地形图、游戏地图等空间数据结构中,它比传统的遍历方法更高效。这里是一个简化版的JPS算法的伪代码示例,并非完整代码,因为完整实现会涉及一些库如`networkx`或`pygame`,以及一些辅助函数: ```python # 假设你有一个表示地图的二维列表grid,0代表空地,1代表障碍物 def is_passable(grid, x, y): return grid[x][y] == 0 def get_neighbors(x, y, grid_size): # 获取周围邻居坐标 return [(x + dx, y + dy) for dx, dy in [(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)] if 0 <= x + dx < grid_size and 0 <= y + dy < grid_size] def jps_search(start, end, grid): stack = [(start, [])] came_from = {} came_from[start] = None while stack: current, path = stack.pop() if current == end: break for next in get_neighbors(current[0], current[1], len(grid)): if is_passable(grid, *next): new_path = path + [current] if next not in came_from or len(new_path) < len(came_from[next]): came_from[next] = new_path if next not in stack: stack.append((next, new_path)) return came_from[end] if end in came_from else None # 使用示例 start = (0, 0) end = (grid_size - 1, grid_size - 1) path = jps_search(start, end, grid) ``` 注意这只是一个基础版本,实际应用中可能会需要优化算法,例如添加优先级队列来加速搜索过程,或者考虑复杂的地形规则。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值