三消游戏算法 -滑动窗口算法(同行同列)

在这里插入图片描述

  1. 前言
    三消游戏的核心就是检测是否有3个及以上的方块相邻并且颜色相同,这个算法中只完成了同行同列的检测,"L"形状的并不会消除。

  2. 具体思路
    图片中的每个方块都有各自的坐标点,最左下角的是(0,0),进行判断时首先可以对所有方块分组,假设按照同列分组也就是坐标点的x分组,分组后首先判断组内的元素数量大于3,大于3才会进行之后的逻辑。如果数量大于3,则把这些方块按照坐标点y进行排序,记录到一个新的列表中,记录一个开始的序号-0,开始遍历这个列表,通过一个bool值检测是否 超出列表范围、方块坐标y距离不是1、颜色不同,则记录当前序号和开始的的差值 表示为长度,如果该长度大于等于3,则可以执行消除的逻辑,随后把开始序号修改为当前的序号(移动窗口的起点)

  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; 
            }
        }
    }
}
  1. “L” 形状的消除暂未涉及 后续可能会加入吧
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值