Condições Múltiplas

Estruturas de controle podem ter mais de uma condição. As palavras-chave else e elseif podem criar situações adicionais para o que deve acontecer sob várias condições. A sintaxe se parece com:

Shows syntax for elseif and else

if isGreen then
print("Vai")
elseif isYellow then
print("Devagar")
elseif isPedestrians then
print("Espere")
else
print("pare")
end

Neste projeto, else e elseif são usados para codificar um curso de parkour onde os corredores recebem prêmios, dependendo do seu tempo final.

Programando Múltiplas Condições

Para este projeto, você poderia escrever uma declaração if única para cada medalha para recompensar os jogadores, mas isso leva muito tempo. Pegue, por exemplo, o código imaginário abaixo.

All if statements

if finishTime < 5 then
-- Receba medalha de ouro
end
if finishTime >= 5 and <= 10 then
-- Receba medalha de prata
end
if finishTime > 10 and <= 15 then
-- Receba medalha de bronze
end

Uma maneira mais legível e eficiente de codificar isto é usar uma única instrução if e usar a palavra-chave 'elseif' para fornecer condições alternativas para testar se as condições anteriores não são verdadeiras.

Uses elseif and else

if finishTime < 5 then
-- Receba medalha de ouro
elseif finishTime >= 5 and <= 10 then
-- Receba medalha de prata
elseif finishTime > 10 and <= 15 then
-- Receba medalha de bronze
end

Quando a instrução if/then é executada, ela vai começar no topo e somente executar o código para a primeira condição verdadeira que encontra.

Configurando a pista de corrida

Comece colocando o ponto de partida e a linha de chegada do curso e, em seguida, crie um script para cronometrar o jogador e premiar medalhas diferentes.

  1. Crie uma parte ancorada chamada FinishLine. Para tornar os testes mais rápidos, coloque o começo e o fim próximos uns dos outros. Você pode mover a linha de chegada depois de terminar o script.

    Peça de acabamento
    Pista inteira
  2. Em FinishLine, insira um script chamado RaceManager. Em seguida, adicione uma variável para armazenar quantos segundos se passaram desde que a corrida começou e uma segunda variável para fazer referência à FinishLine.


    local finishLine = script.Parent
    local timePassed = 0
  3. Crie uma função chamada finish().


    local timePassed = 0
    local finishLine = script.Parent
    local function finish()
    end
  4. Por sua conta:

    • Crie uma função chamada partTouched() que roda finish() quando um jogador a toca.
    • Conecte a parte da linha de chegada a partTouched().
    • Compare seu código com o exemplo abaixo.

    local function finish()
    print("touched the finish line")
    end
    local function partTouched(otherPart)
    local character = otherPart.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    finish()
    end
    end
    finishLine.Touched:Connect(partTouched)
  5. Teste o jogo e verifique se finish() é chamado quando você toca na linha de chegada.

Evitando que finish() se repita

Agora, sempre que um jogador toca a linha de chegada, finish() é chamado continuamente enquanto o jogador tocar a peça.

Use um booleano, uma variável que armazena verdadeiro ou falso, para garantir que finish() seja chamado apenas uma vez.

  1. Crie uma nova variável chamada raceActive e configure-a como true.


    local timePassed = 0
    local finishLine = script.Parent
    local raceActive = true
    -- Executa sempre que um jogador tocar a linha de chegada
    local function finish()
  2. Adicione uma segunda condição à declaração if para verificar se raceActive é verdadeiro antes de chamar finish().


    local function partTouched(otherPart)
    local character = otherPart.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid and raceActive == true then
    finish()
    end
    end
  3. Para impedir que finish() seja chamado novamente, defina raceActive para false.


    local function finish()
    print("touched the finish line")
    raceActive = false
    end
  4. Teste seu jogo para verificar se você só vê sua declaração de impressão de teste uma vez.

Cronometrando

Como uma declaração if, um loop de while também pode usar uma condição para ver se deve ser executado. Para cronometrar o jogador, crie um temporizador usando um while true do loop que só é executado quando o booleano raceActive é verdadeiro.

  1. Na parte inferior do script, digite while raceActive == true do. Pressione Enter para completar automaticamente e adicione o end.


    finishLine.Touched:Connect(partTouched)
    while raceActive == true do
    end
  2. Para cronometrar os jogadores, no loop, adicione 1 à variável timePassed uma vez a cada segundo. Inclua uma declaração print para testar seu trabalho.


    finishLine.Touched:Connect(partTouched)
    while raceActive == true do
    task.wait(1)
    timePassed = timePassed + 1
    print(timePassed)
    end
  3. Jogue o jogo e verifique se você vê cada segundo exibido na Janela de Saída.

Concedendo Medalhas ao Jogador

