确定旋转元素在俄罗斯方块中的位置


24

Tetris-Tiles存储为4x4布尔矩阵。每个旋转步骤都有其自己的矩阵,T块的表示如下所示:

[
    0, 0, 0, 0,
    0, 1, 1, 1,
    0, 0, 1, 0,
    0, 0, 0, 0
],
[
    0, 0, 1, 0,
    0, 0, 1, 1,
    0, 0, 1, 0,
    0, 0, 0, 0
],
[
    0, 0, 1, 0,
    0, 1, 1, 1,
    0, 0, 0, 0,
    0, 0, 0, 0
],
[
    0, 0, 1, 0,
    0, 1, 1, 0,
    0, 0, 1, 0,
    0, 0, 0, 0
]

我试图找到一种方法来计算块旋转时与板碰撞的位置(板也是矩阵)。当旋转会导致碰撞时,原始的俄罗斯方块将完全不允许旋转块。游戏的现代变体将解决碰撞并将块移动到有效位置。

这是一些应解决的情况。评估板为6x6,红色 =活动块,灰色 =放置/占用的块。每次应进行逆时针旋转。绿色覆盖表示该块的矩阵。箭头指示解决旋转的结果校正:

俄罗斯方块旋转

  1. 块位于板的左侧。由于块不能离开电路板,因此应在旋转后将其移回内部。
  2. 方块击中“地面”,但尚未放置/提交。在这种情况下,必须向上移动图块以解决冲突(在“ I”块的情况下,向上移动2个像元)。
  3. 瓷砖会撞到占用的砖块,必须向左移动以解决碰撞。
  4. 瓷砖无法旋转。

解决这个问题的最佳方法是什么?最佳地,解决方案应该是通用的,例如。在任意大小和填充的板上处理任意4x4矩阵块。


有趣的是。一年前我做了俄罗斯方块,只是旋转矩阵并保留了原图。如果有什么重叠,我会用原始的。很好 我经常进行测试,从来没有遇到问题。一定是幸运的。感谢您参与的话题!
snitch182

Answers:


16

您描述的情况称为“ 墙踢 ”。

当玩家旋转一块棋子时,如果四角棋通常不会在旋转后占据的空间中存在任何空间,就会发生墙踢。

...

最简单的踢墙算法...是尝试将tetromino向右移动一个空间,然后向左移动一个空间,如果均不能执行,则失败。

有各种各样的俄罗斯方块旋转系统,全部记录在Wikia上:旋转系统

SRS是“官方”俄罗斯方块规范,对于涉及表的墙脚踢,它具有相当复杂的算法。最后一块甚至可能根本不与原始块重叠!

DTET旋转系统扩展通过检查其他五个踢墙除了刚刚左右最简单的算法。所有作品都遵循相同的规则。


+1,有趣的Wiki。虽然I向左或向右移动一个空格将不起作用。更高级的旋转系统似乎也对不同的块应用了不同的规则。我想找到一种适用于所有块可能性的方法(如果不太昂贵)。
bummzack,2011年

1
@bummzack:好吧,然后对所有块(如DTET系统)使用相同的表。它只是测试除左右之外的更多位置。您可以创建自己的系统并检查所需的任何职位。但是,对所有作品使用相同的桌子可能会导致“不自然的”踢墙。
Leftium

感谢您的修改。这些实际上比Wikia上的材料要好得多。非常感激。
2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.