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