最近在给自己的坦克大战升级AI .让坦克具有AI那就要牵扯到自动寻路。寻路里面又分最优路径(距离最短)和最快路径(计算量最少 但可能会绕路)这两种本文都会讲到。第一种主流的就是A*算法了第二种网上叫Best First Search 最佳优先搜索。
下面就开始讲讲A*理论上的一些东西。这些百度一下很多。但是看了很多都是模糊的理论没有代码,要么就是代码错误BUG一堆没法玩。没办法只能自己动手了。先上一张动图 程序最终样子。本程序带地图编辑器功能 ,可以自己绘制 边界 终点目标点 障碍。然后选择 A*算法还是BFS算 。进行演示。
在这个图中我们定义了一个[7x8]的矩形空间 起点 Start A点黄色坐标(1,3) 目标点Des B点坐标(5,4)
A*里面最核心的公式 F=G+H;
G是什么? G就是每走一步代价。啥意思呢,就是你给你每走一步定义一个值。以上图 A点四周上下左右随便移动一格就是一步代价A本身G=0。这个值定多少随你。一般方便计算都取10,也就是移动一格G就+10。
对于八方向的也同理 (本文讲四方向)斜角方向取G值√2倍(正方形的对角线长是边长的√2倍)方便计算一般取14。
H是什么?,H叫估价函数。也就是起点到A点大概多远估计一下。A*搜索算法是一种启发式算法。之所以叫启发是因为它有一种策略指引它去寻找目标点。而不是像其他算法无目的的全遍历找到目标。这个估算函数怎么表示 有很多种曼哈顿法 欧氏法等。一般都是曼哈顿法。名字高大上 其实就是两个坐标点的 (x相减的绝对值+y相减的绝对值) 两点间的横向距离加上纵向距离 参照这个方法 A到B的H值就是|1-5|+|3-4|=5.一般实际计算时再乘10 和G值配合好计算。看下代码
//计算G值,G=从起点 A 移动到指定方格的移动代价,沿着到达该方格而生成的路径
//参数1 要去的节点
//参数2 目前在的节点
int Astar::CalcG(NODE *cur,NODE *pcur)
{
//当前点移动到该点的代价 定义为10
if (cur->x== pcur->x || cur->y== pcur->y)
return 10;
return 20;
}
//估值H
//普通曼哈顿法 取(当前点x-目标x 的绝对值) + (当前点y-目标点y的绝对值) 两者相加乘10
int Astar::CalcH(NODE *cur)
{ //控制台画方格是占两个字节 所以这边除以2
return ((abs(cur->x -