如何在不超过最大值的情况下增加变量?

时间:2013-09-05 22:53:10

标签: java if-statement switch-statement

我正在为学校制作一个简单的视频游戏程序,我已经创建了一种方法,如果调用该方法,玩家将获得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。

这称为saturation arithmetic

14 个答案:

答案 0 :(得分:222)

我会这样做。它基本上需要在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);
    }
}

答案 1 :(得分:71)

只需为健康添加15,所以:

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

然而,正如bland所指出的那样,有时多线程(多个代码块同时执行),任何点的健康状况超过100会导致问题,并且多次更改健康属性时代也可能不好。在这种情况下,你可以这样做,如其他答案所述。

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

答案 2 :(得分:45)

int以上的每个85都不需要单独的案例。只需要一个else,这样如果健康状况已经86或更高,那么只需将其直接设置为100

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

答案 3 :(得分:37)

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

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

这可以防止健康状况低于0或高于100,无论您将其设置为什么。


您的getHealed()实施可以是这样的:

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

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

答案 4 :(得分:14)

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

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

如果你想为自己制作的游戏添加统计数据,你也可以将100改为maxHealth变量,所以整个方法可能是这样的

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

修改

了解更多信息

你可以在播放器受损时做同样的事情,但你不需要minHealth,因为无论如何都是0。这样做就可以使用相同的代码破坏和治愈任何金额。

答案 5 :(得分:10)

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

答案 6 :(得分:4)

我会在helper类中创建一个静态方法。这样,您可以拥有一个通用方法,而不是为每个需要适合某些边界的值重复代码。它将接受定义最小值和最大值的两个值,以及要在该范围内钳制的第三个值。

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 );

答案 7 :(得分:3)

我知道这是一个学校项目,但是如果你想在以后扩展你的游戏并且能够升级你的治疗能力,那就写下这样的功能:

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

并调出功能:

getHealed(15);
getHealed(25);

...等...

此外,您可以通过创建非函数本地的变量来创建最大HP。由于我不知道您正在使用哪种语言,因此我不会展示一个示例,因为它可能有错误的语法。

答案 8 :(得分:2)

也许这个?

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

答案 9 :(得分:2)

如果你想要厚颜无耻并且在一行上使用你的代码,你可以使用ternary operator

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

请注意,由于(可以说)可读性差,有些人会对此语法不满意!

答案 10 :(得分:1)

我相信这样做

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

说明:

  • 如果治疗差距为15或更小,健康状况将变为100。

  • 否则如果差距大于15,则会增加15点健康状况。

例如:如果健康状况是83,那么它将变为98而不是100。

答案 11 :(得分:1)

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

原子compareAndSet在没有开销的情况下实现了与synchronized相同的结果。

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));
}

答案 12 :(得分:1)

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

health =(health + 50)%100;

健康永远不会超过100。

答案 13 :(得分:0)

   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;
    }