在 Python 中使用俄罗斯方块旋转与坐标系统



我需要一个算法来旋转俄罗斯方块中的方块,我尝试查看堆栈溢出,但所有解决方案都需要一些枢轴点,什么不需要,我不知道如何找到它,所以我想知道是否有人可以帮助我

我基本上尝试了俄罗斯方块旋转算法中的所有内容

网格系统是:

x 1 2 3 4 5 6 7 8 9 10
y
10
9
8
7
6
5
4
3
2
1

阻止列表如下所示:

block = [[3, 5], [4, 5], [5, 5], [6, 5]]

其中 [x, y]

我基本上只想要俄罗斯方块旋转,像这样:https://tetris.fandom.com/wiki/SRS

我发现,要旋转网格中存在的任何大小的片段,只需要两个图形操作。

如果要顺时针旋转棋子,请先反转组成棋子的每个方块的坐标。这意味着交换每个块的 x 和 y 坐标。

在代码中,它可能看起来像这样

for (int i = 0; i < sizeOfPiece; i++)
{
int temp = piece[i].X;
piece[i].X = piece[i].Y;
piece[i].Y = temp;
}

然后,将新操作的工件镜像到 Y 轴上。这可以通过获取每个块的 x 坐标并将其设置为等于整个块的宽度来完成 - x 坐标。

代码可能如下所示:

for (int i = 0; i < sizeOfPiece; i++)
{
piece[i].X = pieceWidth - piece[i].X;
}

哪里int pieceWidth = piece[RightEdge].X - piece[leftEdge].X;

如果您在找到作品的左右边缘时遇到问题,这应该可以正常工作

int edges[4] = {0,    0,     0,  0};
for (int i = 1; i < sizeOfPiece; i++)
{
if (piece[i].X < piece[edges[LEFT]].X) edges[LEFT] = i;   //Check for a block on the left edge
if (piece[i].X > piece[edges[RIGHT]].X) edges[RIGHT] = i; //Check for a block on the right edge
if (piece[i].Y < piece[edges[UP]].Y) edges[UP] = i;       //Check for a block on the upper edge
if (piece[i].Y > piece[edges[DOWN]].Y) edges[DOWN] = i;   //Check for a block on the bottom edge
}

其中左 = 0,右 = 1,向上 = 2,向下 = 3

在这种情况下,边缘数组存储单个块的 ID,该块位于该块的 4 条边中的每一个上。只需要左右边缘来查找宽度,但其他边缘在其他点可能很有用。

在这种情况下,前面提到的 pieceWidth 公式实际上如下所示:

int pieceWidth = piece[edges[RIGHT]].X - piece[edges[LEFT]].X;

如果你想逆时针旋转,只需做相反的事情。这意味着您首先在 y 轴上镜像该块,然后反转其坐标。

我已经绘制了这些图形翻译的一点可视化表示:

图片

在上图中,红色部分表示原始部分,蓝色过渡显示反转后的部分,绿色部分表示在 y 轴上镜像后的前一块。

上面的示例是顺时针旋转,而下面的示例是逆时针旋转。

最新更新