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
相关产品推荐
相关产品推荐

