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