Cocos2d-x 小试牛刀五子连珠游戏

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cocos2d-x 小试牛刀五子连珠游戏相关的知识,希望对你有一定的参考价值。

Cocos2d-x
小试牛刀五子连珠游戏

声明:本文游戏使用的是cocos2d-x-3.13的代码

 

游戏介绍

本文将介绍有Cocos编写经典游戏,五子连珠。游戏规则,有一个10*10的棋盘,里面有六种颜色的珠子,点击棋盘的珠子可以移动到任意有开放路径的位置,如果横、竖、斜、反斜可以连接相同颜色珠子数大于等于5个,就可以消除。如果移动珠子后没有消除珠子,则会增3个珠子,如果棋盘被所有珠子填满则游戏结束。

 

游戏界面如下:

 

 技术分享技术分享

游戏代码

游戏代码下载地址:https://pan.baidu.com/s/1gf9mlzH

为减少代码大小,代码只保留了,VS2015 win32的编译环境和资源,并删除了Cocos中没有使用的部分功能。

 

去除Cocos中部分不用的功能

Cocos中的ccConfig.h头文件中包含一些宏,可以控制一些功能的开启于关闭

例如

是否使用粒子特效

/**Use physics integration API. */

#ifndefCC_USE_PHYSICS

#defineCC_USE_PHYSICS 0

#endif

是否开启3D NavMesh网格渲染

/**Use 3D navigation API */

#ifndefCC_USE_NAVMESH

#defineCC_USE_NAVMESH 0

#endif

这两个功能都在本游戏中都没有使用,所以都关闭。

 

 

游戏实现

游戏场景树:


技术分享

游戏中有两个场景,主菜单场景(MainScene)和游戏场景(GameScene)

 

 

ball

ball类主要封装了珠子类,继承至Sprite类,代码如下:

class Ball :public cocos2d::Sprite{
public:
    Ball();
    ~Ball();
    virtual bool init() override;
    CREATE_FUNC(Ball)
    void SetColor(int n);
    int GetColor() { return icolor;  }
    void SetXY(int x, int y) {  this->x = x; this->y = y;   }
    int GetX(){ return x; }
    int GetY(){ return y; }
    void SetClickFun(std::function<void(Ball*)> callback);
    bool touchBegin(cocos2d::Touch *t, cocos2d::Event *e);
    void touchEnd(cocos2d::Touch *t, cocos2d::Event *e);
private:
    int x, y;//在棋盘中的位置
    int icolor;//棋子颜色。
    std::function<void(Ball*)> callback;
    static char *color[6];//棋盘的六种颜色
    static cocos2d::SizeBallSize;
    static bool StaticInit;
};

纹理

ball的六种颜色珠子纹理,采用TexturePacker打包成一个大图,这样可以让所有的珠子在一个Draw
Call
中渲染,提高渲染速度。

 技术分享

点击事件

每个Ball都可以调用SetClickFun注册监听事件,如果被点击了可以以调用回掉函数对象callback

点击事件会在touchBegin事件中判断是否点击到了该节点,在touchEnd事件中判断是否要对事件进行处理,如要要则会调用callback

 

 

Board棋盘类

游戏主要功能实现在Board棋盘类中,代码如下:

class Board:public cocos2d::Layer
{
public:
    typedef std::vector< std::pair<int,int>> Path;
 
    Board();
    virtual ~Board();
 
    virtual bool init() override;
 
    CREATE_FUNC(Board)
 
    void OnSelect(Ball* b);//处理珠子的点击事件
    bool AddBall();//添加新的珠子,并生成下一次使用的珠子
    int ClearBall(intx, inty);//判读在X, Y 处添加了珠子后是否需要消除, 返回消除的个数
    void MoveBall(Ball *b,constPath &path);//根据CalPath的结果生成移动动画
    void MoveBallEnd(Ball *b);//移动完成后消除珠子,或添加珠子。
    bool CalPath(Ball *b,int x,int y,Path& p); //计算ball到x,y的路径,存在路径则返回true,否则返回false
private:
    cocos2d::Sprite*_select;
    ints  x, sy;
    Ball*bs[10][10];
    static constintnextCount= 3;
    Ball *bNext[nextCount];
    cocos2d::Label*lNext;
    int mpoint;
    cocos2d::Label*lPoint;
 
    cocos2d::Label*lOver;
    bool IsOver;
    bool IsMoving;
    Ball*ballMove;//用于移动动画,播放移动动画时,会先隐藏原始位置的ball,然后在移动这个ball。
};

具体实现代码中有注释,大家可以下载代码查看,这里不一一讲解。

 

OnSelect函数时珠子点击的回掉函数,函数会判断是否要选择珠子还是移动珠子。

 

CalPath函数会计算出珠子到x,y的最短路径。

这是一个“电路图布线”算法,如果看不懂,可以百度这个算法。

“电路图布线”算法,是一个分支限界的算法,算法每次会选取一个最优节点进行,直到得到结果。为了每次选取最优节点可以使用std::priority_queue优先队列。

 

 

扩展

游戏代码下载地址http://pan.baidu.com/s/1gf9mlzH

代码只保留了VS2015 win32版本

 






以上是关于Cocos2d-x 小试牛刀五子连珠游戏的主要内容,如果未能解决你的问题,请参考以下文章

《游戏学习》java实现连珠五子棋完整代码

2018.10.4二连爆搜+再次出锅

2021-5-27WHUT mooc 7-3 TicTacToe游戏--胜负判定 个人题解

2021-5-27WHUT mooc 7-3 TicTacToe游戏--胜负判定 个人题解

2021-5-27WHUT mooc 7-3 TicTacToe游戏--胜负判定 个人题解

2021-5-27WHUT mooc 7-3 TicTacToe游戏--胜负判定 个人题解