俄罗斯方块全排只有一半被删除

时间:2018-04-09 16:28:33

标签: java algorithm processing

我正在尝试使用Processing 3创建一个俄罗斯方块游戏。

我的问题是最高的完整行只删除了一半。 以下是一些屏幕截图,用于说明在最后一步之前发生的事情:

ROWID

在最后一步之后:

Before the last move

这是处理删除行的代码:

void remove_full_line() {
  for(int h = 900; h > 0; h-=50) {
    if (line_sum(h) == 12) { // 12 column-canvas
      for (int i = 0; i < fallen_tetros.size(); i++) {
        if (fallen_tetros.get(i)[1] == h) {
          fallen_tetros.remove(i);
        }
      }
    }
  }
  // ...
  // Code to lower the rows above
  // ...
}

fallen_tetrosArrayList<int[]>,每个元素都包含单个方格的xy坐标(不是完整的tetromino)。

如您所见,我使用50x50正方形,所以我从底部(900)开始检查每50个像素的整行。

我担心的是,由于某些方块被删除,因此该行似乎已被视为已满。但我不明白为什么只有一半被删除,为什么它只发生在最高行。

1 个答案:

答案 0 :(得分:0)

你应该养成debugging your code的习惯,以确切了解发生了什么。考虑在代码中添加println()语句,如下所示:

for (int i = 0; i < fallen_tetros.size(); i++) {
   println("i: " + i);     
   if (fallen_tetros.get(i)[1] == h) {
     println("removing: " + i);
     fallen_tetros.remove(i);
     println("tetros size: " + tetros.size());
   }
}

但基本上,你的问题是由你在迭代它时从ArrayList删除项目引起的。当您删除项目(例如,在索引0处)时,其他每个项目都会向下移动一个项目。您在索引0处有一个新项目。然后您的for循环转到下一个索引(索引1)并删除该项目,并再次将所有内容向下移动一个。您在索引1处有一个新项目,然后继续索引2.但请注意,您基本上正在跳过刚刚移入您刚删除的索引的项目!

您可以looping backwards或使用Iterator来解决此问题。

另请注意,将像素坐标与数组索引混合似乎有点奇怪。只需将所有内容存储在2D数组中,或者将每个行存储在一个ArrayList中(而不是像目前的代码一样保存每一列)。这样您就不必单独遍历每个单元格,只需一次删除整行即可。