Как я могу увеличить переменную без превышения максимального значения?


Я работаю над простой программой видеоигр для школы, и я создал метод, в котором игрок получает 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.

Это называется насыщенность арифметические.

14 87

14 ответов:

Я бы просто сделать это. Это в основном занимает минимум между 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;
}

однако, как отметил Блэнд, иногда с многопоточностью (несколькими блоками кода, выполняющимися одновременно), имеющими здоровье, превышающее 100 при любой точка может вызвать проблемы, и изменение свойства здоровья несколько раз также может быть плохим. В этом случае вы можете сделать это, как упоминалось в других ответах.

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

вам не нужен отдельный случай для каждого int выше 85. Просто есть один else, Так что если здоровье уже 86 или выше, а затем просто установите его непосредственно в 100.

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

Я думаю, что идиоматический, объектно-ориентированный способ сделать это-иметь 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() способ представляет собой осуществление для читателя :)

Я просто собираюсь предложить более многоразовый фрагмент кода, его не самый маленький, но вы можете использовать его с любым количеством, поэтому его все еще стоит сказать

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

EDIT

дополнительную информацию

вы могли бы сделать то же самое, когда игрок получает повреждения, но не нужно minHealth, потому что это было бы 0 в любом случае. Делая это таким образом, Вы сможете повредить и исцелить любые суммы с тем же кодом.

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

Я бы сделал статический метод в хелпер-класс. Таким образом, вместо того, чтобы повторять код для каждого значения, которое должно соответствовать некоторым границам, вы можете иметь один универсальный метод. Он будет принимать два значения, определяющие min и max, и третье значение, которое должно быть зажато в этом диапазоне.

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;

затем вызовите функцию, проходящую в вашем min, max и отрегулированную здоровье.

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

Я знаю, что это школьный проект, но если вы хотите расширить свою игру позже и сможете обновить свою целительную силу, напишите функцию следующим образом:

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

и вызова функции:

getHealed(15);
getHealed(25);

...так далее...

кроме того, вы можете создать свой max 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 или меньше, здоровье станет 100.

  • в противном случае, если разрыв больше 15, он добавит 15 к здоровью.

Так например: если здоровье 83, он станет 98, но не 100.

Если бы я хотел быть потокобезопасными, я бы сделал это таким образом, а не с помощью блока 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));
}

самый простой способ с помощью оператора модуля.

здоровье = (здоровье + 50) % 100;

здоровье никогда не будет равно или превышать 100.

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