Java OOP实战:如何在对象HP≤0时自动重置并触发提示?
解决Java游戏角色攻击后HP负数的问题
问题核心
你当前的代码在攻击后会让目标HP变为负数,且之前的错误逻辑误判了攻击者自身的HP,而非被攻击目标的状态,导致需求无法实现。
基础修复方案
直接修改Player和Enemy的attack方法,在扣除目标HP后,检查目标的HP状态,若≤0则修正为0并打印提示(注意避免重复打印):
修改后的Player类
class Player extends Character { public Player() { HP = 100; ATK = 40; } public void attack(Enemy a) { // 先扣除目标HP a.HP -= this.ATK; // 检查目标是否已濒死 if (a.HP <= 0) { // 仅当HP从正数降到≤0时执行修正和打印,避免重复输出 if (a.HP < 0) { a.HP = 0; System.out.println("An enemy was terminated."); } } } }
修改后的Enemy类
同理,处理Player的HP状态:
class Enemy extends Character { public Enemy() { HP = 50; ATK = 10; } public void attack(Player a) { a.HP -= this.ATK; if (a.HP <= 0) { if (a.HP < 0) { a.HP = 0; System.out.println("The player was terminated."); } } } }
运行主方法后,第二次攻击Enemy时,HP会被修正为0,并打印An enemy was terminated.,不会出现负数。
进阶优化(符合OOP封装原则)
为了避免重复代码,将伤害处理逻辑封装到父类Character中,实现代码复用:
优化后的Character类
public class Character { int HP; int ATK; // 统一处理受到伤害的逻辑 public void takeDamage(int damage) { int originalHP = HP; HP -= damage; // 仅当原本存活,现在濒死时执行修正和提示 if (originalHP > 0 && HP <= 0) { HP = 0; // 根据角色类型输出对应提示 if (this instanceof Enemy) { System.out.println("An enemy was terminated."); } else if (this instanceof Player) { System.out.println("The player was terminated."); } } } }
简化后的Player和Enemy类
class Player extends Character { public Player() { HP = 100; ATK = 40; } public void attack(Enemy a) { a.takeDamage(this.ATK); } } class Enemy extends Character { public Enemy() { HP = 50; ATK = 10; } public void attack(Player a) { a.takeDamage(this.ATK); } }
这种方式将状态管理集中在父类,子类只需调用方法即可,更符合面向对象的设计思想,也方便后续扩展更多角色类型。
内容的提问来源于stack exchange,提问作者markwasterrible
相关产品推荐
相关产品推荐

