You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#开发俄罗斯方块时如何将交错数组清空行移至顶部

C# 俄罗斯方块消行后空行移至顶部实现方案

原有逻辑问题

你当前的遍历逻辑仅将检测到的满行直接置空,被清空行上方的方块行不会自动下沉,空行会停留在原满行位置,不符合俄罗斯方块消行后的下落规则。
正确的消行效果为:所有未被填满的行保留原有上下相对顺序,整体下沉到网格底部,所有被消除产生的空行统一排列在网格最顶部。

推荐实现逻辑

不需要逐行做移位操作,按3步处理即可兼容单次消1~4行的所有场景,逻辑简单不易出bug:

  • 遍历整个网格,收集所有**存在0值(未被填满)**的行,这些是消行后需要保留的内容
  • 计算需要补充的空行总数:空行数 = 网格总行数 - 保留的非满行数量
  • 重新给交错数组赋值:数组前N位(顶部区域)填充对应数量的空行,剩余位置按原收集顺序放入保留的非满行

完整实现代码

替换你原来的消行遍历逻辑即可:

// 存储消行后需要保留的非满行
List<int[]> keepRows = new List<int[]>();

// 第一步:筛选所有未填满的行
for (int rowIndex = 0; rowIndex < playingGrid.Length; rowIndex++)
{
    if (playingGrid[rowIndex].Contains(0))
    {
        keepRows.Add(playingGrid[rowIndex]);
    }
}

// 第二步:计算顶部需要补的空行数量
int emptyTopRows = playingGrid.Length - keepRows.Count;

// 第三步:重组网格
for (int rowIndex = 0; rowIndex < playingGrid.Length; rowIndex++)
{
    if (rowIndex < emptyTopRows)
    {
        // 顶部区域填充空行
        playingGrid[rowIndex] = new int[10];
    }
    else
    {
        // 下方区域按原顺序放置保留的行
        playingGrid[rowIndex] = keepRows[rowIndex - emptyTopRows];
    }
}

补充说明

如果需要做消行得分计算,只要在筛选非满行的逻辑里加个计数器,统计被过滤掉的满行数量,就能对应计算1行、2行、3行、4行(俄罗斯方块)的不同得分,不需要额外遍历网格。

内容的提问来源于stack exchange,提问作者Dave Nieberg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 23:27:36