A star 寻路算法实现(C++版本)

本文介绍了C++实现的A*寻路算法,包括MoveCoord和PathCoord类的定义,以及关键函数如cal_g、cal_h的实现。通过示例展示如何在特定场景中找到从起点到终点的路径,并提供了测试用例。
摘要由CSDN通过智能技术生成

rpg游戏中的寻路算法,写出来测试了一下,A*算法的理论我就不讲了

下面直接是代码,在centos 6.2 上编译测试,其他平台应该也没有问题。

---------------------------------------------Astar.h-----------------------------------------------------------

#include <stdlib.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)
{

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值