最近在做连连看小游戏,整体完成的差不多,还差一个死局判定,若为死局,即重新洗牌。

由于项目结构较为繁杂,建议大家先下载源码

源码下载链接: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.尽管已经做了算法上的优化,但可以预见,他仍是一个比较消耗性能的操作,所以我准备新开一个线程让它执行判断。

选择有向邻接表这一数据结构用来做死局判定,优势有:

  1. 时间复杂度低,只需要构建有向邻接表的时候完整遍历一次二维数组,维护的时候就比较轻松了。举个例子,10x10的矩阵,你直接要判定是否死局,最坏情况就是O(100^100)的时间复杂度。如果用有向邻接表...还真不好说是多少,反正比直接用矩阵好的多得多。
  2. 便于维护,由于是有向邻接表,删除结点只需要找到它删除就行了,时间复杂度为O(1),这同时也是为什么不用无向邻接表的理由,因为无向邻接表你要删除两个地方。不方便。

Unity实战篇:实现连连看死局判定(一:数据结构的选择以及基本思路概述)相关推荐

  1. Unity实战篇:实现连连看死局判定(二:具体实现)

    要做死局判定,我们要明确在什么时候检察地图是否死局. 刚刚初始化地图 每次消除之后 检查死局前我们也要同步更新有向邻接表字典和地图数组 我们约定,数组值为-1代表此处为空 遍历字典,找到要去除的元素, ...

  2. Tiled结合Unity实现瓦片地图——Unity实战篇

    本系列文章由Aimar_Johnny编写,欢迎转载,转载请标明出处,谢谢. http://blog.csdn.net/lzhq1982/article/details/75425915 上文说道,Ti ...

  3. Unity实战篇:实现虚拟摇杆控制人物(Easy Touch 5.X插件)

    先上一张效果图 1.先导入Easy Touch 5.X插件 https://download.csdn.net/download/qq_15020543/10718144 强烈建议大家去Unity 商 ...

  4. Unity实战篇:移植游戏到安卓平台的注意事项及其实例(一)

    这篇博客以Unity官方案例Space Shooter Tutorial为例.较为全面的讲解了游戏移植到安卓所需要的注意事项. 1.安卓和Java环境配置 https://blog.csdn.net/ ...

  5. Unity实战篇:读取Excel数据并转换成Asset

    在开发游戏过程中我们不可避免的会遇到要给游戏数据配表的问题,(毕竟一个一个string写太累了啊喂!),而且配表还有利于数据的观察和策略性修改,也有利于游戏的维护与更新.这篇博客讲的是读取Excel表 ...

  6. Unity实战篇:使用图片制作自己的艺术字

    本篇博客我将和大家一起从零开始根据图片制作自己的艺术字(不包括汉字) 准备工作: BMFront  http://www.angelcode.com/products/bmfont/ 编写艺术字体生成 ...

  7. Unity实战篇 | 自己制作一个《大转盘抽奖》 小程序,顺便带你看看抽奖的水可以有多深

  8. Unity实战篇 | 接入 声网SDK 实现 音频通话 —— 自己动手做一个 语音聊天房

    目录

  9. Unity实战篇 | 教你怎样将Unity的启动Logo 设置成 自己制作的 帧动画

最新文章

  1. 基于英飞凌AURIX的平衡单车组逐飞BLDC项目开源
  2. Java 效率工具之 Lombok
  3. 【编程1】 Two Sum + 哈希算法
  4. PIC在线升级源码分析
  5. oracle thread日志查看,请教归档日志的视图v$archived_log里的thread#的问题
  6. 在 LinearLayout里addView一个图表
  7. php输出位置最右,php动态读取数据清除最右边距的方法
  8. html input触发器类型,几种触发器的Verliog语言描述
  9. java线程wait_Java 并发编程:线程间的协作(wait/notify/sleep/yield/join)
  10. CRC校验算法的Verilog实现
  11. python更改ip地址_用Python更改IP地址(转)
  12. EasyRecovery数据恢复软件中文版免费下载v15.0绿色版
  13. Python数据处理Tips机器学习中文数据8种常用处理方法
  14. windows 环境下 0x色彩对应表
  15. 强监管焕新外卖行业,美团、饿了么如何应对?
  16. Android 腾讯地图 选点定位,仿微信发送位置
  17. Matlab——行星轨道问题
  18. 互联网音乐告别版权战,音乐社区或成新风口?
  19. 7-114 用if-else语句编程百分制成绩转换为五分制成绩
  20. GCC和Clang的两个值得了解的编译器开关

热门文章

  1. VC++异常捕获__try...__except和try...catch的使用介绍(附源码)
  2. linux 脚本 ll命令,linux中ll命令的详细解释
  3. fileitem方法_FileItem类的getContentType ()方法,用于获得上传文件的类型。_学小易找答案...
  4. MESI 缓存一致性协议
  5. 壶口瀑布奇观“水底冒烟”
  6. H5实战(一):照片墙效果
  7. Android 高仿QQ 登陆界面
  8. 超凡股份邮件服务器,《雪鹰领主》11月23日部分服务器数据互通公告
  9. Android记事本——记事本记事列表页实现
  10. OSI及IP地址协议---来自达内王贝学员