Вернёмся к коду волшебного зелья из последнего упражнения. Допустим, требуется запускать код исцеления, когда игрок выпивает лечебное зелье, и код урона, когда он выпивает зелье урона.
Сначала пишешь код…
-
Похоже, нам придётся ответить на вопрос о типе зелья, поэтому можно создать новую переменную, строку с именем
PotionType, чтобы отслеживать тип зелья.var PotionType: string = "heal" -
Теперь можно спросить, равна ли переменная
PotionTypeдругой строке. Если спросить, равна ли переменнаяPotionTypeзначению"heal"(лечение), ответом будет «да». Затем должен запуститься код исцеления.if (PotionType = "heal"): set PlayerHealth = PlayerHealth + PotionHealAmount -
Теперь напишите аналогичное выражение if для кода урона.
if (PotionType = "damage"): set PlayerHealth = PlayerHealth - PotionDamageAmountНо подождите! С кодом исцеления есть проблема!
Ничто не мешает игроку бесконечно повышать своё здоровье с помощью зелий. Хорошо бы ограничить повышение, и вы можете сделать это с помощью
if! -
Сначала объявите новую константу типа
float. Назовите еёMaxHealthи задайте значение100,0.MaxHealth: float = 100.0Если значение
PlayerHealthпревыситMaxHealth, когда игрок выпьет лечебное зелье, нужно будет установитьPlayerHealthравнымMaxHealth.# Выполняемый код, когда игрок пьёт лечебное зелье # Если здоровье игрока не превысит MaxHealth при лечении, # исцелить игрока в полном объёме if (PotionType = "heal" and (PlayerHealth + PotionHealAmount) < MaxHealth): set PlayerHealth = PlayerHealth + PotionHealAmount else: set PlayerHealth = MaxHealthОбратите внимание, что в приведённом выше коде есть оператор
and, чтобы узнать, равно лиPotionTypeзначению"лечение"и меньше лиPlayerHealth + PotionAmount, чемMaxHealth. Оба эти условия должны быть выполнены, чтобы переменная PlayerHealth увеличилась на PotionHealAmount.Другому человеку, читающему этот код, может быть неясно, что он предназначен для предотвращения превышения переменной PlayerHealth значения MaxHealth. Вот тут-то и пригодятся комментарии к коду. Обратите внимание на три строки комментариев над фактическим кодом.
-
Код урона работает, но его можно улучшить с помощью операторов
if…else if…else. Если игрок выпьет зелье, наносящее урон, которое сделает его здоровье равным 0,0 или ниже, мы установим вместо этого playerHealth равным1,0. Если PlayerHealth уже равно1,0, мы установим её на0,0. Это даст игроку понять, что зелье вредно, но не слишком наказывает.# Выполняемый код, когда игрок пьёт зелье урона # Не устранять игрока, если его здоровье выше MinHealth, но ниже PotionDamageAmount — величины урона зелья # Если здоровье уже равно или ниже MinHealth, устранить игрока if (PotionType = "damage" and PlayerHealth > PotionDamageAmount): set PlayerHealth = PlayerHealth - PotionDamageAmount else if (PlayerHealth > MinHealth): # Дать игроку ещё один шанс, если у него низкий запас здоровья set PlayerHealth = 1.0 else: set PlayerHealth = 0.0
… Потом находим ошибку
Ниже приведён полный код этого упражнения с несколькими вызовами функции Print(), добавленными для тестирования. Попробуйте выполнить этот код. Вы можете свободно изменять вызовы Print() по своему желанию. Так как переменная PotionType инициализирована значением "лечение", можно ожидать, что будет работать только код лечения.
Но подождите, ведь в коде есть ошибка!
Запустите следующий код и попробуйте найти её самостоятельно.
MaxHealth: float = 100.0
MinHealth: float = 1.0
var PotionType: string = "heal"
# Выполняемый код, когда игрок пьёт лечебное зелье
# Если здоровье игрока не превысит MaxHealth при лечении,
# исцелить игрока в полном объёме
if (PotionType = "heal" and (PlayerHealth + PotionHealAmount) < MaxHealth):
set PlayerHealth = PlayerHealth + PotionHealAmount
Print ("Полное исцеление")
else:
# else задать переменной PlayerHealth значение MaxHealth
set PlayerHealth = MaxHealth
Print("PlayerHealth слишком велико для полного исцеления")
# Выполняемый код, когда игрок пьёт зелье урона
# Не устранять игрока, если его здоровье выше MinHealth, но ниже PotionDamageAmount — величины урона зелья
# Если здоровье уже равно или ниже MinHealth, устранить игрока
if (PotionType = "damage" and PlayerHealth > PotionDamageAmount):
set PlayerHealth = PlayerHealth - PotionDamageAmount
Print("Полный урон")
else if (PlayerHealth > MinHealth):
# Дать игроку ещё один шанс, если у него низкий запас здоровья
set PlayerHealth = 1.0
Print("PlayerHealth установлено на 1.0")
else:
# Устранить игрока
set PlayerHealth = 0.0
Print("Игрок устранён!")
Если для переменной PotionType установлено значение "лечение", должен запускаться только код лечения. Однако выражения if … else if … if в коде урона по-прежнему выполняются. Это означает, что, если PlayerHealth больше, чем MinHealth, для PlayerHealth будет установлено значение 1.0. Это не то, что требуется, но вы можете исправить ситуацию, вложив другие проверки в выражения if, которые проверяют только PotionType.
# Выполняемый код, когда игрок пьёт лечебное зелье
# Если здоровье игрока не превысит MaxHealth при лечении,
# исцелить игрока в полном объёме
if (PotionType = "heal"):
if ((PlayerHealth + PotionHealAmount) < MaxHealth):
set PlayerHealth = PlayerHealth + PotionHealAmount
Print ("Полное исцеление")
else:
# Задать переменной PlayerHealth значение MaxHealth
set PlayerHealth = MaxHealth
Print("PlayerHealth слишком велико для полного исцеления")
# Выполняемый код, когда игрок пьёт зелье урона
# Не устранять игрока, если его здоровье выше MinHealth, но ниже PotionDamageAmount — величины урона зелья
# Если здоровье уже равно или ниже MinHealth, устранить игрока
if (PotionType = "damage"):
if ((PlayerHealth > PotionDamageAmount)):
set PlayerHealth = PlayerHealth - PotionDamageAmount
Print("Полный урон")
else if (PlayerHealth > MinHealth):
# Дать игроку ещё один шанс, если у него низкий запас здоровья
set PlayerHealth = 1.0
Print("PlayerHealth установлено на 1.0")
else:
# Устранить игрока
set PlayerHealth = 0.0
Print("Игрок устранён!")
Теперь будет выполняться только блок кода с отступом под одним из выражений if, которые проверяют PotionType. Также попробуйте выполнить этот код, установив для PotionType значение "урон".
Фух! Пришлось неслабо перетряхнуть код, но всё получилось!
Сделайте перерыв, выпейте зель… то есть воды и возвращайтесь, когда будете готовы к следующему уроку.
Полный сценарий
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
hello_world_device := class(creative_device):
# Выполняется при запуске устройства в работающей игре
OnBegin<override>()<suspends> : void =
MaxHealth : float = 100.0
MinHealth : float = 1.0
var PotionType: string = "heal"
set PlayerHealth = 80.0
# Выполняемый код, когда игрок пьёт лечебное зелье
# Если здоровье игрока не превысит MaxHealth при лечении,
# исцелить игрока в полном объёме
if (PotionType = "heal"):
if ((PlayerHealth + PotionHealAmount) < MaxHealth):
set PlayerHealth = PlayerHealth + PotionHealAmount
Print ("Полное исцеление")
else:
# else задать переменной PlayerHealth значение MaxHealth
set PlayerHealth = MaxHealth
Print("PlayerHealth слишком велико для полного исцеления")
# Выполняемый код, когда игрок пьёт зелье урона
# Не устранять игрока, если его здоровье выше MinHealth, но ниже PotionDamageAmount — величины урона зелья
# Если здоровье уже равно или ниже MinHealth, устранить игрока
if (PotionType = "damage"):
if ((PlayerHealth > PotionDamageAmount)):
set PlayerHealth = PlayerHealth - PotionDamageAmount
Print("Полный урон")
else if (PlayerHealth > MinHealth):
# Дать игроку ещё один шанс, если у него низкий запас здоровья
set PlayerHealth = 1.0
Print("PlayerHealth установлено на 1.0")
else:
set PlayerHealth = 0.0
Print("Игрок устранён!")
Print("PlayerHealth теперь равно {PlayerHealth}")