Как я могу увеличить переменную без превышения максимального значения?
Я работаю над простой программой видеоигр для школы, и я создал метод, в котором игрок получает 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 ответов:
Я бы просто сделать это. Это в основном занимает минимум между 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 в любом случае. Делая это таким образом, Вы сможете повредить и исцелить любые суммы с тем же кодом.
Я бы сделал статический метод в хелпер-класс. Таким образом, вместо того, чтобы повторять код для каждого значения, которое должно соответствовать некоторым границам, вы можете иметь один универсальный метод. Он будет принимать два значения, определяющие 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, создав переменную, которая не является локальной для функции. Поскольку я не знаю, какой язык вы используете, я не буду показывать пример, потому что он, возможно, неправильный синтаксис.
Если вы хотите быть дерзким и соответствовать вашему коду на одной строке, вы можете использовать тернарный оператор:
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)); }