这是我依据这篇博文http://hi.baidu.com/wsapyoemdfacmqr/item/bdfb5c0a74c904d01ef0466d。来在cocos2dx上编写。这是终于的效果图:

红色的地方是执行轨迹,黑色是禁止区域,接下来是代码,请结合那篇博文观看:

首先创建地板类,必需要有x和y,还有依据那篇博文的h和g。这是h文件里的代码:

#include "cocos2d.h"



typedef enum _FloorState

{

    FloorGround,

    FloorRiver

} FloorState;



class Floor : public cocos2d::LayerColor

{

public:

    Floor();

    ~Floor(){}

    

    static int at(int x, int y);

    static Floor * create(const cocos2d::Color4B& color);

    bool initWithColor(const cocos2d::Color4B& color);

    

    int getF();

    

private:

    CC_SYNTHESIZE(int, _x, X);

    CC_SYNTHESIZE(int, _y, Y);

    

    CC_SYNTHESIZE(int, _h, H);

    CC_SYNTHESIZE(int, _g, G);

    

    CC_SYNTHESIZE(FloorState, _landForm, LandForm);

    

    CC_SYNTHESIZE(Floor *, _lastFloor, LastFloor);

};

基本上没有什么难度,另外,那个静态方法at使用了从数组中高速获取地板。

然后是cpp文件:

#include "Floor.h"



USING_NS_CC;



Floor::Floor()

{

    _x = 0;

    _y = 0;

    

    _h = -1;

    _g = -1;

    

    _lastFloor = NULL;

}



int Floor::at(int x, int y)

{

    return x + 28 * y;

}



Floor *Floor::create(const cocos2d::Color4B &color)

{

    Floor *_floor = new Floor();

    if ( _floor && _floor -> initWithColor( color ) )

    {

        _floor -> autorelease();

        return _floor;

    }

    

    delete _floor;

    _floor = NULL;

    return NULL;

}



bool Floor::initWithColor(const cocos2d::Color4B &color)

{

    if ( LayerColor::initWithColor(color, 39, 39) )

    {

        return true;

    }

    

    return false;

}



int Floor::getF()

{

    return _h + _g;

}

然后在执行的Layer中:

void MainScene::createGround()

{

    for (int y = 0; y < 18; y++)

    {

        for (int x = 0; x < 28; x++)

        {

            auto _floor = Floor::create( Color4B(255, 255, 255, 255) );

            _floor -> setPosition(x * (_floor -> getContentSize().width + 1), y * (_floor -> getContentSize().height + 1));

            _floor -> setX(x);

            _floor -> setY(y);

            _floor -> setLandForm( FloorGround );

            this -> addChild( _floor );

            

            if ( (x == 15 && y < 7) || (x == 3 && y < 10) || (y == 12 && x < 20) || (x == 5 && y > 8) || (x == 13 && y > 1) )

            {

                _floor -> setColor( Color3B(0, 0, 0) );

                _floor -> setLandForm( FloorRiver );

            }

            ground.pushBack( _floor );

        }

    }

}

当中,这种方法:_floor -> setLandForm( FloorRiver )使用来制造禁止区域

然后加入起点和终点:

end = Floor::create( Color4B(0, 255, 255, 10) );

    end -> setPosition( (ground.at( Floor::at(24, 14) )) -> getPosition() );

    end -> setX(24);

    end -> setY(14);

    this -> addChild( end );

    

    origin = Floor::create( Color4B(255, 255, 0, 255) );

    origin -> setPosition( (ground.at( Floor::at(0, 0) )) -> getPosition() );

    origin -> setX(0);

    origin -> setY(0);

    origin -> setH( fabs((end -> getX() - origin -> getX())) + fabs( end -> getY() - origin -> getY() ) );

    origin -> setG(0);

    this -> addChild( origin );

    open.pushBack( origin );

在这些完毕后,就是须要使用A*算法来计算出路径了

首先从open数组中寻找F最小的地板;之后。将上下左右的地板做个推断,是否增加数组中。这部分放在一个死循环中,当增加的地板正是终点时,能够结束:

