Unity实战篇:实现连连看死局判定(一:数据结构的选择以及基本思路概述)
最近在做连连看小游戏,整体完成的差不多,还差一个死局判定,若为死局,即重新洗牌。
由于项目结构较为繁杂,建议大家先下载源码
源码下载链接:https://gitee.com/NKG/UnityWorks/blob/master/UnityPackages/LinkUp.unitypackage
和群里的大神讨论后,决定使用有向邻接表这一数据结构思想来实现这个目的。
直接讲实现方法也没用,先来复习一下C++版的邻接表吧
https://blog.csdn.net/qq_15020543/article/details/84178417
针对连连看这个项目,因为我们只需要将相同的牌存在一个链表里,所以我们可以利用C#自带的链表结构,字典结构,结合泛型来实现(有向邻接表思想)实现起来是比较容易的。
/// <summary>/// 水果结点/// </summary>public class FruitNode{/// <summary>/// X下标/// </summary>public int X;/// <summary>/// Y下标/// </summary>public int Y;}
/// <summary>/// 用来检测死局的有向邻接表/// </summary>public static Dictionary<int, LinkedList<FruitNode>> MapCollect = new Dictionary<int, LinkedList<FruitNode>>();
/// <summary>/// 向邻接表表中添加元素/// </summary>/// <param name="x">x坐标</param>/// <param name="y">y坐标</param>/// <param name="value">水果类型</param>private void AddItemToLinklist(int x, int y, int value){if (MapCollect.ContainsKey(value)){FruitNode fruitNode = new FruitNode(x, y, value);MapCollect[value].AddLast(fruitNode);}else{FruitNode fruitNode = new FruitNode(x, y, value);LinkedList<FruitNode> tempFruitNodes = new LinkedList<FruitNode>();tempFruitNodes.AddLast(fruitNode);MapCollect.Add(value, tempFruitNodes);}}
/// <summary>/// 依照当前地图生成邻接表/// </summary>public void CreateMapLink(){for (int i = 1; i < RowNum; i++){for (int j = 1; j < ColumNum; j++){AddItemToLinklist(j,i,TestMap[j,i]);}}}
数据结构已经创建好了,那么具体方法为
1.玩家每次进行消除操作就更新此数据结构,并且判定是否为死局
- 遍历字典,判断其中的结点能否满足消除条件(消除逻辑已完善)
- 若找到可消除的,即返回,继续游戏
- 若没找到可消除的,重新洗牌
2.尽管已经做了算法上的优化,但可以预见,他仍是一个比较消耗性能的操作,所以我准备新开一个线程让它执行判断。
选择有向邻接表这一数据结构用来做死局判定,优势有:
- 时间复杂度低,只需要构建有向邻接表的时候完整遍历一次二维数组,维护的时候就比较轻松了。举个例子,10x10的矩阵,你直接要判定是否死局,最坏情况就是O(100^100)的时间复杂度。如果用有向邻接表...还真不好说是多少,反正比直接用矩阵好的多得多。
- 便于维护,由于是有向邻接表,删除结点只需要找到它删除就行了,时间复杂度为O(1),这同时也是为什么不用无向邻接表的理由,因为无向邻接表你要删除两个地方。不方便。
Unity实战篇:实现连连看死局判定(一:数据结构的选择以及基本思路概述)相关推荐
- Unity实战篇:实现连连看死局判定(二:具体实现)
要做死局判定,我们要明确在什么时候检察地图是否死局. 刚刚初始化地图 每次消除之后 检查死局前我们也要同步更新有向邻接表字典和地图数组 我们约定,数组值为-1代表此处为空 遍历字典,找到要去除的元素, ...
- Tiled结合Unity实现瓦片地图——Unity实战篇
本系列文章由Aimar_Johnny编写,欢迎转载,转载请标明出处,谢谢. http://blog.csdn.net/lzhq1982/article/details/75425915 上文说道,Ti ...
- Unity实战篇:实现虚拟摇杆控制人物(Easy Touch 5.X插件)
先上一张效果图 1.先导入Easy Touch 5.X插件 https://download.csdn.net/download/qq_15020543/10718144 强烈建议大家去Unity 商 ...
- Unity实战篇:移植游戏到安卓平台的注意事项及其实例(一)
这篇博客以Unity官方案例Space Shooter Tutorial为例.较为全面的讲解了游戏移植到安卓所需要的注意事项. 1.安卓和Java环境配置 https://blog.csdn.net/ ...
- Unity实战篇:读取Excel数据并转换成Asset
在开发游戏过程中我们不可避免的会遇到要给游戏数据配表的问题,(毕竟一个一个string写太累了啊喂!),而且配表还有利于数据的观察和策略性修改,也有利于游戏的维护与更新.这篇博客讲的是读取Excel表 ...
- Unity实战篇:使用图片制作自己的艺术字
本篇博客我将和大家一起从零开始根据图片制作自己的艺术字(不包括汉字) 准备工作: BMFront http://www.angelcode.com/products/bmfont/ 编写艺术字体生成 ...
- Unity实战篇 | 自己制作一个《大转盘抽奖》 小程序,顺便带你看看抽奖的水可以有多深
- Unity实战篇 | 接入 声网SDK 实现 音频通话 —— 自己动手做一个 语音聊天房
目录
- Unity实战篇 | 教你怎样将Unity的启动Logo 设置成 自己制作的 帧动画
最新文章
- 基于英飞凌AURIX的平衡单车组逐飞BLDC项目开源
- Java 效率工具之 Lombok
- 【编程1】 Two Sum + 哈希算法
- PIC在线升级源码分析
- oracle thread日志查看,请教归档日志的视图v$archived_log里的thread#的问题
- 在 LinearLayout里addView一个图表
- php输出位置最右,php动态读取数据清除最右边距的方法
- html input触发器类型,几种触发器的Verliog语言描述
- java线程wait_Java 并发编程:线程间的协作(wait/notify/sleep/yield/join)
- CRC校验算法的Verilog实现
- python更改ip地址_用Python更改IP地址(转)
- EasyRecovery数据恢复软件中文版免费下载v15.0绿色版
- Python数据处理Tips机器学习中文数据8种常用处理方法
- windows 环境下 0x色彩对应表
- 强监管焕新外卖行业,美团、饿了么如何应对?
- Android 腾讯地图 选点定位,仿微信发送位置
- Matlab——行星轨道问题
- 互联网音乐告别版权战,音乐社区或成新风口?
- 7-114 用if-else语句编程百分制成绩转换为五分制成绩
- GCC和Clang的两个值得了解的编译器开关
热门文章
- VC++异常捕获__try...__except和try...catch的使用介绍(附源码)
- linux 脚本 ll命令,linux中ll命令的详细解释
- fileitem方法_FileItem类的getContentType ()方法,用于获得上传文件的类型。_学小易找答案...
- MESI 缓存一致性协议
- 壶口瀑布奇观“水底冒烟”
- H5实战(一):照片墙效果
- Android 高仿QQ 登陆界面
- 超凡股份邮件服务器,《雪鹰领主》11月23日部分服务器数据互通公告
- Android记事本——记事本记事列表页实现
- OSI及IP地址协议---来自达内王贝学员