Sieh dir noch einmal den Code mit dem Zaubertrank aus der letzten Übung an. Dabei soll ein Code für Heilung ausgeführt werden, wenn der Spieler einen heilenden Trank trinkt, und ein Code für Schaden, wenn er einen schädlichen Trank trinkt.
Zuerst schreibst du etwas Code ...
-
Das klingt so, als müsstest du eine Frage zum Tranktyp beantworten. Du kannst eine neue Variable erstellen, um genau das nachzuverfolgen: einen String namens
PotionType.var PotionType: string = "Heilung" -
Jetzt kannst du fragen, ob die Variable
PotionTypegleich einem anderen String ist. Wenn du fragst, obPotionType"gleich Heilung“` ist, lautet die Antwort Ja. Dann würde der Code für Heilung ausgeführt.if (PotionType = "Heilung"): set PlayerHealth = PlayerHealth + PotionHealAmount -
Schreibe nun einen ähnlichen if-Ausdruck zum Code für Schaden.
if (PotionType = "Schaden"): set PlayerHealth = PlayerHealth - PotionDamageAmountAber Moment mal! Beim Code für Heilung gibt es ein Problem.
Bisher hält nichts den Spieler davon ab, seine Gesundheit weiter mit Tränken zu steigern. Es wäre sinnvoll, das zu begrenzen – was du nun mit
iftun kannst! -
Deklariere zunächst eine neue Konstante des Typs
float. Nenne sieMaxHealthund setze sie auf100.0.MaxHealth: float = 100.0Wenn der Wert von
PlayerHealthden Wert vonMaxHealthübersteigen würde, wenn der Spieler den heilenden Trank trinkt, musst duPlayerHealthaufMaxHealthsetzen.# Auszuführender Code, wenn der Spieler den heilenden Trank trinkt # Wenn die Gesundheit des Spielers durch seine Heilung MaxHealth nicht übersteigen würde, # soll er den vollen Heilungseffekt erhalten if (PotionType = "Heilung" and (PlayerHealth + PotionHealAmount) < MaxHealth): set PlayerHealth = PlayerHealth + PotionHealAmount else: set PlayerHealth = MaxHealthBeachte, dass der oben stehende Code ein
andenthält, um zu fragen, obPotionTypegleich“Heilung”ist und obPlayerHealth + PotionAmountkleiner alsMaxHealthist. Beide Bedingungen müssen erfüllt sein, damit PlayerHealth um PotionHealAmount gesteigert wird.Für eine Person, die diesen Code liest, ist möglicherweise nicht ersichtlich, dass er verhindern soll, dass PlayerHealth MaxHealth übersteigt. Da kommen die Codekommentare ins Spiel. Beachte die drei Zeilen mit Kommentaren über dem eigentlichen Code.
-
Der Code für Schaden funktioniert, lässt sich aber durch Verwendung von
if…else if…elseverbessern. Wenn ein Spieler einen schädlichen Trank trinkt, durch den PlayerHealth gleich oder kleiner als 0.0 würde, sollten wir PlayerHealth stattdessen auf 1.0 setzen. Wenn PlayerHealth bereits1.0ist, dann setzen wir sie auf0.0. So lernt der Spieler, dass der Trank schädlich ist, ohne ihn zu sehr zu bestrafen.# Auszuführender Code, wenn der Spieler den schädlichen Trank trinkt # Spieler nicht eliminieren, wenn seine Gesundheit über MinHealth, aber unter PotionDamageAmount liegt # Spieler eliminieren, wenn er MinHealth erreicht oder schon unterschritten hat if (PotionType = "Schaden" and PlayerHealth > PotionDamageAmount): set PlayerHealth = PlayerHealth - PotionDamageAmount else if (PlayerHealth > MinHealth): # Wenn die Gesundheit des Spielers niedrig ist, soll er eine weitere Chance erhalten. set PlayerHealth = 1.0 else: set PlayerHealth = 0.0
… dann findest du den Fehler
Nachstehend siehst du den gesamten Code aus dieser Übung plus einiger Print()-Funktionsaufrufe zu Testzwecken. Versuche, diesen Code auszuführen. Die Print()-Aufrufe kannst du ganz nach Belieben ändern. Da die Variable PotionType mit „Heilung“ initialisiert ist, kannst du davon ausgehen, dass nur der Code für Heilung ausgeführt wird.
Aber Moment mal, da hat sich ein Bug eingeschlichen!
Führe den unten stehenden Code aus und versuche, ihn zu finden.
MaxHealth: float = 100.0
MinHealth: float = 1.0
var PotionType: string = "Heilung"
# Auszuführender Code, wenn der Spieler den heilenden Trank trinkt
# Wenn die Gesundheit des Spielers durch seine Heilung MaxHealth nicht übersteigen würde,
# soll er den vollen Heilungseffekt erhalten
if (PotionType = "Heilung" and (PlayerHealth + PotionHealAmount) < MaxHealth):
set PlayerHealth = PlayerHealth + PotionHealAmount
Print ("Voller Heilungseffekt")
else:
# Sonst PlayerHealth auf MaxHealth setzen
set PlayerHealth = MaxHealth
Print("PlayerHealth ist für den vollen Heilungseffekt zu hoch")
# Auszuführender Code, wenn der Spieler den schädlichen Trank trinkt
# Spieler nicht eliminieren, wenn seine Gesundheit über MinHealth, aber unter PotionDamageAmount liegt
# Spieler eliminieren, wenn er MinHealth erreicht oder schon unterschritten hat
if (PotionType = "Schaden" and PlayerHealth > PotionDamageAmount):
set PlayerHealth = PlayerHealth - PotionDamageAmount
Print("Voller Schadenseffekt")
else if (PlayerHealth > MinHealth):
# Wenn die Gesundheit des Spielers niedrig ist, soll er eine weitere Chance erhalten.
set PlayerHealth = 1.0
Print("PlayerHealth wurde auf 1.0 gesetzt")
else:
# Spieler eliminieren
set PlayerHealth = 0.0
Print("Der Spieler wurde eliminiert!")
Wenn PotionType auf „Heilung“ gesetzt ist, sollte nur der Code für Heilung ausgeführt werden. Die Ausdrücke if … else if … if im Code für Schaden werden dennoch ausgeführt. Das bedeutet, dass PlayerHealth auf 1.0 gesetzt wird, wenn PlayerHealth größer als MinHealth ist. Das willst du nicht. Aber du kannst es durch die Verschachtelung der anderen Prüfungen innerhalb von if-Ausdrücken beheben, die nur PotionType prüfen.
# Auszuführender Code, wenn der Spieler den heilenden Trank trinkt
# Wenn die Gesundheit des Spielers durch seine Heilung MaxHealth nicht übersteigen würde,
# soll er den vollen Heilungseffekt erhalten
if (PotionType = "Heilung"):
if ((PlayerHealth + PotionHealAmount) < MaxHealth):
set PlayerHealth = PlayerHealth + PotionHealAmount
Print ("Voller Heilungseffekt")
else:
# PlayerHealth auf MaxHealth setzen
set PlayerHealth = MaxHealth
Print("PlayerHealth ist für den vollen Heilungseffekt zu hoch")
# Auszuführender Code, wenn der Spieler den schädlichen Trank trinkt
# Spieler nicht eliminieren, wenn seine Gesundheit über MinHealth, aber unter PotionDamageAmount liegt
# Spieler eliminieren, wenn er MinHealth erreicht oder schon unterschritten hat
if (PotionType = "Schaden"):
if ((PlayerHealth > PotionDamageAmount)):
set PlayerHealth = PlayerHealth - PotionDamageAmount
Print("Voller Schadenseffekt")
else if (PlayerHealth > MinHealth):
# Wenn die Gesundheit des Spielers niedrig ist, soll er eine weitere Chance erhalten.
set PlayerHealth = 1.0
Print("PlayerHealth wurde auf 1.0 gesetzt")
else:
# Spieler eliminieren
set PlayerHealth = 0.0
Print("Der Spieler wurde eliminiert!")
Jetzt wird nur der Codeblock ausgeführt, der unter einer der if-Ausdrücke, die PotionType prüfen, eingerückt ist. Teste diesen Code auch aus, wenn PotionType auf „Schaden“ gesetzt ist.
Puh! Das waren ganz schön viele Codeänderungen, aber du hast es geschafft!
Leg eine kleine Pause ein, trink einen Zaubert… ähm, einen Tee, und komm zurück, wenn du bereit bist für die nächste Lektion.
Vollständiges Script
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
hello_world_device := class(creative_device):
# Wird ausgeführt, wenn das Gerät in einem laufenden Spiel gestartet wird
OnBegin<override>()<suspends> : void =
MaxHealth : float = 100.0
MinHealth : float = 1.0
var PotionType: string = "Heilung"
set PlayerHealth = 80.0
# Auszuführender Code, wenn der Spieler den heilenden Trank trinkt
# Wenn die Gesundheit des Spielers durch seine Heilung MaxHealth nicht übersteigen würde,
# soll er den vollen Heilungseffekt erhalten
if (PotionType = "Heilung"):
if ((PlayerHealth + PotionHealAmount) < MaxHealth):
set PlayerHealth = PlayerHealth + PotionHealAmount
Print ("Voller Heilungseffekt")
else:
# Sonst PlayerHealth auf MaxHealth setzen
set PlayerHealth = MaxHealth
Print("PlayerHealth ist für den vollen Heilungseffekt zu hoch")
# Auszuführender Code, wenn der Spieler den schädlichen Trank trinkt
# Spieler nicht eliminieren, wenn seine Gesundheit über MinHealth, aber unter PotionDamageAmount liegt
# Spieler eliminieren, wenn er MinHealth erreicht oder schon unterschritten hat
if (PotionType = "Schaden"):
if ((PlayerHealth > PotionDamageAmount)):
set PlayerHealth = PlayerHealth - PotionDamageAmount
Print("Voller Schadenseffekt")
else if (PlayerHealth > MinHealth):
# Wenn die Gesundheit des Spielers niedrig ist, soll er eine weitere Chance erhalten.
set PlayerHealth = 1.0
Print("PlayerHealth wurde auf 1.0 gesetzt")
else:
set PlayerHealth = 0.0
Print("Der Spieler wurde eliminiert!")
Print("PlayerHealth beträgt nun {PlayerHealth}")