俄罗斯方块克隆 Java,移动一块时越界?

Tetris clone in Java, out of bounds while moving a piece?

我正在尝试编写俄罗斯方块克隆。我的棋盘是一个 10x20 的整数数组,其中 0 表示没有图块,1-7 表示特定颜色的图块。它不断被翻译成图形解释。我的形状是 4x4 整数数组。我刚刚意识到,虽然将所有形状都设为 4x4 让一些事情变得更容易,但在左右移动一块时也会造成问题。假设我们有 I 形状:

0010
0010
0010
0010

现在,如果我把它移到左边的墙上,总会有两个单位长的空隙,因为 0 不能移到主板阵列之外。允许 1 移动到左墙而不导致越界异常的最简单方法是什么?

使用您描述的方法,简单地避免获得 IndexOutOfBoundsException 的一种方法是将您的板扩展为 18 x 24 而不是 10 x 24,然后编写额外的代码如果对象数组中有任何 1 离开网格中间的 10 个方格,则不允许您移动方块 left/right。通过将此 'padding' 添加到您的网格,您可以避免异常并且应该仍然能够实施。

我希望这种方法对您有意义。如果不是,我可以提供一个更伪代码驱动的答案,但我希望你能理解。 (如有任何问题,请发表评论。)

顺便说一句,@assylias 提出了一个很好的观点。重要的是在开始实施之前有一个好的 design/plan 以避免像这样的路障。它是有经验的,所以不断练习,你就会掌握它的窍门。

注意: 正如 Nick 在评论中指出的那样,另一种方法是在移动任何数组之前简单地检查是否有任何 1 离开网格。这当然是可能的(并且可以说是一个更 elegant/simple 的解决方案),尽管可能更难做到正确。

您需要一种方法来检测与边界和现有片段的冲突。

你可能会在每个棋子上有一个固定的手柄,你还会有一个棋子的 X 和 Y 偏移量,这表明它在网格中向下移动时的位置。

要阻止棋子越界,循环遍历移动棋子的 4*4 矩阵并检查设置为 1 的位 确保 X 位置 + X 偏移 >= 0 且 <=9 并且 Y 位置 >=0 且 <=19 如果这些检查中的任何一个失败 那么您的棋子将超出棋盘阵列的限制,因此请停止更改为适当的 x 或 y offest。

将棋子矩阵中设置位的坐标转换为棋盘数组还可以让您检查棋子是否与棋盘中已有的棋子发生碰撞。

当一个部件旋转时,你应该做这些碰撞检查,我想。