You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求解析俄罗斯方块(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 17:10:24