求解析俄罗斯方块(Tetris)方块旋转的坐标表示机制
俄罗斯方块方块旋转状态表示机制解析
你提供的代码是用相对坐标偏移来定义俄罗斯方块(Tetrimino)的初始形状,核心是基于一个**旋转基准点(原点(0,0))**描述每个方块组成块的位置,旋转时只需对这些相对坐标做旋转变换,再结合基准点的绝对位置就能得到旋转后的方块布局,完全符合《2009 Tetris Design Guideline》里的朝向规范。
核心逻辑拆解
每个方块的坐标列表里,所有元组都是组成块相对于基准点(0,0)的偏移量:
- 方块移动时,只需修改基准点的绝对坐标(比如游戏网格中的行/列位置),所有组成块的绝对位置就是「基准点绝对坐标 + 相对偏移量」
- 方块旋转时,对每个相对偏移量应用旋转变换公式即可。常用的90度顺时针旋转变换公式为:
(x, y) → (y, -x),逆时针则是(x, y) → (-y, x)
逐个方块初始朝向解析
代码定义的是每个方块的初始默认朝向,对应设计指南的标准初始形态:
- O块:旋转后形状无变化,直接用2x2的相对偏移围绕基准点形成正方形:
[(0, 0), (0, 1), (1, 0), (1, 1)] - I块:初始为横向长条,基准点位于长条第二个块的位置,四个块在同一水平线(y=0),x偏移从-1到2:
[(-1, 0), (0, 0), (1, 0), (2, 0)] - T块:初始为横向三格加顶部中间一格的T形,基准点在中间横向块位置,偏移包含横向三格(x=-1,0,1,y=0)和顶部中间块(x=0,y=1):
[(-1, 0), (0, 0), (1, 0), (0, 1)] - L块:初始为横向三格加右下角一格的L形,基准点在中间横向块,偏移包含横向三格和右下角的(1,1):
[(-1, 0), (0, 0), (1, 0), (1, 1)] - J块:初始为横向三格加左上角一格的反L形,基准点在中间横向块,偏移包含左上角的(-1,1)和横向三格:
[(-1, 1), (-1, 0), (0, 0), (1, 0)] - S块:初始为右斜Z形,由两组相邻的2x2块组成,偏移对应:
[(-1, 0), (0, 0), (0, 1), (1, 1)] - Z块:初始为左斜Z形,偏移对应:
[(-1, 1), (0, 1), (0, 0), (1, 0)]
旋转示例(以I块为例)
初始横向I块的相对偏移是[(-1,0), (0,0), (1,0), (2,0)],应用90度顺时针旋转公式后,每个偏移变为:
- (-1,0) → (0,1)
- (0,0) → (0,0)
- (1,0) → (0,-1)
- (2,0) → (0,-2)
旋转后的偏移列表为[(0,1), (0,0), (0,-1), (0,-2)],对应纵向的I块,符合设计指南的旋转规范。
原代码片段
Kind::O => &[(0, 0), (0, 1), (1, 0), (1, 1)], Kind::I => &[(-1, 0), (0, 0), (1, 0), (2, 0)], Kind::T => &[(-1, 0), (0, 0), (1, 0), (0, 1)], Kind::L => &[(-1, 0), (0, 0), (1, 0), (1, 1)], Kind::J => &[(-1, 1), (-1, 0), (0, 0), (1, 0)], Kind::S => &[(-1, 0), (0, 0), (0, 1), (1, 1)], Kind::Z => &[(-1, 1), (0, 1), (0, 0), (1, 0)],
内容的提问来源于stack exchange,提问作者BadToTheBone
相关产品推荐
相关产品推荐

