A *搜寻算法俗称A星算法。这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。常用于游戏中的NPC的移动计算,或线上游戏的BOT的移动计算上。
首先:1、在Map地图中任取2个点,开始点和结束点
2、首先判断该点是不是不可以穿越的点,或者是已经再close中了
3、如果2步骤为真,什么都不做,如果为假,那么我们就进行添加了
4、如果在添加的时候,发现该点在open中不存在,那么我们直接添加,而且视之为当前节点,如果该点 存在open中,那么我们比较G值,如果发现当前节点到该节点的G小于原来的G,那么再重新设置G,F值, 然后设置这个节点为当前节点。
5、再添判断玩之后,再添加它的4个邻接点,循环1-4的步骤。直至找到,或者说是open中为null了的时 候,就结束查询了。
代码如下:
#include <iostream>
#include <string>
#include "AStartMap.h"
using namespace std;
int main() {
AstartMap *gameMap = new AstartMap;
gameMap->initMap();
if(gameMap != 0) {
delete gameMap;
gameMap = 0;
}
return 0;
}
#ifndef ASTARTNODE_H_
#define ASTARTNODE_H_
class AStartNode
{
public:
AStartNode();
~AStartNode();
public:
void setPos(int icol, int irow);
void setG(int iG);
int getG();
void setH(int iH);
int getH();
void setF(int iF);
void setFID(int iFID);
int getFID();
int getF();
int getCol();
int getRow();
private:
int m_Col;
int m_Row;
int m_G;
int m_H;
int m_F;
int m_FID;
};// end of AStartNode
#endif // end of ASTARTNODE_H_
#include "AStartNode.h"
AStartNode::AStartNode() : m_Col(0), //
m_Row(0),
m_G(0),
m_H(0),
m_F(0),
m_FID(0)
{
}
AStartNode::~AStartNode() {
}
void AStartNode::setPos(int icol, int irow) {
m_Col = icol;
m_Row = irow;
}
void AStartNode::setG(int iG) {
m_G = iG;
}
int AStartNode::getG() {
return m_G;
}
void AStartNode::setH(int iH) {
m_H = iH;
}
int AStartNode::getH() {
return m_H;
}
void AStartNode::setF(int iF) {
m_F = iF;
}
int AStartNode::getF() {
return m_F;
}
int AStartNode::getCol() {
return m_Col;
}
int AStartNode::getRow() {
return m_Row;
}
void AStartNode::setFID(int iFID) {
m_FID = iFID;
}
int AStartNode::getFID() {
return m_FID;
}
#ifndef ASTARTMAP_H_
#define ASTARTMAP_H_
#include <vector>
class AStartNode;
class AstartMap
{
public:
typedef enum {
STARTMAP_COL = 10,
STARTMAP_ROW = 10,
} StartMap;
typedef enum {
MAPPATH_BEGINPOINT = -2,
MAPPATH_WALL = -1,
MAPPATH_ROAD = 0,
MAPPATH_ENDPOINT = 2,
} MapPath;
typedef enum {
STARTNODE_G = 10,
STARTNODE_H = 10,
}StartNodeInfo;
public:
AstartMap();
~AstartMap();
public:
void initMap();
private:
void _initMapBoard();
void _initSelectBeginPoint();
void _addIntoCloseNode(AStartNode *newClo