python中俄罗斯方块与coordsystem的轮换

2024-04-25 01:15:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要一个alogrithm旋转块在俄罗斯方块,我已经尝试过看堆栈溢出,但所有的解决方案需要一些轴心点和什么不,我不知道如何找到,所以我想知道是否有人可以帮助我

我已经试过了从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


Tags: https网格列表piece堆栈系统解决方案block
1条回答
网友
1楼 · 发布于 2024-04-25 01:15:54

我发现,要旋转网格中任何大小的工件,只需要两个图形操作。你知道吗

如果要按时钟方向旋转工件,首先反转组成工件的每个块的坐标。这意味着交换每个块的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数组存储工件4条边上的每个块的ID。只需要右边缘和左边缘就可以找到宽度,但是在其他点上知道其他边缘可能很有用。你知道吗

在本例中,前面提到的分段宽度公式实际上如下所示:

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

如果你想逆时针旋转,只要做相反的。这意味着您首先在y轴上镜像工件,然后反转其坐标。你知道吗

我已经为这些图形化的翻译制定了一个小小的视觉表达:

Picture

在上图中,红色部分表示原始工件,蓝色过渡显示反转后的工件,绿色部分显示y轴上镜像后的上一个工件。你知道吗

上面的例子是顺时针旋转,而下面的例子是逆时针旋转。你知道吗

相关问题 更多 >