Processing 3 开发俄罗斯方块:最高满行仅半删除问题排查
解决Processing俄罗斯方块满行消除不彻底的问题
你遇到的“最上方满行仅被删除一半”的问题,核心原因是遍历方块列表时的删除逻辑存在索引漏洞,我们来一步步拆解并修复:
问题根源
先看你当前的删除逻辑片段:
for (int i = 0; i < fallen_tetros.size(); i++) { if (fallen_tetros.get(i)[1] == h) { fallen_tetros.remove(i); // ... 其他后续代码 } }
当你调用remove(i)删除元素时,列表长度会立刻减1,原本在i+1位置的方块会自动前移到i的位置。但循环的i会继续递增,直接跳过了这个刚移过来的方块——这就导致同一行的部分方块没被删除,出现“删一半”的现象。
修复方案
这里有三种可靠的修复方式,你可以根据习惯选择:
方案1:倒序遍历列表
从列表末尾往前遍历,删除元素不会影响未遍历的元素索引:
for (int i = fallen_tetros.size() - 1; i >= 0; i--) { if (fallen_tetros.get(i)[1] == h) { fallen_tetros.remove(i); } }
方案2:使用迭代器(集合操作的标准安全方式)
Java迭代器专门处理遍历中删除元素的场景,彻底避免索引混乱:
Iterator<int[]> iterator = fallen_tetros.iterator(); while (iterator.hasNext()) { int[] tetro = iterator.next(); if (tetro[1] == h) { iterator.remove(); } }
方案3:先收集待删除元素,再批量移除
先把需要删除的方块统一收集,再一次性从列表中移除,可读性更强:
List<int[]> toRemove = new ArrayList<>(); for (int[] tetro : fallen_tetros) { if (tetro[1] == h) { toRemove.add(tetro); } } fallen_tetros.removeAll(toRemove);
额外检查建议
你也可以同步确认line_sum(h)函数的逻辑是否准确,确保它能正确判断一行是否被12个方块填满——如果这个判断逻辑出错,也可能间接导致删除行为异常。
内容的提问来源于stack exchange,提问作者Mat
相关产品推荐
相关产品推荐

