Cocos2d-x 3.1.1 学习日志16--A星算法(A*搜寻算法)的学习

    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
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值