Para terminar, use uma declaração if com várias condições para conceder aos jogadores uma medalha de prêmio diferente com base em seu desempenho. Use uma instrução if e duas instruções elseif para verificar o tempo de término do jogador e premiá-los com a medalha correta.

  1. Para confirmar que cada medalha pode ser concedida, use declarações impressas.


    local function finish()
    raceActive = false
    print("You finished in " .. timePassed)
    end
  2. Para premiar uma medalha de ouro, programe uma instrução if que compara timePassed ao horário de término desejado. Este exemplo verifica se o tempo do jogador foi inferior ou igual a 10 segundos.


    local function finish()
    raceActive = false
    print("You finished in " .. timePassed)
    if timePassed <= 10 then
    print("You get a gold medal!")
    end
    end
  3. Teste o jogo e confirme que a medalha de ouro pode ser concedida.

Adicionando Condições Adicionais

Agora que você testou a medalha de ouro, programe as condições para as outras medalhas usando a palavra-chave elseif.

  1. Para a medalha de prata, use elseif e o próximo intervalo de tempo desejado. Neste exemplo, o alcance é maior que 10 segundos, mas inferior ou igual a 20 segundos.


    local function finish()
    raceActive = false
    print("You finished in " .. timePassed)
    if timePassed <= 10 then
    print("You get a gold medal!")
    elseif timePassed > 10 and timePassed <= 20 then
    print("You get a silver medal!")
    end
    end
  2. Use o mesmo padrão para a medalha de bronze. Verifique seu código com o exemplo abaixo.


    local function finish()
    raceActive = false
    print("You finished in " .. timePassed)
    if timePassed <= 10 then
    print("You get a gold medal!")
    elseif timePassed > 10 and timePassed <= 20 then
    print("You get a silver medal!")
    elseif timePassed > 20 and timePassed <= 30 then
    print("You get a bronze medal!")
    end
    end
  3. Teste o jogo para as medalhas de prata e bronze.

Dicas para solução de problemas

Se você não ver as medalhas de prata e bronze aparecerem, tente um dos métodos abaixo.

  • Cada elseif deve ter um then após sua condição.
  • Em partTouched(), certifique-se que a segunda condição da instrução if usa ==, como em raceActive == true.
  • Verifique se cada elseif está dentro do alcance. Cada condição elseif deve estar entre a primeira linha da declaração if/then e seu último end.

Adicionando a Condição Else

Se o jogador não ganhou nenhuma das medalhas, você deve encorajá-lo a tentar novamente. Neste caso, você pode usar uma declaração else, que executa se nenhuma outra condição for verdadeira, para mostrar uma mensagem a eles.

  1. Abaixo da última elseif e acima de end, inicie uma nova linha e digite else. Não adicione then. Entre outras coisas, use uma instrução de impressão para solicitar a eles que tentem novamente.


    local function finish()
    raceActive = false
    print("You finished in " .. timePassed)
    if timePassed <= 10 then
    print("You get a gold medal!")
    elseif timePassed > 10 and timePassed <= 20 then
    print("You get a silver medal!")
    elseif timePassed > 20 and timePassed <= 30 then
    print("You get a bronze medal!")
    else
    print("Try again!")
    end
    end

2 . Teste para ver a mensagem else.

Resumo

Estruturas de controle podem ter mais de uma situação. Use instruções if para configurar a instrução inicial para verificar, e então adicione quantas condições elseif forem necessárias. Finalmente, use else para declarar o que deve acontecer se todas as condições dadas forem falsas.

Começando no topo, todas as condições serão verificadas e apenas a primeira condição verdadeira rodará o código. As condições restantes não serão verificadas, nem seu código será rodado.

Depois de terminar o projeto, você pode expandir o script para adicionar novos elementos de algumas maneiras extras.

  • Adicione o código para que os jogadores possam repetir a corrida tocando a linha de partida quando terminarem.
  • Crie uma maneira de exibir o tempo durante uma corrida. Você pode exibir o tempo em uma parte usando uma interface de superfície, como no Tutorial de criação de uma ponte temporizada.
Completed script

local timePassed = 0
local finishLine = script.Parent
-- Used to keep finish() and timer from repeating when race is over
local raceActive = true
-- Runs when the player touches the finish line and shows them an award
local function finish()
raceActive = false
print("You finished in " .. timePassed)
if timePassed <= 10 then
print("You get a gold medal!")
elseif timePassed > 10 and timePassed <= 20 then
print("You get a silver medal!")
elseif timePassed > 20 and timePassed <= 30 then
print("You get a bronze medal!")
else
print("Try again!")
end
end
-- Checks if a player touches the part when a race is active
local function partTouched(otherPart)
local character = otherPart.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid and raceActive == true then
finish()
end
end
finishLine.Touched:Connect(partTouched)
-- Keeps track of race time while the race is active. Needs to be at script bottom.
while raceActive == true do
task.wait(1)
timePassed = timePassed + 1
print(timePassed)
end