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

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

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

Ответ 1

Я бы просто сделал это. Он в основном принимает минимум между 100 (максимальное здоровье) и то, что здоровье будет с 15 дополнительными очками. Это гарантирует, что здоровье пользователя не превышает 100.

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

Чтобы гарантировать, что hitpoints не опустится ниже нуля, вы можете использовать аналогичную функцию: Math.max.

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

Ответ 2

просто добавьте 15 к здоровью, поэтому:

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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 в любом случае. Сделав это таким образом, вы сможете повредить и исцелить любые суммы одним и тем же кодом.

Ответ 6

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

Ответ 7

Я бы сделал статический метод в классе-помощнике. Таким образом, вместо того, чтобы повторять код для каждого значения, которое должно соответствовать некоторым границам, у вас может быть один универсальный метод. Он будет принимать два значения, определяющие 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 );

Ответ 8

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

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

и вызовите функцию:

getHealed(15);
getHealed(25);

... и т.д...

Кроме того, вы можете создать свой максимум HP, создав переменную, которая не является локальной функцией. Поскольку я не знаю, какой язык вы используете, я не буду показывать пример, потому что он может иметь неправильный синтаксис.

Ответ 9

Может быть, это?

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

Ответ 10

Если вы хотите быть нахальным и подгонять свой код в одной строке, вы можете использовать термальный оператор :

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

Обратите внимание, что некоторые люди будут недовольны этим синтаксисом из-за (возможно) плохой читаемости!

Ответ 11

Я считаю, что это будет

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

Пояснение:

  • Если разрыв в исцелении составляет 15 или менее, здоровье станет 100.

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

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

Ответ 12

Если бы я хотел быть потокобезопасным, я бы сделал это так, а не используя синхронизированный блок.

Атомный compareAndSet обеспечивает тот же результат, что и синхронизированный без накладных расходов.

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

Ответ 13

Самый простой способ использования оператора модуля.

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

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

Ответ 14

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