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
是否開啟 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版本
相關文章
- 小遊戲五子連珠消除解決方案遊戲
- aix小試牛刀AI
- FLEX小試牛刀Flex
- 分析函式牛刀小試函式
- nodejs redis 小試牛刀NodeJSRedis
- vite plugins小試牛刀VitePlugin
- ElasticSearch學習一-小試牛刀Elasticsearch
- Java11 HttpClient小試牛刀JavaHTTPclient
- 分散式鎖--Redis小試牛刀分散式Redis
- spring篇(一)牛刀小試Spring
- Jmeter介面測試例項-牛刀小試JMeter
- Laravel 事件系統(一)、小試牛刀Laravel事件
- mysql儲存過程小試牛刀MySql儲存過程
- Vue.js 牛刀小試(持續更新~~~)Vue.js
- Android開發之Retrofit小試牛刀Android
- 【小試牛刀】Stage-2 裝飾器初探
- 小試牛刀ElasticSearch大資料聚合統計Elasticsearch大資料
- 我的Promise祕密初探之小試牛刀Promise
- ★Linux磁碟配額的使用 ★——牛刀小試Linux
- MySQL資料匯入匯出牛刀小試MySql
- Golang框架beego電影網爬蟲小試牛刀Golang框架爬蟲
- Golang框架Beego在Windows環境下小試牛刀Golang框架Windows
- constraintayout新功能montionLayout寫動畫小試牛刀AI動畫
- python小試牛刀: K-best演算法Python演算法
- 【小白學PyTorch】8 實戰之MNIST小試牛刀PyTorch
- 五彩珠遊戲遊戲
- 現代IT基礎設施管理(1):Terraform初識和小試牛刀ORM
- 畫素、彈珠、勇者鬥魔王,這款小眾遊戲如何吸引玩家?遊戲
- Flink Restart Strategies重啟策略機制深入剖析-Flink牛刀小試REST
- 五子棋遊戲(Java)遊戲Java
- Zen Pinball Party Mac(彈珠遊戲)Mac遊戲
- JS之五子棋遊戲JS遊戲
- 【Vue.js 牛刀小試】01:第一章 - 一些基礎概念Vue.js
- 【Vue.js 牛刀小試】03:第三章 - 事件修飾符的使用Vue.js事件
- CSS3五連珠載入等待效果CSSS3
- 龍珠:超宇宙遊戲 中文移植版遊戲
- 【Vue.js 牛刀小試】05:第五章 – 計算屬性與監聽器Vue.js
- 【Vue.js 牛刀小試】05:第五章 - 計算屬性與監聽器Vue.js