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)
{