C#List <矩形> 90度转弯

时间:2015-11-16 21:53:21

标签: c# rotation tetris

我正在使用C#tetris游戏,在我的代码中我得到了一个List&lt;&gt;矩形对象

private List<Rectangle> lstBlocks = new List<Rectangle>();

此列表可以包含几种类型的矩形集合,基于随机数(通过生成新的TetrisBlock())

public TetrisBlock(int size, int speelveldwith,Brush blockColor,int maxY)
    {
        this.size = size;
        this.blockColor = blockColor;
        this.maxY = maxY;

        int x_pos;
        x_pos = rnd.Next(0, speelveldwith - (size));
        if (x_pos % size != 0)
        {
            x_pos = (x_pos / size) * size;
        }

        switch (rnd.Next(1, 8))
        {
            case 1:
                // 4 blocks onder elkaar
                lstBlocks.Add(new Rectangle(x_pos, 0, size, size));
                lstBlocks.Add(new Rectangle(x_pos, size, size, size));
                lstBlocks.Add(new Rectangle(x_pos, size * 2, size, size));
                lstBlocks.Add(new Rectangle(x_pos, size * 3, size, size));
                iObjectHeight = size * 4;
                break;
            case 2:
                // L - Block
                lstBlocks.Add(new Rectangle(x_pos, 0, size, size));
                lstBlocks.Add(new Rectangle(x_pos, size, size, size));
                lstBlocks.Add(new Rectangle(x_pos+size, size * 2, size, size));
                lstBlocks.Add(new Rectangle(x_pos, size * 2, size, size));
                iObjectHeight = 3 * size;
                break;
            case 3:
                // I- met uitstekend puntje
                lstBlocks.Add(new Rectangle(x_pos, 0, size, size));
                lstBlocks.Add(new Rectangle(x_pos, size, size, size));
                lstBlocks.Add(new Rectangle(x_pos + size, size, size, size));
                lstBlocks.Add(new Rectangle(x_pos, size * 2, size, size));
                iObjectHeight = 3 * size;
                break;
            case 4:
                //omgedraaide L
                lstBlocks.Add(new Rectangle(x_pos, 0, size, size));
                lstBlocks.Add(new Rectangle(x_pos, size, size, size));
                lstBlocks.Add(new Rectangle(x_pos, size * 2, size, size));
                lstBlocks.Add(new Rectangle(x_pos + size, 0, size, size));
                iObjectHeight = 3 * size;
                break;
            case 5:
                //vierkantje
                lstBlocks.Add(new Rectangle(x_pos, 0, size, size));
                lstBlocks.Add(new Rectangle(x_pos, size, size, size));
                lstBlocks.Add(new Rectangle(x_pos + size, 0, size, size));
                lstBlocks.Add(new Rectangle(x_pos + size, size, size, size));
                iObjectHeight = 2 * size;
                break;
            case 6:
                //rupsje
                lstBlocks.Add(new Rectangle(x_pos, size, size, size));
                lstBlocks.Add(new Rectangle(x_pos + size, size, size, size));
                lstBlocks.Add(new Rectangle(x_pos + size, 0, size, size));
                lstBlocks.Add(new Rectangle(x_pos + size * 2, 0, size, size));
                iObjectHeight = 2 * size;
                break;
            case 7:
                //omgedraaid rupsje
                lstBlocks.Add(new Rectangle(x_pos, 0, size, size));
                lstBlocks.Add(new Rectangle(x_pos + size, 0, size, size));
                lstBlocks.Add(new Rectangle(x_pos + size, size, size, size));
                lstBlocks.Add(new Rectangle(x_pos + size * 2, size, size, size));
                iObjectHeight = 2 * size;
                break;
        }
    }

我一直在用纸来解决这个问题,但是我仍然坚持旋转这个矩形集合enter image description here

在这张图片中,我有阻止case3

有人对我有一些提示或提示吗?

3 个答案:

答案 0 :(得分:1)

我建议使用二维数组来定义tetromino的形状,旋转处理起来会容易得多:

bool[,] rotated = new bool[4,4];
for (int y = 0; y < Height; y++) {
    for (int x = 0; x < Width; x++) {
        rotated[Height - y - 1, x] = grid[x, y];
    }
}

此代码适用于&#39;尺寸&#39;为1,所以你可以很容易地找出块的位置。

但是,在您的情况下,使用此代码会有点困难,因为您已经将x偏移量包含在块的位置(我建议将位置保留在某个位置)你的TetrisBlock中的其他内容,并在渲染阶段将其与矩形相加)。如果您要删除x_pos,则可以执行以下操作:

List<Rectangle> tempRotated = new List<Rectangle>();
foreach(Rectangle rect in lstBlocks) {
    tempRotated.Add(new Rectangle((Height - 1) * size - rect.y, rect.x, size, size));
}
lstBlocks = tempRotated;

如果我们将此应用于您手写示例中的块,您将获得以下结果:

这种情况下的高度为3(彼此相距3个区块),因此(Height - 1) * size=2*20=40

矩形1在0,0处:新的x值为40-y = 40,y值为x值,0。 矩形2在0,20:x = 40-20 = 20,y = x = 0
矩形3在0,40:x = 40-40 = 0,y = x = 0
矩形4在20,20:x = 40-20 = 20,y = x = 20

现在由您决定绘制这个并看看它是如何工作的。

如果您保留x_pos,则应将代码更改为new Rectangle((Height - 1) * size - rect.y + x_pos, rect.x - x_pos, size, size)

答案 1 :(得分:0)

我的提示是创建一个类TetrisBlock。在本课程中,不要使用大小,使用1.在绘制之前不要使用大小。所以你容易受阻。

为四个轮换中的每一个赋予班级List<Rectangle>。在这里,您可以存储每个旋转的矩形。当你在纸上画它时,这应该很容易理解。然后,而不是旋转,选择下一个旋转。

现在创建所有TetrisBlocks的列表。创建具有所有旋转的所有可用块。稍后,选择该列表的元素(带有随机数),创建副本并使用它。

这应该会让事情变得更容易......

答案 2 :(得分:0)

我通过为列表中的块创建所有可能的组合来修复它。无论如何,谢谢:)