使用coordsystem在Python中使用俄罗斯方块进行旋转

时间:2019-04-25 20:10:11

标签: python matrix rotation block tetris

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

我基本上已经尝试了Tetris Piece Rotation Algorithm

中的所有内容

网格系统是:

 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

1 个答案:

答案 0 :(得分:0)

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

如果要顺时针旋转工件,请首先反转组成工件的每个块的坐标。这意味着交换每个块的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

}

其中LEFT = 0,RIGHT = 1,UP = 2,DOWN = 3

在这种情况下,edges数组存储单个块的ID,该ID位于块的4个边缘中的每个边缘上。仅需要左右边缘即可找到宽度,但在其他点知道其他边缘可能很有用。

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

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

如果要逆时针旋转,请执行相反的操作。这意味着您首先要在y轴上镜像该零件,然后反转其坐标。

我对这些付诸行动的图形翻译作了一些直观的表示:

Picture

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

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