You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:24:23