旋转后的格块可能与墙或已有方块重叠。某些游戏会按固定顺序尝试几个小位移,找到第一个合法位置;这个顺序本身也是规则的一部分。
采用自定义L形格块和整数枢轴,局部坐标顺时针旋转为负y、x。旋转后依次尝试零位移、向左一格、向右一格、向上一格、向左两格、向右两格;只要所有格子在边界内且不重叠,就立即接受。
本例的输入和输出
六列八行地图,枢轴[0, 5],局部格子[(0, 0), (0, 1), (0, 2), (1, 2)]。已占用坐标[(1, 1), (1, 2), (1, 5), (2, 0), (2, 3), (2, 5), (3, 2), (4, 3), (4, 7)]。坐标向右和向下为正。
尝试平移 | 旋转后的世界格子 | 不合法原因 [0, 0] | [[0, 5], [-1, 5], [-2, 5], [-2, 6]] | [[-1, 5, '越界'], [-2, 5, '越界'], [-2, 6, '越界']] [-1, 0] | [[-1, 5], [-2, 5], [-3, 5], [-3, 6]] | [[-1, 5, '越界'], [-2, 5, '越界'], [-3, 5, '越界'], [-3, 6, '越界']] [1, 0] | [[1, 5], [0, 5], [-1, 5], [-1, 6]] | [[1, 5, '占用'], [-1, 5, '越界'], [-1, 6, '越界']] [0, -1] | [[0, 4], [-1, 4], [-2, 4], [-2, 5]] | [[-1, 4, '越界'], [-2, 4, '越界'], [-2, 5, '越界']] [-2, 0] | [[-2, 5], [-3, 5], [-4, 5], [-4, 6]] | [[-2, 5, '越界'], [-3, 5, '越界'], [-4, 5, '越界'], [-4, 6, '越界']] [2, 0] | [[2, 5], [1, 5], [0, 5], [0, 6]] | [[2, 5, '占用'], [1, 5, '占用']] 接受的位移:全部失败,保持原状。
表格中的编号只标识当前例子的元素,不应把对象身份、数组下标与计算数值混为一谈。阅读时先核对输入和边界,再沿记录检查每一步;空结果表示规则下没有可用项,并不是默认返回数值零。
复核与适用条件
逐个记录越界或碰到已占格子的具体位置。不能跳过前面已经合法的候选而挑一个自己更喜欢的落点;若全部失败,保留旋转前的位置和形状。
这里没有使用任何现成游戏的正式旋转系统,也不规定落地锁定、连续旋转或特殊格块的规则。候选顺序只是本文明确给出的模型,理解后可按自己的规则另行设计。
练习时先独立复算一小段,再检查整体结果是否满足文中条件。遇到差异应保留中间记录并定位第一处不一致,而不是只调整最后答案。更换输入或操作规则后,需要重新计算,原记录只对这一例负责。
