Unity 消消乐中最简单的算法
2019-08-15 20:01
1596 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42440767/article/details/99651246
1、算法环境:
这是一个判断元素匹配的算法。
假设三个相同元素连在一起可以消除,且不可以斜向消除。
2、思路:
通过二维数组的循环遍历得到一个 x * y 的矩形。
x轴从左到右递增,y轴从上到下递增。
以第一个选中的元素为起点开始遍历。
创建一个二维数组用来表示元素位置(items[ , ]),
创建Item类,定义X、Y、Type(元素种类)。
创建三个List用来存储相同元素:横向遍历到的所有相同元素,纵向遍历到的所有相同元素,
以及该算法返回的最终可消除元素(即横向List+纵向List)。
3、下面是代码:
` /// <summary> /// 匹配算法 /// </summary> /// <param name="sweet">选中的元素</param> /// <param name="newX">该元素的X轴坐标</param> /// <param name="newY">该元素的Y轴坐标</param> /// <returns></returns> public List<GameItems> MatchItems(GameItems item, int itemX, int itemY) { //横向遍历到的所有相同元素 List<GameItems> matchRowItems = new List<GameItems>(); //纵向遍历到的所有相同元素 List<GameItems> matchLineItems = new List<GameItems>(); //最终可消除元素 List<GameItems> finishedMatchItems = new List<GameItems>(); //先将选中的元素加入行匹配List matchRowItems.Add(item); //横向遍历 //i=0代表往左遍历,i=1代表往右遍历 //Column为横向最大值 for (int i = 0; i <= 1; i++) { for (int xDistance = 1; xDistance < Column; xDistance++) { int x; //← if (i == 0) { x = itemX- xDistance; } //→ else { x = itemX+ xDistance; } //判断横向是否到达边界 if (x < 0 || x >= Column) { break; } //判断是否为同一种元素 if (items[x, itemY].Type == items[x, itemY].Type) { //加入行list matchRowItems.Add(items[x, itemY]); } else { break; } } } //如果横向达到要求 if (matchRowItems.Count >= 3) { //将符合要求的元素放入finishedMatchItems for (int i = 0; i < matchRowItems.Count; i++) { finishedMatchItems .Add(matchRowItems[i]); } } //当元素程型 L 或 T 型 //如果横向达到要求 if (matchRowItems.Count >= 3) { for (int i = 0; i < matchRowItems.Count; i++) { //满足条件的元素依次纵向匹配 //0代表往上遍历,1代表往下遍历 //Row为纵向最大值 for (int j = 0; j <= 1; j++) { int y; for (int yDistance = 1; yDistance < Row; yDistance++) { //↑ if (j == 0) { y = itemY - yDistance; } //↓ else { y = itemY + yDistance; } //限制边界 if (y < 0 || y >= Row) { break; } //如果符合条件的行匹配元素的上下方向的元素为同一种,就将其添加到matchLineItems 中 if (items[matchRowItems[i].X, y].Type ==items[matchRowItems[i].X, y].Type) { matchLineItems.Add(items[matchRowItems[i].X, y]); } else { break; } } } //如果列list不满足条件,就清空List if (matchLineItems.Count < 2) { matchLineItems.Clear(); } //如果满足条件,将符合要求的元素放入finishedMatchItems中 else { for (int j = 0; j < matchLineItems.Count; j++) { finishedMatchItems.Add(matchLineItems[j]); } break; } } } //如果finishedMatchItems中的元素数量符合消除要求,就返回finishedMatchItems if (finishedMatchItems.Count >= 3) { return finishedMatchItems; } //Clear matchRowItems.Clear(); matchLineItems.Clear();
纵向同理~复制粘贴上面的然后改个坐标和存储的List就可以了。
以上就是我个人学习到的消消乐中最简单的算法,希望能对大家有帮助。
有更好的方法欢迎指点。
相关文章推荐
- Unity算法——A*(AStar)寻路算法概要及简单应用
- Unity A*寻路三个简单实用的算法
- Unity A*寻路三个简单实用的算法
- Unity判断当前鼠标顺逆时针旋转的简单算法
- java数据结构与算法-简单排序-冒泡排序
- 蓝桥杯--算法提高 排列数 (简单dfs)
- python sklearn 分类算法简单调用(借鉴)
- 最简单的搜索算法
- 多个仓库库存释放-简单算法
- 【基础算法】排序-简单排序之二(选择排序)
- [置顶] Unity 简单易用的插件汇总
- 串匹配算法的理解之简单算法
- 简单的算法
- Unity 同一局域网内的电脑 简单的部署 git托管
- PHP算法学习之“简单的交换排序”,“冒泡排序”以及“改进后的冒泡排序”
- 算法笔记_071:SPFA算法简单介绍(Java)
- K-近邻算法实现简单filmClassify
- 小量压缩简单算法
- 三种简单排序算法及实现(引用)
- 简单dp算法——Cow Bowling