wake-up-neo.com

Wie kann ich eine Variable erhöhen, ohne einen Maximalwert zu überschreiten?

Ich arbeite an einem einfachen Videospielprogramm für die Schule und habe eine Methode entwickelt, bei der der Spieler 15 Lebenspunkte erhält, wenn diese Methode aufgerufen wird. Ich muss den Gesundheitszustand auf maximal 100 halten und mit meiner eingeschränkten Programmierfähigkeit mache ich jetzt so etwas.

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

Ich verstehe, dass meine Syntax ungefähr nicht perfekt ist, aber meine Frage ist, was eine bessere Möglichkeit ist, dies zu tun, da ich auch mit den Schadenspunkten etwas Ähnliches tun muss und nicht unter 0 gehen darf.

Dies nennt man Sättigungsarithmetik .

89
Steven Eck

Ich würde das einfach machen. Grundsätzlich wird das Minimum zwischen 100 (der maximalen Gesundheit) und der Gesundheit mit 15 zusätzlichen Punkten angenommen. Es stellt sicher, dass die Gesundheit des Benutzers 100 nicht überschreitet.

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

Um sicherzustellen, dass die Trefferpunkte nicht unter Null fallen, können Sie eine ähnliche Funktion verwenden: Math.max.

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

füge der Gesundheit einfach 15 hinzu, also:

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

Wie langweilig bemerkt wurde, kann es jedoch manchmal bei Multithreading (mehrere Codeblöcke, die gleichzeitig ausgeführt werden) zu Problemen kommen, wenn die Integrität an einem beliebigen Punkt über 100 steigt, und die Integritätseigenschaft kann auch mehrmals geändert werden sei böse. In diesem Fall können Sie dies tun, wie in anderen Antworten erwähnt.

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

Sie benötigen keinen separaten Fall für jeden int über 85. Habe nur einen else, damit, wenn die Gesundheit schon da ist 86 oder höher, dann setzen Sie es direkt auf 100.

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

Ich denke, eine idiomatische, objektorientierte Art, dies zu tun, besteht darin, eine setHealth in der Character -Klasse zu haben. Die Implementierung dieser Methode sieht folgendermaßen aus:

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

Dies verhindert, dass der Zustand unter 0 oder über 100 sinkt, unabhängig davon, auf was Sie ihn eingestellt haben.


Ihre getHealed() -Implementierung kann Folgendes sein:

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

Ob es für die Character Sinn macht, eine getHealed() -Methode zu haben, bleibt dem Leser überlassen :)

37
Daniel Kaplan

Ich werde nur eine wiederverwendbarere Codeschnitte anbieten, die nicht die kleinste ist, aber Sie können sie mit jeder beliebigen Menge verwenden, sodass sie immer noch die Rede wert ist

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

Sie können die 100 auch in eine maxHealth-Variable ändern, wenn Sie dem erstellten Spiel Statistiken hinzufügen möchten, sodass die gesamte Methode in etwa so aussehen kann

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

BEARBEITEN

Für zusätzliche Informationen

Sie könnten dasselbe tun, wenn der Player beschädigt wird, aber Sie würden keine minHealth benötigen, da dies sowieso 0 wäre. Auf diese Weise könnten Sie mit demselben Code alle Mengen beschädigen und heilen.

14
5tar-Kaster
health = health < 85 ? health + 15 : 100;
10
Aroo

Ich würde eine statische Methode in einer Helferklasse erstellen. Auf diese Weise können Sie eine Allzweckmethode verwenden, anstatt den Code für jeden Wert zu wiederholen, der innerhalb einiger Grenzen liegen muss. Es würden zwei Werte akzeptiert, die das Minimum und das Maximum definieren, und ein dritter Wert, der innerhalb dieses Bereichs festgehalten werden soll.

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

Für Ihren Fall würden Sie irgendwo Ihre minimale und maximale Gesundheit angeben.

final int HealthMin = 0;
final int HealthMax = 100;

Rufen Sie dann die Funktion auf, die Ihre minimale, maximale und angepasste Gesundheit übergibt.

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

Ich weiß, dass dies ein Schulprojekt ist, aber wenn Sie Ihr Spiel später erweitern und Ihre Heilkraft verbessern möchten, schreiben Sie die Funktion wie folgt:

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

und rufen Sie die Funktion auf:

getHealed(15);
getHealed(25);

...etc...

Darüber hinaus können Sie Ihre maximale HP erstellen, indem Sie eine Variable erstellen, die für die Funktion nicht lokal ist. Da ich nicht weiß, welche Sprache Sie verwenden, werde ich kein Beispiel zeigen, da es möglicherweise die falsche Syntax hat.

3

Vielleicht das?

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

Wenn Sie frech sein und Ihren Code in eine Zeile einpassen möchten, können Sie einen ternären Operator verwenden:

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

Beachten Sie, dass einige Leute diese Syntax wegen (vermutlich) schlechter Lesbarkeit verachten!

2
Oleksiy

Einfachster Weg mit dem Modul Operator.

gesundheit = (Gesundheit + 50)% 100;

gesundheit wird niemals 100 betragen oder überschreiten.

1
bond

Ich glaube das wird reichen

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

Erläuterung:

  • Wenn die Heilungslücke 15 oder weniger beträgt, wird die Gesundheit 100.

  • Andernfalls erhöht sich die Gesundheit um 15, wenn die Lücke größer als 15 ist.

Zum Beispiel: Wenn der Gesundheitszustand 83 ist, wird er zu 98, aber nicht zu 100.

1
MarmiK

Wenn ich threadsicher sein wollte, würde ich es auf diese Weise tun, anstatt einen synchronisierten Block zu verwenden.

Das atomare compareAndSet erzielt das gleiche Ergebnis wie das ohne Overhead synchronisierte.

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));
}
1
Robert Sutton
   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;
    }
0
kiss my armpit