【问题标题】:Tetris clone in Java, out of bounds while moving a piece?Java中的俄罗斯方块克隆,移动一块时越界?
【发布时间】:2018-08-30 12:29:48
【问题描述】:

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

0010
0010
0010
0010

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

【问题讨论】:

  • 查看您的设计?
  • 如果不看代码就很难说,但最好用真实的形状来表示形状 - 正方形、T 形、L 形等,而不是 4x4 矩阵。

标签: java indexoutofboundsexception tetris


【解决方案1】:

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

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

顺便说一句,@assylias 提出了一个很好的观点。在开始实施之前有一个好的设计/计划很重要,以避免像这样的道路颠簸。它伴随着经验,所以坚持练习,你就会掌握它的窍门。

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

【讨论】:

  • 谢谢,我试试看:)
  • 如果您遇到任何问题,请告诉我,很高兴我能提供帮助!
  • @Alerra,您给出的编写代码以确保没有 1 离开网格的建议是您答案中唯一有效的部分。相同的例程可以使用原始大小的网格。不需要在边缘添加填充。
  • 确实,可以事先做个检查来检查1的离开,我会在我的答案中添加一个注释。但是,我回答了这个问题,假设 OP 希望保留他使用 4x4 网格的程序部分。在没有填充的情况下这样做是可行的,但也会使其变得更加困难(在我看来)。
  • 是的,我想保留 4x4 件设计。左侧、右侧和底部的 3 宽填充效果很好
【解决方案2】:

您需要一种检测与边界和现有碎片碰撞的方法。

您可能在每件作品上都有一个固定的手柄,您还将为该作品设置一个 X 和 Y 坐标,以指示它在网格中向下移动时的位置。

要阻止棋子移动出界,循环移动棋子的 4*4 矩阵,对于设置为 1 的位,只需检查 确保 X 位置 + X 偏移 >= 0 和 =0 和

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

你应该在一个部件旋转时进行这些碰撞检查。

【讨论】:

    猜你喜欢
    • 2013-03-17
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多