-4

我通过旋转公式旋转每一块。更详细,因为旋转角度是 90 所以:

xNew = y;  

yNew = -x;

但是我的方法遇到了两个问题:

1) 开箱即用:每种类型的部件都适合 4x4 正方形。(左下角的 0,0)但是通过这种旋转,在某些情况下它们会脱离这个框。例如,有一个坐标为 (5,6) 的点,请帮助我如何再次将这些坐标放入 4x4 框,或者给我另一个公式。

2)在I case:(4个正方形在同一行或同一列),只有两个旋转案例。但在上面的方法中,他们仍然有 4 件。那么,如何防止这种情况。

谢谢 :)

4

2 回答 2

3

俄罗斯方块板是网格布局。一个非常简单的理解方式是,俄罗斯方块只是一组“填充”的正方形。在布尔意义上,一块可以被视为0,或未填充,或1,已填充。使用网格(或基于图块)的方法将防止您的块超出界限,并且作为额外的好处,当您到达底部碰撞时还可以简化碰撞代码。

伪代码:您可以检查您想要移动的空间if (!grid[x][y]) block.move(direction)在哪里,并且是一个任意函数,可以在指定的任何方向上通过一个网格空间调整您的作品和地图。从这个意义上说,你的游戏循环也可以用来逐步丢弃一块并用于下一块。grid[x][y]block.move(direction)block.move('down')else block.stop(), game.generateBlock()

使用网格方法,您可以轻松地检查旋转的部分是否会超出边界if(x < 0 || x > gridWidth) block.move(direction),因为direction与移动超出边界的方向相反。

继续基于网格的示例,您的作品实际上也只是一种开/关模式,它们的旋转显示如下:

  ▇    ▇        ▇ ▇    ▇ ▇ ▇
  ▇ or ▇ ▇ ▇ or ▇   or     ▇
▇ ▇             ▇

这幅基本的艺术品所说明的是,由于通常是矩形的碎片,碎片不会围绕中心点旋转。但是,这些模式可以很容易地以布尔状态存储,并且您可以跟踪它所在的“位置”并编写代码来测试它,而不管方向如何。

由于每件作品都有有限数量的模式(最多 4 个),因此简单地硬编码它们可能符合您的最大利益。这个答案提供了一些您可能会觉得鼓舞人心的代码:https ://stackoverflow.com /a/8131337/571506

我强烈建议您进行研究并使用这些简单的变量学习一点线性代数,如果您有一点机会进入 3D 游戏编程。由于每个片段都可以存储为矩阵,因此您可以对基本“片段矩阵”应用简单的变换以获得新模式。这很容易被伪造,或者你可以全力以赴。我强烈建议您进行研究并使用这些简单的变量学习一点线性代数,如果您有一点机会进入 3D 游戏编程。对于算法,请查看以下问题:如何旋转二维数组?

俄罗斯方块是一个非常有据可查的游戏,可以为你的“工具箱”添加很多技能。尝试使用提供的范例尽可能多地解决它,同时手动进行大部分编程,从长远来看,您会发现它会受益匪浅。

于 2012-06-19T18:29:01.347 回答
0

我不明白问题 2,但对于问题 1,你需要做的不仅仅是旋转,你还必须将棋子移到左/右/上/下。

于 2012-06-19T17:53:07.103 回答