while (1)

    {

        Vector< Floor * >::iterator index = open.begin();

        Vector< Floor * >::iterator minF = index;

        for (; index != open.end(); index++)

        {

            if ( (*index) -> getF() < (*minF) -> getF() )

            {

                minF = index;

            }

        }

        

        Floor *_origin = (*minF);

        

        handleFloor(_origin, _origin -> getX(), _origin -> getY() - 1);

        handleFloor(_origin, _origin -> getX(), _origin -> getY() + 1);

        handleFloor(_origin, _origin -> getX() - 1, _origin -> getY());

        handleFloor(_origin, _origin -> getX() + 1, _origin -> getY());

        

        open.eraseObject( _origin );

        close.pushBack( _origin );

        _origin -> setColor( Color3B(0, 255, 0) );

        

        Floor *getEnd = open.at( open.size() - 1 );

        if ( getEnd -> getX() == end -> getX() && getEnd -> getY() == end -> getY() )

        {

            CCLOG("ENDG");

            return;

        }

    }

handleFloor函数是用来推断该地板是否可以增加数组中

void MainScene::handleFloor(Floor *_floor, int x, int y)

{

    if ( x < 0 || y < 0 )

    {

        return;

    }

    Floor *handle = ground.at( Floor::at(x, y) );

    handle -> setX(x);

    handle -> setY(y);

    handle -> setH( fabs((end -> getX() - handle -> getX())) + fabs( end -> getY() - handle -> getY() ) );

    handle -> setG( fabs((origin -> getX() - handle -> getX())) + fabs( origin -> getY() - handle -> getY() ) );

    JUDGE( handle, _floor );

}

#define JUDGE(__FLOOR__, __LAST__)    \

if ( !open.contains(__FLOOR__) && !close.contains(__FLOOR__) && __FLOOR__ -> getLandForm() != FloorRiver )  \

{ \

open.pushBack( __FLOOR__ ); \

__FLOOR__ -> setColor( Color3B(100, 100, 100) ); \

__FLOOR__ -> setLastFloor( __LAST__ );  \

}   \

之后,就是取出open数组终的最后一块地板,并能够获取这块地板的上一块地板。并将其颜色改变

Floor *index = open.at( open.size() - 1 );

    

    while ( index -> getLastFloor() != NULL )

    {

        index -> setColor( Color3B(255, 0, 0) );

        index = index -> getLastFloor();

    }

在这里下载

cocos2dx下的A星算法的更多相关文章

  1. Cocos2d-x 3.1.1 学习日志16--A星算法(A*搜索算法)学问

    A *搜索算法称为A星算法.这是一个在图形平面,路径.求出最低通过成本的算法. 经常使用于游戏中的NPC的移动计算,或线上游戏的BOT的移动计算上. 首先:1.在Map地图中任取2个点,開始点和结束点 ...

  2. 算法起步之A星算法

    原文:算法起步之A星算法 用途: 寻找最短路径,优于bfs跟dfs 描述: 基本描述是,在深度优先搜索的基础上,增加了一个启发式算法,在选择节点的过程中,不是盲目选择,而是有目的的选的,F=G+H,f ...

  3. Java开源-astar:A 星算法

    astar A星算法Java实现 一.适用场景 在一张地图中,绘制从起点移动到终点的最优路径,地图中会有障碍物,必须绕开障碍物. 二.算法思路 1. 回溯法得到路径 (如果有路径)采用“结点与结点的父 ...

  4. A星算法(Java实现)

    一.适用场景 在一张地图中.绘制从起点移动到终点的最优路径,地图中会有障碍物.必须绕开障碍物. 二.算法思路 1. 回溯法得到路径 (假设有路径)採用"结点与结点的父节点"的关系从 ...

  5. Cocos2d-x下Lua调用自定义C++类和函数的最佳实践[转]

    Cocos2d-x下Lua调用C++这事之所以看起来这么复杂.网上所有的文档都没讲清楚,是因为存在5个层面的知识点: 1.在纯C环境下,把C函数注册进Lua环境,理解Lua和C之间可以互相调用的本质 ...

  6. 【转】Cocos2d-x下Lua调用自定义C++类和函数的最佳实践

    转自:http://segmentfault.com/blog/hongliang/1190000000631630 关于cocos2d-x下Lua调用C++的文档看了不少,但没有一篇真正把这事给讲明 ...

  7. POJ 2449 Remmarguts' Date (SPFA + A星算法) - from lanshui_Yang

    题目大意:给你一个有向图,并给你三个数s.t 和 k ,让你求从点 s 到 点 t 的第 k 短的路径.如果第 k 短路不存在,则输出“-1” ,否则,输出第 k 短路的长度. 解题思路:这道题是一道 ...

  8. A*搜寻算法(A星算法)

    A*搜寻算法[编辑] 维基百科,自由的百科全书 本条目需要补充更多来源.(2015年6月30日) 请协助添加多方面可靠来源以改善这篇条目,无法查证的内容可能会被提出异议而移除. A*搜索算法,俗称A星 ...

  9. 痞子衡嵌入式:MCUXpresso IDE下使用J-Link下载算法在Flash调试注意事项(i.MXRT500为例)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下使用J-Link下载算法在Flash调试注意事项. 痞子衡前段时间写过一篇小文<为i.MXRT设计更 ...

