我正在使用C#tetris游戏,在我的代码中我得到了一个List<>矩形对象
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;
}
}
我一直在用纸来解决这个问题,但是我仍然坚持旋转这个矩形集合。
在这张图片中,我有阻止case3
有人对我有一些提示或提示吗?
答案 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)
我通过为列表中的块创建所有可能的组合来修复它。无论如何,谢谢:)