cocos2d-x 消类游戏,类似Diamond dash 设计

简介: 前几天刚刚在学习cocos2d-x,无聊之下自己做了一个类似Diamond dash的消类游戏,今天放到网上来和大家分享一下。我相信Diamond dash这个游戏大家都玩过,游戏的规则是这样的,有一个7*8的棋盘,每个格子中有不同颜色的方块(我...

前几天刚刚在学习cocos2d-x,无聊之下自己做了一个类似Diamond dash的消类游戏,今天放到网上来和大家分享一下。我相信Diamond dash这个游戏大家都玩过,游戏的规则是这样的,有一个7*8的棋盘,每个格子中有不同颜色的方块(我这里选取了5种颜色),当点击某一个方块时,如果和这个相连的方块的个数大于等于三个,那么这些相连的方块都会被消去,然后在这些消去的方块上面的方块都会掉下来,补充这些消去的方块,同时,上面的方块掉下来之后在上面就回产生空缺,然后需要随机生成方块来补全上面的空缺,每次消去的得分为2^n,n是连续的方块的个数,游戏计时为1分钟。

        在游戏设计的过程中最主要的是游戏逻辑的设计,这个游戏的逻辑很明确,首先随机生成一个棋盘,棋盘中放随机一种颜色的方块,方块的摆放并没有限制(并不像三消游戏,要求生成的棋盘不能在行中或者列中有相邻的三个颜色相同);随机生成方块的代码如下:

[cpp]  view plain copy
  1. void GameLogic::init()  
  2. {  
  3.     srand((unsigned)time(0));  
  4.     for (int i=0; i<WIDTH_CNT; i++)  
  5.     {  
  6.         lack[i] = 0;  
  7.         for (int j=0; j<HEIGHT_CNT; j++)  
  8.         {  
  9.             blocks[i][j].moveToY = j;  
  10.             blocks[i][j].color = rand() % colorCount;  
  11.         }  
  12.     }  
  13.     memset( visit, falsesizeof(visit) );  
  14.     totalScore = 0;  
  15. }  


        然后当用户点击里面某个方块时,需要计算出和该方块相邻的相同颜色的方块的个数,这里用了深度优先遍历,数出这样的方块的个数,并且用visit标记了这些方块在棋盘中的位置。

[cpp]  view plain copy
  1. int GameLogic::dfs(int i, int j)  
  2. {  
  3.     int ret = 1;  
  4.     visit[i][j] = true;  
  5.     for (int p=0; p<4; p++)  
  6.     {  
  7.         int x = i + dir[p][0];  
  8.         int y = j + dir[p][1];  
  9.         if (x >= WIDTH_CNT || x < 0)   
  10.             continue;  
  11.         if (y >= HEIGHT_CNT || y < 0)   
  12.             continue;  
  13.         if ( !visit[x][y] && blocks[x][y].color == blocks[i][j].color)  
  14.         {  
  15.             ret += dfs(x, y);  
  16.         }  
  17.     }  
  18.     return ret;  
  19. }  

        接下去是把标记的这些方块消去,这是游戏中比较难的一个地方,因为要实现方块移动的一个效果,我是这样实现的:每个方块掉落的位置和它下面消掉的方块个数有关,记录每个方块下面消去的游戏个数,然后当前位置减去这个个数就是该方块需要移动到的位置,并且记录这个位置。

[cpp]  view plain copy
  1. void GameLogic::blocksCancel()  
  2. {  
  3.     for (int i=0; i<WIDTH_CNT; i++)  
  4.     {  
  5.         for (int j=0; j<HEIGHT_CNT; j++)  
  6.         {  
  7.             if ( visit[i][j] )  
  8.             {  
  9.                 lack[i] ++;  
  10.             }  
  11.             else  
  12.             {  
  13.                 blocks[i][j].moveToY = j-lack[i];  
  14.                 blocks[i][j-lack[i]].color = blocks[i][j].color;  
  15.             }  
  16.         }  
  17.     }  
  18. }  

掉落之后,补齐上面的方块,同样也随机生成。

[cpp]  view plain copy
  1. void GameLogic::makeUpBlocks()  
  2. {  
  3.     srand((unsigned)time(0));  
  4.     for (int i=0; i<WIDTH_CNT; i++)  
  5.     {  
  6.         for (int j=HEIGHT_CNT-lack[i]; j<HEIGHT_CNT; j++)  
  7.         {  
  8.             blocks[i][j].color = rand() % colorCount;  
  9.         }  
  10.     }  
  11. }  
最后在下一次点击之前,别忘了把状态恢复到初始状态。


游戏截图如下图:

这是运行之前的截图





时间到,游戏结束:




最近在研究另外的一个游戏,三消游戏,逻辑比这略复杂。


只是一个简单的游戏,纯供娱乐,另外如需交流,请在下面留言,源代码就不在这里提供了,我提供这个游戏的win32 pc版下载:

地址如下:

点击打开链接


请尊重博主的劳动成果, 转载请注明出处: http://blog.csdn.net/usingnamespace_std/article/details/9299663

相关文章
|
11月前
|
算法 流计算
基于MPPT的太阳能光伏电池simulink性能仿真,对比扰动观察法,增量电导法,恒定电压法
本课题在Simulink中实现基于MPPT的太阳能光伏电池,并对比了扰动观察法、增量电导法和恒定电压法三种MPPT方法。通过系统仿真,展示了不同算法下的性能差异。使用MATLAB 2022a版本进行建模和仿真。MPPT技术通过实时调整光伏系统的工作点,使其始终工作在最大功率点附近,从而最大化输出功率。扰动观察法、增量电导法和恒定电压法分别通过不同的机制实现这一目标。
|
6月前
|
虚拟化 网络虚拟化 Windows
导入虚拟机到Hyper-V环境时,理解并配置网络适配器设置是确保网络通信的关键
在Hyper-V环境中,正确配置虚拟机的网络适配器是确保其网络通信的关键。需先启用Hyper-V功能并创建虚拟交换机。接着,在Hyper-V管理器中选择目标虚拟机,添加或配置网络适配器,选择合适的虚拟交换机(外部、内部或私有),并根据需求配置VLAN、MAC地址等选项。最后,启动虚拟机并验证网络连接,确保其能正常访问外部网络、与主机及其他虚拟机通信。常见问题包括无法访问外部网络或获取IP地址,需检查虚拟交换机和适配器设置。
|
边缘计算 人工智能 Cloud Native
未来云计算发展趋势及挑战
随着数字化转型的加速推进,云计算作为关键基础设施之一,正扮演着越来越重要的角色。本文探讨了未来云计算的发展趋势和面临的挑战,分析了云原生技术、多云环境管理等领域的创新,展望了云计算在不断变革的科技领域中的前景。
2135 28
|
11月前
|
Linux 测试技术 网络安全
Linux系统之安装OneNav个人书签管理器
【10月更文挑战第19天】Linux系统之安装OneNav个人书签管理器
425 6
Linux系统之安装OneNav个人书签管理器
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
NeurIPS 2024:SparseLLM:突破性全局剪枝技术,大语言模型稀疏化革命
《SparseLLM: Towards Global Pruning for Pre-trained Language Models》提出了一种新型框架SparseLLM,通过模块化表示和辅助变量引入,将全局剪枝问题转化为多个可管理的子问题,实现资源高效的优化并保证全局最优性。实验表明,SparseLLM在高稀疏性条件下显著提高了模型的准确性和计算效率,适用于资源受限的环境。论文链接:https://arxiv.org/abs/2402.17946
262 3
|
Java 开发者
使用Calendar.add进行日期计算
使用Calendar.add进行日期计算
|
JavaScript 前端开发 搜索推荐
实时聊天应用:集成Python的WebSockets和Vue构建前端界面
【4月更文挑战第10天】本文介绍了如何使用Python的WebSockets和Vue.js构建实时聊天应用。通过WebSockets实现服务器与客户端的双向通信,借助Vue.js创建高效用户界面。步骤包括设计应用架构、实现WebSocket服务器、创建Vue.js项目、构建前端界面、集成WebSockets、接收和显示消息、性能优化及测试部署。这种技术组合为开发实时聊天应用提供了强大且灵活的解决方案,随着技术发展,未来的聊天应用将更加智能、个性化。
538 0
|
数据处理 Python
Python读取excel数据进行处理后生成新的Excel
Python读取excel数据进行处理后生成新的Excel
491 0
|
IDE 开发工具
STM32bug【 KEILMDK中出现STLink强制更新提示,又无法更新】
STM32bug【 KEILMDK中出现STLink强制更新提示,又无法更新】
583 0