1

我正在用 Java 制作俄罗斯方块游戏,当他们击中另一块已经降落的块时,我很难让当前块停止。我为每个 tetromino 形状都有单独的类。当 currentPiece 下降时,将 Y 坐标最低且 X 值与 currentPiece 相同的形状设置为 currentPiece 的停止点。问题是这块通过与 currentPiece 中心相邻的块,并且对所有可能的形状和旋转进行编码是很乏味的

有没有更好的方法来做到这一点?基本上,我的问题是,如何处理俄罗斯方块的边界?

链接到我的 java 文件: http: //goo.gl/Ms8Mj (请原谅我的混乱)

每个块都由一个值表表示,对于 L 形状,它是:

{0,0},{1,0},{0,1},{0,2}

“中间”块被视为原点。我正在考虑制作一个二维布尔数组来判断一个位置是否被占用。

4

3 回答 3

4

也许构建一个 2d 视图来表示已经放置的部分。例如。(o代表空位,x代表放置的棋子)

|ooooo|
|oooox|
|ooxxx|
|xxxxx|

查看您的作品及其当前位置。模拟将其移动到需要去的位置,然后检查是否有任何 x/y 坐标重叠。如果是这样,那么它就不能移动到那里。

例如。如果你有一块(用 y 表示)在下面向下移动

4|ooooo|
3|yyyox|
2|ooxxx|
1|xxxxx|
  12345

模拟 yyy 向下移动一个点。然后它占据 (1,2)、(2,2) 和 (3,2)。检查您的表示 - 3,2 已被占用,因此该块无法移动到那里。这个逻辑应该(我认为)适用于任何放置板上的任何形状块。

于 2013-05-23T01:28:36.057 回答
2

将您的行为逻辑与视图逻辑分开。

如果您在行为逻辑中将每个俄罗斯方块部分视为四个块,那么进行碰撞检测将变得相当简单。没有要检测的部分,因为一个块永远不能占用 X 和 X+1 之间的一些空间。它总是一个或另一个。但是,一旦您检测到 X+1 未被占用并且该棋子将继续下落,只需添加一个动画,使该棋子看起来从一个空间移动到另一个空间,同时动画完成,就很简单了逻辑表明该部分已下降 1。

于 2013-05-23T01:23:49.933 回答
0

是的,知道图形应该停在哪里的最好方法是制作一个空盒子和满盒子的 X 射线(二维布尔数组)。
但同时 - 你必须知道要检查你的身材的哪些块。如果您要向下移动图形 - 您必须只检查图形的 LOWER 块。通过放入单独的类别来做到这一点 - 具有唯一水平值的块,并从那里 - 确定哪些具有最低的垂直值。对于视觉表示检查这个

于 2014-10-21T07:57:05.930 回答