Mic*_*tum 5 .net c# arrays algorithm tetris
我正在写一个俄罗斯方块克隆,我在C#中进行原型设计.最终的代码应该在嵌入式系统上运行(使用8位CPU和非常小的RAM),所以我试图使用天真的算法来清除行.
现在,我的playfield是一个2D数组:
private readonly TetrominoType[][] _playfield;
Run Code Online (Sandbox Code Playgroud)
(其中TetrominoType是一个枚举,表示无或7种类型中的一种,用于着色块)
当一行被清除时,我想要就地修改这个数组,这就是我的问题所在.举个例子:
Before After
0 # # # #
1 # # # #
2 # # # #
3 # # # #
4 # # # #
5 #xxxxxx# # #
6 #x xx# # #
7 #xxxxxx# # #
8 #xxxxxx# #x xx#
9 #x xxxx# #x xxxx#
######## ########
Run Code Online (Sandbox Code Playgroud)
我已经确定需要删除第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];
}
}
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是上面的行也可能被清除(例如,如果iy == 8那时我不想复制第7行而是第6行)并且还需要清除复制的行(iy-1) - 或复制上面的行而这又需要向上涓涓细流.
我尝试计算已经跳过了多少行,但只有在我创建一个新数组然后将它们交换出来时才有效,但我无法通过数据工作来对playfield数组进行就地修改.
它可能很简单,但我只是没有看到算法.有没有人有一些见解我怎么能这样做?
会起作用吗?
int k = 0;
for(int iy = 9; iy >= 0; iy--) {
if(!_linesToClear.Contains(iy)) {
for(int ix = 0; ix < 6; ix++) {
_playfield[iy + k][ix] = _playfield[iy][ix];
}
}
else
k++;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
586 次 |
| 最近记录: |