我需要一个算法来旋转俄罗斯方块中的块,我尝试查看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
答案 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轴上镜像该零件,然后反转其坐标。
我对这些付诸行动的图形翻译作了一些直观的表示:
在上图中,红色部分表示原始作品,蓝色过渡显示了反转后的作品,绿色部分显示了在y轴上镜像的先前作品。
上面的示例是顺时针旋转,而下面的示例是逆时针旋转。