如何在太空侵略者类游戏中忽略已销毁敌人避免重复计分?
嘿,我来帮你解决这个敌人被销毁后重复加分的问题!
首先,咱们得明确问题根源:敌人生命值归0后,你的后续检测逻辑还是会“看到”这个敌人对象,进而重复触发destroy()方法导致加分重复。下面给你几个实用的解决思路,适配不同的代码结构:
1. 给Enemy类加一个存活状态判断方法
最简单直接的方式,给你的Enemy类新增一个isAlive()方法,用来快速判断敌人是否还存活:
public class Enemy { // 你的现有属性:health, position等 public boolean isAlive() { return health > 0; } }
然后在每次碰撞检测前,先判断敌人是否存活,只有存活的敌人才进行后续检测:
// 修改你的检测代码,先加存活判断 if (enemy2.isAlive() && playerPos + 1 == enemy2.position()) { int power = player.power(2); enemy2.gotHit(power); if (enemy2.health() <= 0) { player.destroy(2); } }
这个方法改动最小,不需要调整现有变量结构,只需要给Enemy类加一个小方法,然后在每个检测逻辑前加个判断就行。
2. 用集合管理所有敌人,动态移除死亡敌人
如果你的敌人数量较多,或者后续可能新增敌人,用集合(比如List<Enemy>)来统一管理会更灵活。这样你可以遍历集合时只处理存活敌人,或者直接移除死亡敌人:
方式A:遍历前过滤存活敌人
// 假设你把所有敌人放到一个List里 List<Enemy> enemies = new ArrayList<>(); enemies.add(enemy1); enemies.add(enemy2); enemies.add(enemy3); // 遍历前先过滤掉已死亡的敌人 for (Enemy enemy : enemies.stream().filter(Enemy::isAlive).toList()) { // 这里写你的碰撞检测逻辑,比如判断炮位和敌人位置是否匹配 if (playerPos + 1 == enemy.position()) { int power = player.power(2); enemy.gotHit(power); if (enemy.health() <= 0) { player.destroy(2); } } }
方式B:遍历过程中移除死亡敌人
用迭代器遍历,遇到死亡敌人直接从集合中移除,后续循环就不会再处理它了:
Iterator<Enemy> enemyIterator = enemies.iterator(); while (enemyIterator.hasNext()) { Enemy enemy = enemyIterator.next(); if (!enemy.isAlive()) { enemyIterator.remove(); continue; } // 碰撞检测逻辑 if (playerPos + 1 == enemy.position()) { int power = player.power(2); enemy.gotHit(power); if (enemy.health() <= 0) { player.destroy(2); enemyIterator.remove(); // 直接从集合移除死亡敌人 } } }
这个方案的好处是,死亡敌人会被彻底从检测队列中移除,从根源上避免重复检测,适合敌人数量动态变化的场景。
3. 标记死亡敌人为null(适合少量固定敌人的场景)
如果你的敌人是固定的几个变量(比如enemy1、enemy2、enemy3),也可以在敌人死亡时把它设为null,然后检测前先判断是否为null:
// 敌人死亡时,除了处理计分,还要把对象设为null if (enemy2.health() <= 0) { player.destroy(2); enemy2 = null; } // 检测前先判断敌人是否存在且存活 if (enemy2 != null && playerPos + 1 == enemy2.position()) { int power = player.power(2); enemy2.gotHit(power); if (enemy2.health() <= 0) { player.destroy(2); enemy2 = null; } }
不过这个方案比较繁琐,敌人数量多的话要写很多null判断,不如前两个方案灵活。
总结一下,如果你只是少量固定敌人,方案1最省心;如果敌人数量可能变化,方案2的集合管理会更适合。
内容的提问来源于stack exchange,提问作者Jaffar Rizvi
相关产品推荐
相关产品推荐

