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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:25:15