【问题标题】:How to double a value of private int type field?如何将私有 int 类型字段的值加倍?
【发布时间】:2021-12-20 15:50:12
【问题描述】:

这是类Enemy中方法takeDamage的代码,它是类Vampire的超类。

public void takeDamage(int damage) {
    int remainingHitPoints = hitPoints - damage;

    if (remainingHitPoints > 0) {
        setHitPoints(remainingHitPoints);
        System.out.println(name + " took " + damage + " damage and have " + remainingHitPoints + " HitPoint left" + "\n------------------------------------" );
    } else {
        this.lives = this.lives - 1;
        System.out.println(name + " took " + damage + " damage" + "\n------------------------------------" + "\n" + name +" lost a life" + "\n------------------------------------");

        if (lives > 0) {
            System.out.println(name + " revived" + "\n------------------------------------");
            setHitPoints(remainingHitPoints + damage);
        } else {
            System.out.println(name + " is dead now RIP" + "\n------------------------------------");
            setHitPoints(0);
        }
    }
}

Vampire 类中,我重写了takeDamge 方法:

public void takeDamage(int damage) {
    int inflictedDamage = damage/2;
    int doubleHitPoints = getHitPoints()*2;
    int remainingHitPoints = getHitPoints() - inflictedDamage;
    int remainingLives = getLives() - 1;

    if (remainingHitPoints > 0) {
        setHitPoints(remainingHitPoints);
        System.out.println(getName() + " took " + inflictedDamage + " damage(Vampire takes inflicted damage) and has " + remainingHitPoints + " HitPoint left" + "\n------------------------------------" );
    } else {
        setLives(remainingLives);
        System.out.println(getName() + " took " + inflictedDamage + " damage(Vampire takes inflicted damage)" + "\n------------------------------------" + "\n" + getName() +" lost a life" + "\n------------------------------------");

        if (remainingLives > 0) {
            System.out.println(getName() + " revived and even got stronger!" + "\n------------------------------------");
            setHitPoints(doubleHitPoints);
        } else {
            System.out.println(getName() + " is dead now RIP" + "\n------------------------------------");
            setHitPoints(0);
        }
    }
}

我打算将对象的 hitPoints 加倍,它最初由构造函数设置。

Vampire 对象受到足够的伤害而死时(换句话说,当它失去生命时),此方法成功地将对象的hitPoints 加倍。

Vampire 对象受到的伤害不足以导致死亡时,问题就会发生(如果我诊断正确的话)。

setHitPoints(remainingHitpoints); 被执行,当Vampire 对象受到足够多的伤害而死时,它会将对象的remainingHitPoints 翻倍,而不是原来的hitPoints

我想解决这个问题。

hitPoints 字段在Enemy 类中被声明为私有,所以如果我理解得很好,修改该字段值的唯一方法是在getHitPoint 类中使用getHitPoint 方法(getter) .

【问题讨论】:

    标签: java oop inheritance constructor super


    【解决方案1】:

    你需要一个存储原始生命值的地方。

    如果您的 Enemy 类没有提供此信息,而您只需要在 Vampire 类中使用它,您可以按照以下方式更改 Vampire 类:

    public class Vampire extends Enemy {
    
        private int originalHitPoints;
    
        public Vampire() {
            // ...
            originalHitPoints = getHitPoints();
        }
    
        public void takeDamage(int damage) {
            // ...
    
            if (remainingLives > 0) {
                System.out.println(getName() + " revived and even got stronger!" + "\n------------------------------------");
                setHitPoints(originalHitPoints * 2);
            }
    
            // ...
        }
    }
    

    如果你想在每次吸血鬼死亡时将生命值加倍,你可以像这样更改takeDamage() 的代码:

        public void takeDamage(int damage) {
            // ...
    
            if (remainingLives > 0) {
                System.out.println(getName() + " revived and even got stronger!" + "\n------------------------------------");
                originalHitPointes *= 2; // double the hit points
                setHitPoints(originalHitPoints);
            }
    
            // ...
        }
    

    【讨论】:

    • 非常感谢您的回答。我将您的建议应用到我的代码中,并且确实有效。很抱歉再次打扰您,我的代码仍然不能完全按照我的预期方式运行。此外,我想每次将 originalHitPoints 加倍,直到生活变量等于 0。我尝试在其中放入 for 循环,但没有成功。你能帮忙吗?
    • @JavaLearner 我已经添加了关于如何在每次吸血鬼死亡时将原始生命值翻倍的代码。
    • 非常感谢您的帮助!
    • @JavaLearner 如果此答案有效,请将其标记为“已接受”
    猜你喜欢
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多