Java for循环与布尔数组始终返回true问题技术求助
问题分析与修复建议
咱们直接拆解你代码里的核心问题,这就是导致for循环和eliminated数组没按预期工作的根源:
1. 碰撞检测没对准单个僵尸
你的zomCollision方法传的是整个zombies数组,而不是当前循环的zombies[i]。这意味着每次循环判断的是玩家是否和任意僵尸碰撞,而不是和第i个僵尸碰撞。结果就是只要有一个僵尸碰到玩家,所有循环到的eliminated[i]都会被设为true,完全不是你想要的“标记单个被碰撞的僵尸”的效果。
你得修改zomCollision,让它接收单个僵尸对象:
// 把判断改成针对当前索引的僵尸,同时布尔值不用写==true,直接用就行 if (zomCollision(runner, zombies[i], panel, g)) { eliminated[i] = true; }
2. 重复调用displayZombies导致绘制混乱
你的循环里每次先调用一次displayZombies,然后如果当前僵尸没被消除,又调用一次。这会带来两个问题:
- 未被消除的僵尸会被绘制两次,画面容易重叠、闪烁
- 已经被消除的僵尸也会先被画一次,才跳过第二次绘制
正确的逻辑应该是先批量更新所有僵尸的消除状态,再统一绘制存活的僵尸,而不是在循环里反复绘制。给你个修复后的示例:
// 第一步:先遍历所有僵尸,更新消除状态 for (int i = 0; i < zombies.length; i++) { if (zomCollision(runner, zombies[i], panel, g)) { eliminated[i] = true; } } // 第二步:统一绘制所有没被消除的僵尸 for (int i = 0; i < zombies.length; i++) { if (!eliminated[i]) { // 如果displayZombies原本是画单个僵尸,就传zombies[i] displayZombies(panel, g, zombies[i]); // 如果必须传整个数组,那得在displayZombies内部判断eliminated状态 } }
3. 小细节优化
Java里判断布尔值不用写== true,直接写if (布尔变量)就够了,代码更简洁还不容易出错。
额外提示
如果你的displayZombies是用来绘制所有僵尸的,记得绘制前先清除画布,不然已经被消除的僵尸会一直留在画面上哦。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

