我正在尝试使用Processing 3创建一个俄罗斯方块游戏。
我的问题是最高的完整行只删除了一半。 以下是一些屏幕截图,用于说明在最后一步之前发生的事情:
在最后一步之后:
这是处理删除行的代码:
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_tetros
是ArrayList<int[]>
,每个元素都包含单个方格的x
和y
坐标(不是完整的tetromino)。
如您所见,我使用50x50正方形,所以我从底部(900)开始检查每50个像素的整行。
我担心的是,由于某些方块被删除,因此该行似乎已被视为已满。但我不明白为什么只有一半被删除,为什么它只发生在最高行。
答案 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中(而不是像目前的代码一样保存每一列)。这样您就不必单独遍历每个单元格,只需一次删除整行即可。