Ich arbeite an einem einfachen Videospielprogramm für die Schule und habe eine Methode erstellt, bei der der Spieler 15 Gesundheitspunkte erhält, wenn diese Methode aufgerufen wird. Ich muss die Gesundheit auf maximal 100 halten und mit meinen begrenzten Programmierfähigkeiten mache ich zu diesem Zeitpunkt 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 nicht perfekt ist, aber meine Frage ist, was ein besserer Weg ist, weil ich auch mit den Schadenspunkten etwas Ähnliches machen muss und nicht unter 0 gehe.
Dies nennt man Sättigungsarithmetik .
java
if-statement
switch-statement
saturation-arithmetic
Steven Eck
quelle
quelle
Antworten:
Ich würde das einfach machen. Grundsätzlich beträgt das Minimum zwischen 100 (die maximale Gesundheit) und der Gesundheit mit 15 zusätzlichen Punkten. Es stellt sicher, dass der Gesundheitszustand des Benutzers 100 nicht überschreitet.
Um sicherzustellen, dass die Trefferpunkte nicht unter Null fallen, können Sie eine ähnliche Funktion verwenden :
Math.max
.quelle
Fügen Sie einfach 15 zur Gesundheit hinzu, also:
Wie langweilig jedoch festgestellt hat, kann es bei Problemen mit Multithreading (mehrere gleichzeitig ausgeführte Codeblöcke) manchmal zu Problemen kommen, wenn der Zustand zu jedem Zeitpunkt über 100 liegt , und es kann auch schlecht sein, die Gesundheitseigenschaft mehrmals zu ändern. In diesem Fall können Sie dies tun, wie in anderen Antworten erwähnt.
quelle
health
oder sicherzustellen, dasshealth
nur von einem Thread aus zugegriffen wird. Die Einschränkung "Sollte niemals zulassen, dass die Gesundheit über 100 steigt" ist nicht realistisch.Sie benötigen für jeden
int
oben genannten Fall keinen eigenen Fall85
. Haben Sie nur eineelse
, damit, wenn die Gesundheit bereits86
oder höher ist, stellen Sie sie einfach direkt auf100
.quelle
100 - 15
(oder100 -HEALED_HEALTH
) zu ändern ?Ich denke , eine idiomatisch, objektorientierte Art und Weise , dies zu tun ein haben , ist
setHealth
auf derCharacter
Klasse. Die Implementierung dieser Methode sieht folgendermaßen aus:Dies verhindert, dass die Gesundheit unter 0 oder höher als 100 fällt, unabhängig davon, auf was Sie sie eingestellt haben.
Ihre
getHealed()
Implementierung kann einfach so sein:Ob es Sinn macht,
Character
einegetHealed()
Methode zu haben , ist eine Übung, die dem Leser überlassen bleibt :)quelle
heal(int hp)
unddamage(int hp)
), die jeweils IhresetHealth(int newValue)
Methode aufrufen .if
. Dies soll verhindern, dass Sie sich in den Fuß schießen können. Wenn es zu ausführlich ist, verwenden Sie einfach statische Importe. Dann sieht es so aus:health = max(0, min(100, newValue))
Wenn das für Sie immer noch nicht lesbar ist, extrahieren Sie es in eine Methode mit dem Namen,clamp
damit die Zeile so aussieht:health = clamp(0, 100, newValue)
Ich werde nur ein wiederverwendbareres Stück Code anbieten, es ist nicht das kleinste, aber Sie können es mit jeder Menge verwenden, so dass es immer noch wert ist, gesagt zu werden
Sie können die 100 auch in eine maxHealth-Variable ändern, wenn Sie dem von Ihnen erstellten Spiel Statistiken hinzufügen möchten. Die gesamte Methode könnte also ungefähr so aussehen
BEARBEITEN
Für zusätzliche Informationen
Sie könnten das Gleiche tun, wenn der Spieler beschädigt wird, aber Sie würden keine minHealth benötigen, da dies sowieso 0 wäre. Wenn Sie dies auf diese Weise tun, können Sie alle Beträge mit demselben Code beschädigen und heilen.
quelle
minHealth
könnte negativ sein, sagen wir zum Beispiel in D & D ... :)quelle
Ich würde eine statische Methode in einer Hilfsklasse machen. Auf diese Weise können Sie eine Allzweckmethode verwenden, anstatt Code für jeden Wert zu wiederholen, der in bestimmte Grenzen passen muss. Es würde zwei Werte akzeptieren, die min und max definieren, und einen dritten Wert, der innerhalb dieses Bereichs geklemmt werden soll.
Für Ihren Fall würden Sie irgendwo Ihre minimale und maximale Gesundheit angeben.
Rufen Sie dann die Funktion auf, die Ihre minimale, maximale und angepasste Gesundheit übergibt.
quelle
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:
und rufen Sie die Funktion auf:
...etc...
Darüber hinaus können Sie Ihre maximale HP erstellen, indem Sie eine Variable erstellen, die nicht lokal für die Funktion ist. Da ich nicht weiß, welche Sprache Sie verwenden, werde ich kein Beispiel zeigen, da es möglicherweise die falsche Syntax hat.
quelle
Vielleicht das?
quelle
Wenn Sie frech sein und Ihren Code in eine Zeile einfügen möchten, können Sie einen ternären Operator verwenden :
Beachten Sie, dass einige Leute diese Syntax wegen (wohl) schlechter Lesbarkeit missbilligen werden!
quelle
health = (health <= 85)?(health+15):100
besser lesbar (wenn Sie wirklich einen ternären Operator verwenden möchten)Ich glaube, das wird reichen
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 die Gesundheit 83 ist, wird sie 98, aber nicht 100.
quelle
&& health < 100
Bedingung ist nicht erforderlich. Wenn es 100 ist, wird es auf 100 gesetzt, keine Änderung. Der einzige Grund, warum Sie das brauchen würden, wäre, wenn es möglich wäre, irgendwie> 100 zu bekommen, und wir wollen nicht, dass die Heilung Sie wieder auf 100 reduziert.Wenn ich threadsicher sein wollte, würde ich dies auf diese Weise tun, anstatt einen synchronisierten Block zu verwenden.
Das atomare compareAndSet erzielt das gleiche Ergebnis wie das ohne Overhead synchronisierte.
quelle
Einfachste Methode mit dem Moduloperator.
Gesundheit = (Gesundheit + 50)% 100;
Gesundheit wird niemals 100 erreichen oder überschreiten.
quelle
health
100 ist, würden Sie mit 50 Gesundheit enden.quelle