rpg游戏中的寻路算法,写出来测试了一下,A*算法的理论我就不讲了
下面直接是代码,在centos 6.2 上编译测试,其他平台应该也没有问题。
---------------------------------------------Astar.h-----------------------------------------------------------
#include <list>
//移动坐标
class MoveCoord
{
public:
MoveCoord(int grid_x=-1, int grid_y=-1);
MoveCoord& operator+(const MoveCoord& coord);
MoveCoord& operator+=(const MoveCoord& coord);
bool operator==(const MoveCoord coord);
bool operator!=(const MoveCoord& coord);
MoveCoord& operator=(const MoveCoord& coord);
public:
int grid_x;//格子坐标x
int grid_y;//格子坐标y
};
//寻路坐标
class PathCoord
{
public:
PathCoord(void);
PathCoord(MoveCoord parent,MoveCoord cur);
virtual ~PathCoord();
int get_f(void) const;
MoveCoord parent;//父坐标
MoveCoord cur;//当前坐标
int g_value;//起点到该点的G值
int h_value;//该点到目标点都f值
};
typedef std::list<MoveCoord> CoordList;
typedef bool (*IsMovableCoord)(int scene_id,int coord_x,int coord_y);
class AStar
{
public:
AStar(void){};
virtual ~AStar(void){};
/* 在场景scene_id中寻找从src 到 dst的路径,找到之后保存再coord_list中,返回true。否则返回false
* 参数 IsMovableCoord:判断坐标是否可走的函数,可走返回true,否则返回false
*/
static bool FindPath(const int scene_id,MoveCoord src,MoveCoord dst,IsMovableCoord is_movable,CoordList& coord_list);
};
#endif
---------------------------------------------Astar.cpp-----------------------------------------------------------
#include <queue>
#include <map>
#include "AStar.h"
MoveCoord::MoveCoord(int grid_x, int grid_y)
{
this->grid_x = grid_x;
this->grid_y = grid_y;
}
MoveCoord& MoveCoord::operator+(const MoveCoord& coord)
{
this->grid_x +=coord.grid_x;
this->grid_y +=coord.grid_y;
return *this;
}
MoveCoord& MoveCoord::operator+=(const MoveCoord& coord)
{