Retorne ao código da poção mágica do último exercício. Você deve executar o código de cura quando o jogador bebe uma poção de cura e o código de dano quando ele bebe uma poção que causa dano.
Primeiro você escreve um código...
-
Como você terá que responder a uma pergunta sobre o tipo de poção, para criar uma nova variável para acompanhá-la, uma string chamada
PotionType.~~~(verse) var PotionType: string = "heal" ~~~
-
Agora, você pode perguntar se a variável
PotionTypeé igual a outra string. Quando você perguntar sePotionTypeé igual a"heal", a resposta será sim. O código de cura será então executado.~~~(verse) if (PotionType = "heal"): set PlayerHealth = PlayerHealth + PotionHealAmount ~~~
-
Agora, escreva uma expressão if semelhante para o código de dano.
~~~(verse) if (PotionType = "damage"): set PlayerHealth = PlayerHealth - PotionDamageAmount ~~~
Mas espere! Há um problema com o código de cura!
Nada aqui impede um jogador de continuar aumentando sua saúde com poções. É uma boa ideia limitar isso, e agora você pode, com
if! -
Primeiro, declare uma nova constante do tipo
float. Chame-a deMaxHealthe defina-a como100,0.~~~(verse) MaxHealth: float = 100.0
Se o valor de `PlayerHealth` ultrapassar o valor de `MaxHealth` quando um jogador beber a poção de cura, você precisará definir `PlayerHealth` como `MaxHealth`. ~~~(verse) # Código a ser executado se o jogador beber uma poção de cura # Se a saúde do jogador não exceder MaxHealth quando ele for curado, # curá-los até a quantidade total if (PotionType = "heal" and (PlayerHealth + PotionHealAmount) < MaxHealth): set PlayerHealth = PlayerHealth + PotionHealAmount else: set PlayerHealth = MaxHealthObserve que o código acima tem um
andpara perguntar sePotionTypeé igual a"heal"e sePlayerHealth + PotionAmounté menor queMaxHealth. Ambas as condições precisam ser bem-sucedidas para que a saúde do jogador seja aumentada por PotionHealAmount.Para alguém que está lendo esse código, talvez não esteja claro que ele visa impedir que PlayerHealth exceda MaxHealth. É aí que entram comentários de código. Observe as três linhas de comentários acima do código propriamente dito.
-
O código de dano funciona, mas pode ser melhorado com o uso de
if...else if...else. Se um jogador beber uma poção de dano que tornaria PlayerHealth0.0ou menos, vamos definir PlayerHealth como1,0. Se PlayerHealth já for1,0, depois o definimos como0,0. Assim, o jogador aprende que a poção é prejudicial, mas não muito punitiva.# Código a ser executado se o jogador beber uma poção prejudicial # Não eliminar o jogador se sua saúde estiver acima de MinHealth, mas abaixo de PotionDamageAmount # Se ele já estiver igual a ou abaixo de MinHealth, elimine-o if (PotionType = "damage" and PlayerHealth > PotionDamageAmount): set PlayerHealth = PlayerHealth - PotionDamageAmount else if (PlayerHealth > MinHealth): # Dar ao jogador mais uma chance se o nível de vida dele estiver baixo set PlayerHealth = 1.0 else: set PlayerHealth = 0.0
... Então você encontra o bug
Abaixo, você encontrará todo o código deste exercício, com algumas chamadas da função Print() adicionadas para teste. Tente executar esse código. Sinta-se à vontade para alterar as chamadas Print() para o que você quiser. Com a variável PotionType inicializada como “heal”, você pode esperar que apenas o código de cura seja executado.
Mas espere, tem um bug!
Execute o código abaixo e veja se você consegue encontrá-lo.
~~~(verse) MaxHealth: float = 100.0 MinHealth: float = 1.0 var PotionType: string = "heal"
Código a ser executado se o jogador beber uma poção de cura
Se a saúde do jogador não exceder MaxHealth quando ele for curado,
cure-os até a quantidade total
if (PotionType = "heal" and (PlayerHealth + PotionHealAmount) < MaxHealth): set PlayerHealth = PlayerHealth + PotionHealAmount Print ("Cura total") else: # else, set PlayerHealth the MaxHealth set PlayerHealth = MaxHealth Print("PlayerHealth muito alto para uma cura completa")
Código a ser executado se o jogador beber uma poção prejudicial
Não eliminar o jogador se sua saúde estiver acima de MinHealth, mas abaixo de PotionDamageAmount
Se ele já estiver igual a ou abaixo de MinHealth, elimine-o
if (PotionType = "damage" and PlayerHealth > PotionDamageAmount): set PlayerHealth = PlayerHealth - PotionDamageAmount Print("Dano total") else if (PlayerHealth > MinHealth): # Dar ao jogador mais uma chance se o nível de vida dele estiver baixo set PlayerHealth = 1.0 Print("PlayerHealth definido como 1.0") else: # Elimine o jogador set PlayerHealth = 0.0 Print("Jogador eliminado!")
Se `PotionType` estiver configurado como heal, somente o código de cura deverá ser executado. No entanto, as expressões `if`... `else if`... `if` no código de dano ainda estão sendo executadas. Isso significa que se `PlayerHealth` for maior que `MinHealth`, `PlayerHealth` será definido como `1.0`. Não é o que você quer, mas você pode corrigir isso aninhando as outras verificações em expressões `if` que verificam apenas `PotionType`.
~~~(verse)
# Código a ser executado se o jogador beber uma poção de cura
# Se a saúde do jogador não exceder MaxHealth quando ele for curado,
# cure-os até a quantidade total
if (PotionType = "heal"):
if ((PlayerHealth + PotionHealAmount) < MaxHealth):
set PlayerHealth = PlayerHealth + PotionHealAmount
Print ("Cura total")
else:
# set PlayerHealth the MaxHealth
set PlayerHealth = MaxHealth
Print("PlayerHealth muito alto para uma cura completa")
# Código a ser executado se o jogador beber uma poção prejudicial
# Não eliminar o jogador se sua saúde estiver acima de MinHealth, mas abaixo de PotionDamageAmount
# Se ele já estiver igual a ou abaixo de MinHealth, elimine-o
if (PotionType = "damage"):
if ((PlayerHealth > PotionDamageAmount)):
set PlayerHealth = PlayerHealth - PotionDamageAmount
Print("Dano total")
else if (PlayerHealth > MinHealth):
# Dar ao jogador mais uma chance se o nível de vida dele estiver baixo
set PlayerHealth = 1.0
Print("PlayerHealth definido como 1.0")
else:
# Eliminar o jogador
set PlayerHealth = 0.0
Print("Jogador eliminado!")
Agora, apenas o bloco de código recuado sob uma das expressões if que verificam PotionType será executado. Tente esse código com PotionType definido como "damage" também.
Ufa! São muitas mudanças de código, mas você conseguiu!
Faça uma pausa, beba um pouco de água e volte quando quiser começar a próxima aula.
O script completo
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
hello_world_device := class(creative_device):
# É executado quando o dispositivo é iniciado em um jogo em execução
OnBegin<override>()<suspends> : void =
MaxHealth : float = 100.0
MinHealth : float = 1.0
var PotionType: string = "heal"
set PlayerHealth = 80.0
# Código a ser executado se o jogador beber uma poção de cura
# Se a saúde do jogador não exceder MaxHealth quando ele for curado,
# cure-os até a quantidade total
if (PotionType = "heal"):
if ((PlayerHealth + PotionHealAmount) < MaxHealth):
set PlayerHealth = PlayerHealth + PotionHealAmount
Print ("Cura total")
else:
# else, set PlayerHealth the MaxHealth
set PlayerHealth = MaxHealth
Print("PlayerHealth muito alto para uma cura completa")
# Código a ser executado se o jogador beber uma poção prejudicial
# Não eliminar o jogador se sua saúde estiver acima de MinHealth, mas abaixo de PotionDamageAmount
# Se ele já estiver igual a ou abaixo de MinHealth, elimine-o
if (PotionType = "damage"):
if ((PlayerHealth > PotionDamageAmount)):
set PlayerHealth = PlayerHealth - PotionDamageAmount
Print("Dano total")
else if (PlayerHealth > MinHealth):
# Dar ao jogador mais uma chance se o nível de vida dele estiver baixo
set PlayerHealth = 1.0
Print("PlayerHealth definido como 1.0")
else:
set PlayerHealth = 0.0
Print("Jogador eliminado!")
Print("PlayerHealth now {PlayerHealth}")