cocos2d-x 消类游戏,类似Diamond dash 设计
? ? ? ? 前幾天剛剛在學(xué)習(xí)cocos2d-x,無(wú)聊之下自己做了一個(gè)類(lèi)似Diamond dash的消類(lèi)游戲,今天放到網(wǎng)上來(lái)和大家分享一下。我相信Diamond dash這個(gè)游戲大家都玩過(guò),游戲的規(guī)則是這樣的,有一個(gè)6*7的棋盤(pán),每個(gè)格子中有不同顏色的方塊(我這里選取了5種顏色),當(dāng)點(diǎn)擊某一個(gè)方塊時(shí),如果和這個(gè)相連的方塊的個(gè)數(shù)大于等于三個(gè),那么這些相連的方塊都會(huì)被消去,然后在這些消去的方塊上面的方塊都會(huì)掉下來(lái),補(bǔ)充這些消去的方塊,同時(shí),上面的方塊掉下來(lái)之后在上面就回產(chǎn)生空缺,然后需要隨機(jī)生成方塊來(lái)補(bǔ)全上面的空缺,每次消去的得分為2^n,n是連續(xù)的方塊的個(gè)數(shù),游戲計(jì)時(shí)為1分鐘。
? ? ? ? 在游戲設(shè)計(jì)的過(guò)程中最主要的是游戲邏輯的設(shè)計(jì),這個(gè)游戲的邏輯很明確,首先隨機(jī)生成一個(gè)棋盤(pán),棋盤(pán)中放隨機(jī)一種顏色的方塊,方塊的擺放并沒(méi)有限制(并不像三消游戲,要求生成的棋盤(pán)不能在行中或者列中有相鄰的三個(gè)顏色相同);隨機(jī)生成方塊的代碼如下:
?
void GameLogic::init() {srand((unsigned)time(0));for (int i=0; i<WIDTH_CNT; i++){lack[i] = 0;for (int j=0; j<HEIGHT_CNT; j++){blocks[i][j].moveToY = j;blocks[i][j].color = rand() % colorCount;}}memset( visit, false, sizeof(visit) );totalScore = 0; }?
? ? ? ? 然后當(dāng)用戶(hù)點(diǎn)擊里面某個(gè)方塊時(shí),需要計(jì)算出和該方塊相鄰的相同顏色的方塊的個(gè)數(shù),這里用了深度優(yōu)先遍歷,數(shù)出這樣的方塊的個(gè)數(shù),并且用visit標(biāo)記了這些方塊在棋盤(pán)中的位置。
?
int GameLogic::dfs(int i, int j) {int ret = 1;visit[i][j] = true;for (int p=0; p<4; p++){int x = i + dir[p][0];int y = j + dir[p][1];if (x >= WIDTH_CNT || x < 0) continue;if (y >= HEIGHT_CNT || y < 0) continue;if ( !visit[x][y] && blocks[x][y].color == blocks[i][j].color){ret += dfs(x, y);}}return ret; }
? ? ? ? 接下去是把標(biāo)記的這些方塊消去,這是游戲中比較難的一個(gè)地方,因?yàn)橐獙?shí)現(xiàn)方塊移動(dòng)的一個(gè)效果,我是這樣實(shí)現(xiàn)的:每個(gè)方塊掉落的位置和它下面消掉的方塊個(gè)數(shù)有關(guān),記錄每個(gè)方塊下面消去的游戲個(gè)數(shù),然后當(dāng)前位置減去這個(gè)個(gè)數(shù)就是該方塊需要移動(dòng)到的位置,并且記錄這個(gè)位置。
?
?
void GameLogic::blocksCancel() {for (int i=0; i<WIDTH_CNT; i++){for (int j=0; j<HEIGHT_CNT; j++){if ( visit[i][j] ){lack[i] ++;}else{blocks[i][j].moveToY = j-lack[i];blocks[i][j-lack[i]].color = blocks[i][j].color;}}} }
掉落之后,補(bǔ)齊上面的方塊,同樣也隨機(jī)生成。
?
?
void GameLogic::makeUpBlocks() {srand((unsigned)time(0));for (int i=0; i<WIDTH_CNT; i++){for (int j=HEIGHT_CNT-lack[i]; j<HEIGHT_CNT; j++){blocks[i][j].color = rand() % colorCount;}} }最后在下一次點(diǎn)擊之前,別忘了把狀態(tài)恢復(fù)到初始狀態(tài)。
?
游戲截圖如下圖:
這是運(yùn)行之前的截圖
時(shí)間到,游戲結(jié)束:
最近在研究另外的一個(gè)游戲,三消游戲,邏輯比這略復(fù)雜。
只是一個(gè)簡(jiǎn)單的游戲,純供娛樂(lè),另外如需交流,請(qǐng)?jiān)谙旅媪粞?#xff0c;源代碼就不在這里提供了,我提供這個(gè)游戲的win32 pc版下載:
地址如下:
點(diǎn)擊打開(kāi)鏈接
?
轉(zhuǎn)載于:https://www.cnblogs.com/dyllove98/p/3184567.html
總結(jié)
以上是生活随笔為你收集整理的cocos2d-x 消类游戏,类似Diamond dash 设计的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C语言面试题汇总
- 下一篇: Html.RenderPartial与H