如何增加一个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。