您的位置:首页 > 移动开发 > Unity3D

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就可以了。
以上就是我个人学习到的消消乐中最简单的算法,希望能对大家有帮助。

有更好的方法欢迎指点。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: