如何增加一个variables而不超过最大值?

我正在为学校制作一个简单的video游戏程序,并且我已经创build了一个方法,如果该方法被调用,玩家可以获得15点生命值。 我必须把健康保持在100以下,而且我的编程能力有限,所以我正在做这样的事情。

public void getHealed(){ if(health <= 85) health += 15; else if(health == 86) health += 14; else if(health == 87) health += 13; }// this would continue so that I would never go over 100 

我理解我的语法并不完美,但是我的问题是,有什么可能是更好的方式来做到这一点,因为我也必须用损坏点做类似的事情,不要低于0。

这被称为饱和algorithm 。

我只是这样做。 它基本上取最小值100(最大健康)和健康与15加分之间的最小值。 它确保用户的健康不超过100。

 public void getHealed() { health = Math.min(health + 15, 100); } 

为了确保生命值不会降到零以下,可以使用类似的函数: Math.max

 public void takeDamage(int damage) { if(damage > 0) { health = Math.max(health - damage, 0); } } 

只要加上15就可以了,所以:

 health += 15; if(health > 100){ health = 100; } 

然而,平淡无奇地指出,有时multithreading(一次执行多个代码块)在任何时候具有超过100的健康状况都会导致问题,并且多次改变健康属性也可能是不好的。 在这种情况下,你可以做到这一点,如其他答案所述。

 if(health + 15 > 100) { health = 100; } else { health += 15; } 

85以上的每个int都不需要单独的情况。 只要有一个else ,所以如果健康已经86或更高,那么直接把它设置为100

 if(health <= 85) health += 15; else health = 100; 

我认为这样做的一种惯用的,面向对象的方式是在Character类上有一个setHealth 。 该方法的实现将如下所示:

 public void setHealth(int newValue) { health = Math.max(0, Math.min(100, newValue)) } 

这可以防止健康低于0或高于100,无论您设置的是什么。


你的getHealed()实现可以是这样的:

 public void getHealed() { setHealth(getHealth() + 15); } 

Character是否有意义 – 一个getHealed()方法是留给读者的一个练习:)

我只是要提供一个更可重用的代码片,它不是最小的,但你可以使用它的任何数量,所以它仍然值得一说

 health += amountToHeal; if (health >= 100) { health = 100; } 

你也可以把100改成一个maxHealthvariables,如果你想给你的游戏添加统计数据,那么整个方法可能是这样的

 private int maxHealth = 100; public void heal(int amountToHeal) { health += amountToHeal; if (health >= maxHealth) { health = maxHealth; } } 

编辑

了解更多信息

当玩家受到伤害时,你也可以做同样的事情,但是你不需要minHealth,因为反正它是0。 这样做,你将能够使用相同的代码来破坏和治愈任何金额。

 health = health < 85 ? health + 15 : 100; 

我会在辅助类中做一个静态方法。 通过这种方式,不必为每个需要适合某个边界的值重复代码,您可以使用一种通用的方法。 它将接受定义最小值和最大值的两个值,以及在该范围内被钳位的第三个值。

 class HelperClass { // Some other methods public static int clamp( int min, int max, int value ) { if( value > max ) return max; else if( value < min ) return min; else return value; } } 

对于你的情况,你会宣布你的最低和最高健康的地方。

 final int HealthMin = 0; final int HealthMax = 100; 

然后调用传递你的最小,最大和调整健康的函数。

 health = HelperClass.clamp( HealthMin, HealthMax, health + 15 ); 

我知道这是一个学校项目,但是如果你想稍后扩大你的游戏并且能够升级你的治疗能力,写这样的function:

 public void getHealed(healthPWR) { health = Math.min(health + healthPWR, 100); } 

并调用该函数:

 getHealed(15); getHealed(25); 

…等等…

此外,您可以通过创build一个不属于本地函数的variables来创build最大HP。 由于我不知道你在用什么语言,所以我不会举例说明,因为它可能有错误的语法。

也许这个?

 public void getHealed() { if (health <= 85) { health += 15; } else { health = 100; } } 

如果你想变得厚颜无耻,把你的代码放在一行上,你可以使用一个三元运算符 :

 health += (health <= 85) ? 15 : (100 - health); 

请注意,由于(可以说)可读性差,有些人会对此语法感到沮丧!

我相信这样做

 if (health >= 85) health = 100; else health += 15; 

说明:

  • 如果治愈的差距是15或更less,健康将会变成100。

  • 否则,如果差距大于15,则会增加15。

例如:如果健康是83,那么它会变成98而不是100。

如果我想要线程安全,我会这样做,而不是使用同步块。

primefacescompareAndSet达到与没有开销同步的结果相同。

 AtomicInteger health = new AtomicInteger(); public void addHealth(int value) { int original = 0; int newValue = 0; do { original = health.get(); newValue = Math.min(100, original + value); } while (!health.compareAndSet(original, newValue)); } 
  private int health; public void Heal() { if (health > 85) health = 100; else health += 15; } public void Damage() { if (health < 15) health = 0; else health -= 15; } 

最简单的方法使用模运算符。

健康=(健康+ 50)%100;

健康永远不会等于或超过100。