c# - 俄罗斯方 block 游戏的朴素重力使用 2D 阵列作为运动场

标签 c# .net arrays algorithm tetris

我正在编写俄罗斯方 block 的克隆版,并且正在使用 C# 制作原型(prototype)。最终代码应该在嵌入式系统上运行(使用 8 位 CPU 和非常小的 RAM),因此我尝试使用一种朴素的算法来清除行。

现在,我的运动场是一个二维数组:

private readonly TetrominoType[][] _playfield;

(其中 TetrominoType 是一个枚举,用于指示 None 或 7 种类型中的一种,用于着色 block )

清除一行后,我想就地修改这个数组,这就是我的问题所在。举个例子:

   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) - 或复制该行上方的行,该行又需要向上滴流。

我试着计算我已经跳过了多少行,但这只有在我创建一个新数组然后将它们换出时才有效,但我无法获得就地修改运动场数组的数学计算。

它可能真的很简单,但我只是没有看到算法。有谁知道我该怎么做?

最佳答案

主要问题是多条已清除的行,因此我们需要确保当您连续有多条已清除的行时,将所有内容向下移动到所有行。由于您有一个需要清除哪些行的列表,而不是仅仅复制它上面的行,您可以找到下一个未清除的行向上有多远,并将它上面的所有内容向下移动那么多行。例如,您可以这样做:

for(int iy = 9; iy >= 0; iy--)
{
    if(_linesToClear.Contains(iy))
    {
        int nextLineIndex = iy-1;
        while( _linesToClear.contains(nextLineIndex) && nextLineIndex >= 0 )
        {
            nextLineIndex--;
        }
        if ( nextLineIndex >= 0 )
        {
            int amountToDrop = iy - nextLineIndex
            for(int ix = 0; ix < 6; ix++)
            {
                _playfield[iy][ix] = _playfield[iy-amountToDrop][ix];
            }
        }
    }
 }

这将计算出一行中有多少行已清除,然后将所有内容都放到那么多行中。希望对您有所帮助!

关于c# - 俄罗斯方 block 游戏的朴素重力使用 2D 阵列作为运动场,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21542144/

相关文章:

c# - 从地址中提取邮政编码

c# - ExternalException (0x80004005) GDI+ 中发生一般性错误

java - 计算空闲 block 直到有已用 block 的算法

jQuery - 删除数组中的类

c# - 不同的 Action 有不同的验证规则

c# - Electron 可以用来创建 Outlook 插件吗?

c# - 使用程序集名称和类类型动态创建类对象

C 或 C++ 中的 Java ByteArray 等价物

c# - 如何修改我的代码以从 C# 中的对象数组获取数据?

c# - 数据库代码优先 Entity Framework