Wróć do kodu swojej magicznej mikstury z poprzedniego ćwiczenia. Chcesz, aby kod leczenia uruchamiał się, gdy gracz wypije miksturę leczniczą, a wypicie mikstury zadającej obrażenia powinno uruchamiać kod obrażeń.
Najpierw piszesz kod...
-
Wygląda na to, że musisz podać typ eliksiru, więc możesz utworzyć nową zmienną, która będzie za to odpowiedzialna: ciąg tekstowy o nazwie
PotionType.var PotionType: string = "leczenie" -
Teraz możesz się zastanowić, czy zmienna
PotionTypejest równa innemu ciągowi tekstowemu. Jeśli zapytasz, czy zmiennaPotionTypejest równa"leczenie", odpowiedź będzie twierdząca. Wówczas uruchomiony zostanie kod leczenia.if (PotionType = "heal"): set PlayerHealth = PlayerHealth + PotionHealAmount -
Teraz napisz podobne wyrażenie if dla kodu zadawania obrażeń.
if (PotionType = "obrażenia"): set PlayerHealth = PlayerHealth - PotionDamageAmountAle momencik! Jest problem z kodem leczenia!
Nic nie stoi na przeszkodzie, by gracz kontynuował zwiększanie poziomu zdrowia za pomocą mikstur. Warto to ograniczyć – możesz to teraz zrobić za pomocą wyrażenia
if. -
Najpierw zadeklaruj nową stałą typu
float. Nazwij jąMaxHealthi ustaw na100.0.MaxHealth: float = 100.0Jeśli wartość
PlayerHealthmiałaby przekroczyć wartośćMaxHealth, gdy gracz wypije miksturę leczniczą, musisz ustawićPlayerHealthna wartośćMaxHealth.# Kod uruchamiany, gdy gracz wypije miksturę leczniczą # Jeśli po uleczeniu poziom zdrowia gracza nie przekroczyłby wartości MaxHealth, # ulecz go z zastosowaniem pełnej wartości leczenia if (PotionType = "leczenie" and (PlayerHealth + PotionHealAmount) < MaxHealth): set PlayerHealth = PlayerHealth + PotionHealAmount else: set PlayerHealth = MaxHealthZwróć uwagę, że powyższy kod zawiera element
and, który pyta, czy zmiennaPotionTypejest równa"leczenie"i czy wartośćPlayerHealth + PotionAmountjest mniejsza niżMaxHealth. Oba te warunki muszą zostać spełnione, aby wartość PlayerHealth została zwiększona o wartość PotionHealAmount.Dla kogoś, kto czyta ten kod, może nie być jasne, że ma to na celu zapobieganie przekroczeniu poziomu MaxHealth przez PlayerHealth. W takiej sytuacji przydają się komentarze do kodu. Zwróć uwagę na trzy wiersze komentarzy nad właściwym kodem.
-
Kod zadawania obrażeń działa, ale można go ulepszyć za pomocą wyrażenia
if...else if...else. Jeśli gracz wypije miksturę zadającą obrażenia, która sprawiłaby, że wartość PlayerHealth spadłaby do0.0lub niższej wartości, to zamiast tego ustawimy PlayerHealth na1.0. Jeśli PlayerHealth już wynosi1.0, wówczas ustawiamy poziom zdrowia na0.0. Dzięki temu gracz dowiaduje się, że mikstura jest szkodliwa, ale nie stanowi to dla niego zbyt dużej krzywdy.# Kod uruchamiany, gdy gracz wypije miksturę zadającą obrażenia # Nie eliminuj gracza, jeśli jego zdrowie jest powyżej MinHealth, ale poniżej PotionDamageAmount # Jeśli poziom zdrowia gracza jest już równy MinHealth lub niższy, wyeliminuj go if (PotionType = "obrażenia" and PlayerHealth > PotionDamageAmount): set PlayerHealth = PlayerHealth - PotionDamageAmount else if (PlayerHealth > MinHealth): # Daj graczowi jeszcze jedną szansę, jeśli ma niski poziom zdrowia set PlayerHealth = 1.0 else: set PlayerHealth = 0.0
… A potem znajdujesz błędy
Poniżej znajdziesz cały kod z tego ćwiczenia, z kilkoma wywołaniami funkcji Print() dodanymi w celu przetestowania. Spróbuj uruchomić ten kod. Możesz śmiało zmienić wywołania Print() na cokolwiek chcesz. Po zainicjowaniu zmiennej PotionType na "leczenie", możesz oczekiwać, że uruchomiony zostanie tylko kod leczenia.
Ale momencik, wkradł się błąd!
Uruchom poniższy kod i sprawdź, czy uda ci się go znaleźć.
MaxHealth: float = 100.0
MinHealth: float = 1.0
var PotionType: string = "leczenie"
# Kod uruchamiany, gdy gracz wypije miksturę leczniczą
# Jeśli po uleczeniu poziom zdrowia gracza nie przekroczyłby wartości MaxHealth,
# ulecz go z zastosowaniem pełnej wartości leczenia
if (PotionType = "leczenie" and (PlayerHealth + PotionHealAmount) < MaxHealth):
set PlayerHealth = PlayerHealth + PotionHealAmount
Print ("Pełne leczenie")
else:
# else, set PlayerHealth the MaxHealth
set PlayerHealth = MaxHealth
Print("Wartość PlayerHealth jest zbyt wysoka, aby pełne leczenie było możliwe")
# Kod uruchamiany, gdy gracz wypije miksturę zadającą obrażenia
# Nie eliminuj gracza, jeśli jego zdrowie jest powyżej MinHealth, ale poniżej PotionDamageAmount
# Jeśli poziom zdrowia gracza jest już równy MinHealth lub niższy, wyeliminuj go
if (PotionType = "obrażenia" and PlayerHealth > PotionDamageAmount):
set PlayerHealth = PlayerHealth - PotionDamageAmount
Print("Pełne obrażenia")
else if (PlayerHealth > MinHealth):
# Daj graczowi jeszcze jedną szansę, jeśli ma niski poziom zdrowia
set PlayerHealth = 1.0
Print("Wartość PlayerHealth ustawiona na 1.0")
else:
# Wyeliminuj gracza
set PlayerHealth = 0.0
Print("Gracz został wyeliminowany!")
Jeśli zmienna PotionType jest ustawiona na leczenie, powinien zostać uruchomiony tylko kod leczenia. Jednak wyrażenia if ... else if ... if w kodzie zadawania obrażeń są nadal wykonywane. Oznacza to, że jeśli wartość PlayerHealth jest większa niż MinHealth, wartość PlayerHealth zostanie ustawiona na 1.0. Nie tego oczekujesz, ale możesz to naprawić poprzez zagnieżdżenie w wyrażeniach if innych kontroli, które sprawdzają tylko PotionType.
# Kod uruchamiany, gdy gracz wypije miksturę leczniczą
# Jeśli po uleczeniu poziom zdrowia gracza nie przekroczyłby wartości MaxHealth,
# ulecz go z zastosowaniem pełnej wartości leczenia
if (PotionType = "heal"):
if ((PlayerHealth + PotionHealAmount) < MaxHealth):
set PlayerHealth = PlayerHealth + PotionHealAmount
Print ("Pełne leczenie")
else:
# ustaw PlayerHealth na MaxHealth
set PlayerHealth = MaxHealth
Print("Wartość PlayerHealth jest zbyt wysoka, aby pełne leczenie było możliwe")
# Kod uruchamiany, gdy gracz wypije miksturę zadającą obrażenia
# Nie eliminuj gracza, jeśli jego zdrowie jest powyżej MinHealth, ale poniżej PotionDamageAmount
# Jeśli poziom zdrowia gracza jest już równy MinHealth lub niższy, wyeliminuj go
if (PotionType = "obrażenia"):
if ((PlayerHealth > PotionDamageAmount)):
set PlayerHealth = PlayerHealth - PotionDamageAmount
Print("Pełne obrażenia")
else if (PlayerHealth > MinHealth):
# Daj graczowi jeszcze jedną szansę, jeśli ma niski poziom zdrowia
set PlayerHealth = 1.0
Print("Wartość PlayerHealth ustawiona na 1.0")
else:
# Wyeliminuj gracza
set PlayerHealth = 0.0
Print("Gracz został wyeliminowany!")
Teraz uruchomiony zostanie tylko blok kodu znajdujący się pod jednym z wyrażeń if, które sprawdzają PotionType. Wypróbuj ten kod ze zmienną PotionType ustawioną na "obrażenia".
Uff! Sporo zmian w kodzie, ale udało ci się!
Zrób sobie przerwę, łyknij miskt... to znaczy wody i wróć na kolejną lekcję.
Kompletny skrypt
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
hello_world_device := class(creative_device):
# Działa po uruchomieniu urządzenia w aktywnej grze
OnBegin<override>()<suspends> : void =
MaxHealth : float = 100.0
MinHealth : float = 1.0
var PotionType: string = "leczenie"
set PlayerHealth = 80.0
# Kod uruchamiany, gdy gracz wypije miksturę leczniczą
# Jeśli po uleczeniu poziom zdrowia gracza nie przekroczyłby wartości MaxHealth,
# ulecz go z zastosowaniem pełnej wartości leczenia
if (PotionType = "heal"):
if ((PlayerHealth + PotionHealAmount) < MaxHealth):
set PlayerHealth = PlayerHealth + PotionHealAmount
Print ("Pełne leczenie")
else:
# else, set PlayerHealth the MaxHealth
set PlayerHealth = MaxHealth
Print("Wartość PlayerHealth jest zbyt wysoka, aby pełne leczenie było możliwe")
# Kod uruchamiany, gdy gracz wypije miksturę zadającą obrażenia
# Nie eliminuj gracza, jeśli jego zdrowie jest powyżej MinHealth, ale poniżej PotionDamageAmount
# Jeśli poziom zdrowia gracza jest już równy MinHealth lub niższy, wyeliminuj go
if (PotionType = "obrażenia"):
if ((PlayerHealth > PotionDamageAmount)):
set PlayerHealth = PlayerHealth - PotionDamageAmount
Print("Pełne obrażenia")
else if (PlayerHealth > MinHealth):
# Daj graczowi jeszcze jedną szansę, jeśli ma niski poziom zdrowia
set PlayerHealth = 1.0
Print("Wartość PlayerHealth ustawiona na 1.0")
else:
set PlayerHealth = 0.0
Print("Gracz został wyeliminowany!")
Print("PlayerHealth wynosi teraz {PlayerHealth}")