-
前言
三消游戏的核心就是检测是否有3个及以上的方块相邻并且颜色相同,这个算法中只完成了同行同列的检测,"L"形状的并不会消除。 -
具体思路
图片中的每个方块都有各自的坐标点,最左下角的是(0,0),进行判断时首先可以对所有方块分组,假设按照同列分组也就是坐标点的x分组,分组后首先判断组内的元素数量大于3,大于3才会进行之后的逻辑。如果数量大于3,则把这些方块按照坐标点y进行排序,记录到一个新的列表中,记录一个开始的序号-0,开始遍历这个列表,通过一个bool值检测是否 超出列表范围、方块坐标y距离不是1、颜色不同,则记录当前序号和开始的的差值 表示为长度,如果该长度大于等于3,则可以执行消除的逻辑,随后把开始序号修改为当前的序号(移动窗口的起点) -
代码
// 检查列方向上满足消除条件(连续三个及以上相同颜色方块)的方块并进行消除的方法
void CheckCol()
{
// 按照方块的 X 坐标(列坐标)对 notMoveSquareDic 字典中的方块进行分组
var columnGroups = notMoveSquareDic.GroupBy(s => s.Value.point.x);
// 遍历每一列的方块组
foreach (var column in columnGroups)
{
// 如果该列的方块数量少于 3 个,不满足消除条件,跳过本次循环,继续检查下一列
if (column.Count() < 3) continue;
// 对当前列的方块按照 Y 坐标(行坐标)进行升序排序,并将排序后的方块对象提取到一个列表中
var sortedSquares = column.OrderBy(s => s.Value.point.y)
.Select(s => s.Value)
.ToList();
// 用于标记连续相同颜色方块序列的起始索引
int startIdx = 0;
// 从第二个方块开始遍历当前列排序后的方块列表
for (int currentIdx = 1; currentIdx <= sortedSquares.Count; currentIdx++)
{
// 检测是否出现连续序列的断点,以下三种情况会被判定为断点:
// 1. 当前索引超出了方块列表的范围,意味着已经遍历到列表末尾
// 2. 当前方块的 Y 坐标与前一个方块的 Y 坐标不连续(即不是依次递增 1)
// 3. 当前方块的颜色与序列起始方块的颜色不同
bool isBreak = currentIdx == sortedSquares.Count ||
sortedSquares[currentIdx].point.y != sortedSquares[currentIdx - 1].point.y + 1 ||
sortedSquares[currentIdx].GetColor() != sortedSquares[startIdx].GetColor();
// 如果出现了断点
if (isBreak)
{
// 计算从起始索引到当前索引之间连续相同颜色方块的序列长度
int sequenceLength = currentIdx - startIdx;
// 如果序列长度大于等于 3,满足消除条件
if (sequenceLength >= 3)
{
// 遍历从起始索引到当前索引 - 1 的方块,调用 DestroySquare 方法将这些方块消除
for (int i = startIdx; i < currentIdx; i++)
{
DestroySquare(sortedSquares[i]);
}
}
// 将起始索引更新为当前索引,开始检测下一个可能的连续序列
startIdx = currentIdx;
}
}
}
}
- “L” 形状的消除暂未涉及 后续可能会加入吧