我正在编写俄罗斯方块克隆,并且正在使用 C# 进行原型设计。最终代码应该在嵌入式系统上运行(使用 8 位 CPU 和非常少的 RAM),所以我尝试使用一种简单的算法来清除行。
现在,我的运动场是一个二维数组:
private readonly TetrominoType[][] _playfield;
(其中TetrominoType
是一个枚举,表示 None 或 7 种类型之一,用于着色块)
当一行被清除时,我想就地修改这个数组,这就是我的问题所在。举个例子:
Before After
0 # # # #
1 # # # #
2 # # # #
3 # # # #
4 # # # #
5 #xxxxxx# # #
6 #x xx# # #
7 #xxxxxx# # #
8 #xxxxxx# #x xx#
9 #x xxxx# #x xxxx#
######## ########
我已经确定需要删除第 5、7 和 8 行,因此其他行应该掉下来,让我的状态位于右侧。
我天真的方法是向后迭代并复制清除的行上方的行,基本上:
for(int iy = 9; iy >= 0; iy--) {
if(_linesToClear.Contains(iy)) {
for(int ix = 0; ix < 6; ix++) {
_playfield[iy][ix] = _playfield[iy-1][ix];
}
}
}
这里的问题是上面的行也可能被清除(例如,如果iy == 8
我不想复制第 7 行而是第 6 行),而且我需要清除复制的行 ( iy-1
) - 或复制该行上面的行这反过来又需要向上涓涓细流。
我试着计算我已经跳过了多少行,但这只有在我创建一个新数组然后将它们换出时才有效,但我无法获得就地修改运动场数组的数学工作。
这可能真的很简单,但我只是没有看到算法。有谁知道我该怎么做?