Son alıştırmadaki sihirli iksir koduna geri dönelim. Oyuncu bir iyileştirme iksiri içtiğinde iyileştirme kodunu, hasar veren iksiri içtiğinde ise hasar kodunu çalıştırman gerekecek.
Önce Biraz Kod Yazalım...
-
Görünüşe göre iksirin türüyle ilgili bir soruyu yanıtlaman gerekecek; dolayısıyla bunu takip etmek için
PotionTypeadlı yeni bir değişken oluşturabilirsin.var PotionType: string = "heal" -
Şimdi
PotionTypedeğişkeninin başka bir dizeye eşit olup olmadığını sorabilirsin.PotionType"heal”a eşit mi diye sorduğunda, cevap evet olacak. Ardından iyileştirme kodu çalışacak.if (PotionType = "heal"): set PlayerHealth = PlayerHealth + PotionHealAmount -
Şimdi hasar kodu için benzer bir if ifadesi yaz.
if (PotionType = "damage"): set PlayerHealth = PlayerHealth - PotionDamageAmountFakat bir dakika! İyileştirme koduyla ilgili bir sorun var!
Bu koddaki hiçbir şey, bir oyuncunun canını iksirlerle arttırmaya devam etmesini engellemiyor. Bunu sınırlandırmak iyi bir fikir ve şimdi bunu
ifile yapabilirsin! -
Öncelikle
floattüründe yeni bir sabit bildir. BunaMaxHealthadını ver ve100.0olarak ayarla.MaxHealth: float = 100.0Bir oyuncu iyileştirme iksirini içtiğinde
PlayerHealthdeğeriMaxHealthdeğerini aşarsaPlayerHealthiMaxHealtholarak ayarlaman gerekir.# Oyuncu iyileştirici bir iksir içerse çalıştırılacak kod # Oyuncunun canı, iyileştiğinde MaxHealth'i geçmeyecekse # onu tam can miktarına getir if (PotionType = "heal" and (PlayerHealth + PotionHealAmount) < MaxHealth): set PlayerHealth = PlayerHealth + PotionHealAmount else: set PlayerHealth = MaxHealthYukarıdaki kodun,
PotionTypedeğerinin"heal”a eşit olup olmadığını vePlayerHealth + PotionAmountdeğerininMaxHealthmiktarından küçük olup olmadığını sormak için birandifadesi içerdiğine dikkat et. PlayerHealth değerinin PotionHealAmount kadar artması için bu koşulların her ikisinin de yerine getirilmesi gerekir.Bu kodu okuyan birisi, kodun, PlayerHealth değerinin MaxHealth değerini aşmasını engellemeyi amaçladığını anlamayabilir. İşte kod açıklamaları burada devreye girer. Gerçek kodun üzerindeki üç satırlık açıklamaya dikkat et.
-
Hasar kodu çalışıyor, ancak
if…else if…elsekullanılarak geliştirilebilir. Bir oyuncu, PlayerHealth değerini0.0veya daha az yapacak bir hasar iksiri içerse PlayerHealth değerini bunun yerine1.0olarak ayarlamak isteriz. PlayerHealth zaten1.0ise sonra bunu0.0olarak ayarlarız. Bu da oyuncuya iksirin zararlı olduğunu, çok da cezalandırıcı olmadan öğretir.# Oyuncu hasar verici bir iksir içerse çalıştırılacak kod # Oyuncunun canı MinHealth değerinin üzerinde, ancak PotionDamageAmount değerinin altındaysa oyuncuyu avlama # Halihazırda MinHealth değerine eşit veya onun altındaysa oyuncuyu avla if (PotionType = "damage" and PlayerHealth > PotionDamageAmount): set PlayerHealth = PlayerHealth - PotionDamageAmount else if (PlayerHealth > MinHealth): # Canı düşükse oyuncuya bir şans daha ver set PlayerHealth = 1.0 else: set PlayerHealth = 0.0
... Sonra Hatayı Bul
Aşağıda, test için eklenen bazı Print() işlevi çağrılarıyla beraber bu alıştırmadaki tüm kodu bulabilirsin. Bu kodu çalıştırmayı dene. Print() çağrılarını istediğin şekilde değiştirmekten çekinme. PotionType değişkeninin “heal” olarak başlatılması sebebiyle yalnızca iyileştirme kodunun çalışmasını bekleyebilirsin.
Fakat bir dakika, bir hata var!
Aşağıdaki kodu çalıştır ve hatayı bulup bulamayacağına bir bak.
MaxHealth: float = 100.0
MinHealth: float = 1.0
var PotionType: string = "heal"
# Oyuncu iyileştirici bir iksir içerse çalıştırılacak kod
# Oyuncunun canı, iyileştiğinde MaxHealth'i geçmeyecekse
# onu tam can miktarına getir
if (PotionType = "heal" and (PlayerHealth + PotionHealAmount) < MaxHealth):
set PlayerHealth = PlayerHealth + PotionHealAmount
Print ("Full heal")
else:
# aksi halde, PlayerHealth değerini MaxHealth olarak ayarla
set PlayerHealth = MaxHealth
Print("PlayerHealth too high for full heal")
# Oyuncu hasar verici bir iksir içerse çalıştırılacak kod
# Oyuncunun canı MinHealth değerinin üzerinde, ancak PotionDamageAmount değerinin altındaysa oyuncuyu avlama
# Halihazırda MinHealth değerine eşit veya onun altındaysa oyuncuyu avla
if (PotionType = "damage" and PlayerHealth > PotionDamageAmount):
set PlayerHealth = PlayerHealth - PotionDamageAmount
Print("Full damage")
else if (PlayerHealth > MinHealth):
# Canı düşükse oyuncuya bir şans daha ver
set PlayerHealth = 1.0
Print("PlayerHealth set to 1.0")
else:
# Oyuncuyu avla
set PlayerHealth = 0.0
Print("Player eliminated!")
PotionType iyileştirme olarak ayarlanmışsa yalnızca iyileştirme kodu çalışmalı. Ancak, hasar kodundaki if … else if … if ifadeleri yine de yürütülüyor. Bunun anlamı, PlayerHealth değerinin MinHealth değerinden büyük olması halinde PlayerHealth değerinin 1.0 olarak ayarlanacak olmasıdır. İstediğin şey bu değil; ancak bu durumu, diğer kontrolleri, yalnızca PotionTypeı kontrol eden if ifadelerinin içine yerleştirerek düzeltebilirsin.
# Oyuncu iyileştirici bir iksir içerse çalıştırılacak kod
# Oyuncunun canı, iyileştiğinde MaxHealth'i geçmeyecekse
# onu tam can miktarına getir
if (PotionType = "heal"):
if ((PlayerHealth + PotionHealAmount) < MaxHealth):
set PlayerHealth = PlayerHealth + PotionHealAmount
Print ("Full heal")
else:
# PlayerHealth değerini MaxHealth olarak ayarla
set PlayerHealth = MaxHealth
Print("PlayerHealth too high for full heal")
# Oyuncu hasar verici bir iksir içerse çalıştırılacak kod
# Oyuncunun canı MinHealth değerinin üzerinde, ancak PotionDamageAmount değerinin altındaysa oyuncuyu avlama
# Halihazırda MinHealth değerine eşit veya onun altındaysa oyuncuyu avla
if (PotionType = "damage"):
if ((PlayerHealth > PotionDamageAmount)):
set PlayerHealth = PlayerHealth - PotionDamageAmount
Print("Full damage")
else if (PlayerHealth > MinHealth):
# Canı düşükse oyuncuya bir şans daha ver
set PlayerHealth = 1.0
Print("PlayerHealth set to 1.0")
else:
# Oyuncuyu avla
set PlayerHealth = 0.0
Print("Player eliminated!")
Artık yalnızca, PotionType değerini kontrol eden if ifadelerinden birinin altındaki girintili kod bloğu çalışacak. Bu kodu, PotionType "damage" olarak ayarlanmış şekilde de dene.
Vay canına! Çok fazla kod değişikliği oldu ama başardın!
Bir ara ver, bir bardak iks- pardon... su iç ve bir sonraki ders için hazır olduğunda geri gel.
Tam Kod
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
hello_world_device := class(creative_device):
# Cihaz, çalışmakta olan bir oyunda başlatıldığında çalışır
OnBegin<override>()<suspends> : void =
MaxHealth : float = 100.0
MinHealth : float = 1.0
var PotionType: string = "heal"
set PlayerHealth = 80.0
# Oyuncu iyileştirici bir iksir içerse çalıştırılacak kod
# Oyuncunun canı, iyileştiğinde MaxHealth'i geçmeyecekse
# onu tam can miktarına getir
if (PotionType = "heal"):
if ((PlayerHealth + PotionHealAmount) < MaxHealth):
set PlayerHealth = PlayerHealth + PotionHealAmount
Print ("Full heal")
else:
# aksi halde, PlayerHealth değerini MaxHealth olarak ayarla
set PlayerHealth = MaxHealth
Print("PlayerHealth too high for full heal")
# Oyuncu hasar verici bir iksir içerse çalıştırılacak kod
# Oyuncunun canı MinHealth değerinin üzerinde, ancak PotionDamageAmount değerinin altındaysa oyuncuyu avlama
# Halihazırda MinHealth değerine eşit veya onun altındaysa oyuncuyu avla
if (PotionType = "damage"):
if ((PlayerHealth > PotionDamageAmount)):
set PlayerHealth = PlayerHealth - PotionDamageAmount
Print("Full damage")
else if (PlayerHealth > MinHealth):
# Canı düşükse oyuncuya bir şans daha ver
set PlayerHealth = 1.0
Print("PlayerHealth set to 1.0")
else:
set PlayerHealth = 0.0
Print("Player eliminated!")
Print("PlayerHealth now {PlayerHealth}")