【问题标题】:rotation with tetris in python with coordsystem在带有坐标系统的python中使用俄罗斯方块旋转
【发布时间】:2019-04-25 20:10:11
【问题描述】:

我需要一个算法来旋转俄罗斯方块中的块,我试过查看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

【问题讨论】:

    标签: python matrix rotation block tetris


    【解决方案1】:

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

    如果你想顺时针旋转棋子,首先反转组成棋子的每个块的坐标。这意味着交换每个块的 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,该块位于块的 4 个边缘中的每一个上。只需要右边缘和左边缘来计算宽度,但在其他点上知道其他边缘可能很有用。

    在这种情况下,前面提到的pieceWidth 公式实际上应该是这样的:

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

    如果您想逆时针旋转,只需执行相反的操作即可。这意味着您首先在 y 轴上镜像该部分,然后反转它的坐标。

    我已经为这些付诸实施的图形翻译绘制了一些视觉表示:

    Picture

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多