【问题标题】:Java - Store the changing int variableJava - 存储不断变化的 int 变量
【发布时间】:2017-11-16 11:31:40
【问题描述】:

所以我正在尝试编写最简单的游戏,每次“怪物”攻击“玩家”时,我都希望降低变量“int totalHealth”。

public void attack(Player somePlayer) {

    int totalHealth = somePlayer.getHitPoints() + somePlayer.getStrength();

    int remainingHealth = totalHealth - damage;
    if (remainingHealth == 0 || remainingHealth < 0) {
        System.out.println("Your player died");
    } else {
        System.out.println("The monster attacked " + somePlayer.getName() + " and made " + this.damage + " damage");
        System.out.println("Your remaining health is - " + (remainingHealth - somePlayer.getStrength()));
    }

}

但问题是变量“remainingHealth”保持不变,只有当我第一次运行代码时它会降低,每次下一次它保持不变,我猜问题出在这一行:

int totalHealth = somePlayer.getHitPoints() + somePlayer.getStrength();

我猜每次我运行代码

somePlayer.getHitpoints() 

从构造函数中获取插入的整数,这就是问题所在。

我需要想办法以某种方式将剩余的生命值存储在变量中

播放器类:

public class Player implements ISavable{

private String name;
private int hitPoints ;
private int strength ;
private String weapon;
private int damage;
private int totalHealth = hitPoints + strength;

public Player(String name, int damage , int hitPoints , int strength) {
    this.name = name;
    this.damage = damage;
    this.weapon = "Sword";
    this.hitPoints = hitPoints;
    this.strength = strength;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getHitPoints() {
    return hitPoints;
}

public void setHitPoints(int hitPoints) {
    this.hitPoints = hitPoints;
}

public int getStrength() {
    return strength;
}

public void setStrength(int strength) {
    this.strength = strength;
}

public String getWeapon() {
    return weapon;
}

public void setWeapon(String weapon) {
    this.weapon = weapon;
}

public int getTotalHealth() {
    return totalHealth;
}

public void setTotalHealth(int totalHealth) {
    this.totalHealth = totalHealth;
}

@Override
public String toString() {
    return "Player{" +
            "name='" + name + '\'' +
            ", hitPoints=" + hitPoints +
            ", strength=" + strength +
            ", weapon='" + weapon + '\'' +
            '}';
}

@Override
public List<String> write() {
    List<String> values = new ArrayList<String>();
    values.add(0, this.name);
    values.add(1, "" + this.hitPoints);
    values.add(2, "" + this.strength);
    values.add(3, "" + this.weapon);
    values.add(4,"" + this.damage);
    return values;
}

@Override
public void read(List<String> savedValues) {
    if (savedValues != null && savedValues.size()>0){
        this.name = savedValues.get(0);
        this.hitPoints = Integer.parseInt(savedValues.get(1));
        this.strength = Integer.parseInt(savedValues.get(2));
        this.weapon = savedValues.get(3);
    }
}

public void attack(Monster someMonster){
    int health = someMonster.getHitPoints();
    int remainingHealth = health - damage;
    if (remainingHealth == 0 || remainingHealth < 0) {
        System.out.println("You killed the monster !!!");
    } else {
        System.out.println("You attacked the monster " + " and made " + this.damage + " damage");
        System.out.println("Monsters remaining health is - " + remainingHealth);
    }

    if (someMonster.isDead()){
        this.hitPoints = 100;
        this.strength = 50;
    }
}

public void healPlayer(Player somePlayer){
    int hp = somePlayer.getHitPoints();
    hp += 10;
    System.out.println("You healed the player for 10hp , your current hp is " + hp);
}

}

【问题讨论】:

  • 也保留它作为实例变量,在构造时,将其设置为生命值 + 力量,并在他被击中时降低该值
  • totalHealth 退出函数并保持更新
  • totalHealth 每次调用 attack 时都会被实例化 - 因此,如果它不更改值(仅一次),请查看播放器值。为 totalHealth 和 player-values 添加日志记录。打印实际和预期。
  • @canillas 如果player-值在attack()-调用之间发生更改,它将被更新并正确

标签: java


【解决方案1】:

您不会更新 totalHealth 的值,而是在每次调用 attack() 方法时对其进行初始化,因此您始终拥有相同的 Health。

你可以在attack()方法中去掉这一行来解决它:

int totalHealth = somePlayer.getHitPoints() + somePlayer.getStrength();

编辑:

public void attack(Player somePlayer) {

    somePlayer.totalHealth = somePlayer.totalHealth - this.damage;
    if (somePlayer.totalHealth.equals(0) || somePlayer.totalHealth < 0) {
        System.out.println("Your player died");
    } else {
        System.out.println("The monster attacked " + somePlayer.getName() + " and made " + this.damage + " damage");
        System.out.println("Your remaining health is - " + (somePlayer.totalHealth - somePlayer.getStrength()));
    }

}

【讨论】:

  • 是的,但我不能用“somePlayer”来做,因为这是我在方法中传递的东西。
  • @TornikeShelia 你的 Player 类有一个健康属性?你能和我们分享你的 Player 类吗?
  • @TornikeShelia 正如我所见,您的播放器中只有一个健康属性,因此您无需再次计算 totalHealth,因为它已在您的播放器类中声明。检查我的编辑。
  • 我检查过了,但不知何故,它没有计算出正确的生命值,我将“怪物”的伤害设置为 6,将“玩家”的生命值设置为 100,但每次我运行攻击方法“播放器”死了,我会试着找出问题
  • 我想通了,问题是我没有将 totalHealth 传递给构造函数,非常感谢,它现在可以工作,我想出了如何让它在未来工作。 :)
【解决方案2】:

Player 上创建一个函数updateHealth(int newHealth),将getHitPoints() 返回的变量设置为newHealth。然后只需在attack 函数的末尾附加somePlayer.updateHealth(somePlayer.getHitPoints() - damage);

【讨论】:

    【解决方案3】:

    你应该有一个健康的表示,在 Player totalHealth 中定义。

    您可以使用计算总生命值的方法(因为您的玩家可以获得增加力量的物品或可以治愈您的物品)。

    那么你应该在 Player 中使用另一个变量,remainingHealth 并将其初始化为remainingHealth = totalHealth

        public class Player {
    
        float totalHealth;
        float remainingHealth;
        ...
    
        public Player(...) {
            this.remainingHealth = this.totalHealth;
            ...
        }
        ...
    
    }
    

    当你想降低玩家的生命值时,你应该使用剩余生命值。

        public void attack(Player somePlayer) {
    
        somePlayer.remainingHealth -= this.damage;
        if (somePlayer.remainingHealth <= 0) {
            System.out.println("Your player died");
        } else {
            System.out.println("The monster attacked ...");
            System.out.println("Your remaining health is - " + somePlayer.remainingHealth);
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 2018-02-16
      • 2011-12-16
      • 1970-01-01
      • 2010-12-13
      相关资源
      最近更新 更多