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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:35:50