随机推荐

  1. Oracle安装和使用说明

    很久没有安装Oracle了,今天试了一下重新安装Oracle,然后做了一个总结: 一.Oracle 下载 注意Oracle分成两个文件,下载完后,将两个文件解压到同一目录下即可. 路径名称中,最好不要 ...

  2. MySQL5.7 的 错误堆栈缓冲

    什么是错误缓冲堆栈呢? 举个非常简单的样例,比方运行以下一条语句:mysql> INSERT INTO t_datetime VALUES(2,'4','5');ERROR 1292 (2200 ...

  3. kqueue演示样例

    网络server通常都使用epoll进行异步IO处理,而开发人员通常使用mac,为了方便开发.我把自己的handy库移植到了mac平台上. 移植过程中,网上竟然没有搜到kqueue的使用样例.让我吃惊 ...

  4. JStorm中的并行( parallelismction )介绍

    JStorm中的并行( parallelismction )介绍 JStrom中.一个计算任务通过多台机器使得计算分解为多个独立并行执行在集群内执行的任务(tasks).从而得到水平扩展. JStor ...

  5. 【HDOJ 5407】 CRB and Candies (大犇推导

    pid=5407">[HDOJ 5407] CRB and Candies 赛后看这题题解仅仅有满眼的迷茫------ g(N) = LCM(C(N,0),C(N,1),...,C(N ...

  6. HttpClient get和HttpClient Post请求的方式获取服务器的返回数据

    1.转自:https://blog.csdn.net/alinshen/article/details/78221567?utm_source=blogxgwz4 /*  * 演示通过HttpClie ...

  7. Kotlin 中文文档

    Kotlin 中文文档 标签: Kotlinkotlin中文文档 2017-02-14 18:14 4673人阅读 评论(0) 收藏 举报  分类: kotlin 转载地址:http://www.tu ...

  8. Codeforces 988F. Rain and Umbrellas

    解题思路:动态规划 遍历点i,如果从前一个点i-1走到这个点i不需要伞,则疲劳值不变dp[i] = dp[i-1]. 如果前一个点i-1走到这一个点i需要伞,则从前面找一把伞. 即遍历前面的每个点j, ...

  9. AOJ GRL_1_B: Shortest Path - Single Source Shortest Path (Negative Edges) (Bellman-Frod算法求负圈和单源最短路径)

    题目链接: http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=GRL_1_B   Single Source Shortest Path ...

  10. DotNetCore.1.0.1-VS2015Tools.Preview2.0.3 相关问题及解决办法

    本月16号,MS发布了 .NET Core 1.1.作为一个用贯MS产品的小盆友,我第一时间就把相关的安装包下载下来了,然后果断安装(入坑). 我猜你来看这篇博客可能遇到了和我一样的问题. 问题0:正 ...