Exercício – Criar lógica de decisão aninhada com if, elseif e else

Concluído

Na unidade anterior, você usou várias instruções if para implementar as regras de um jogo. No entanto, ao final da unidade, você observou que são necessárias instruções if mais expressivas para corrigir um bug sutil em seu código.

Neste exercício, você usará as instruções if, else e else if para melhorar as opções de ramificação do seu código e corrigir um bug lógico.

Usar as instruções if e else em vez de duas instruções if separadas

Em vez de executar duas verificações para exibir a mensagem "Você ganhou!" ou "Lamentamos, mas você perdeu.", você usará a palavra-chave else.

  1. Verifique se o código de Program.cs corresponde ao seguinte:

    Random dice = new Random();
    
    int roll1 = dice.Next(1, 7);
    int roll2 = dice.Next(1, 7);
    int roll3 = dice.Next(1, 7);
    
    int total = roll1 + roll2 + roll3;
    
    Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
    
    if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3))
    {
        Console.WriteLine("You rolled doubles! +2 bonus to total!");
        total += 2;
    }
    
    if ((roll1 == roll2) && (roll2 == roll3)) 
    {
        Console.WriteLine("You rolled triples! +6 bonus to total!");
        total += 6;
    }
    
    if (total >= 15)
    {
        Console.WriteLine("You win!");
    }
    
    if (total < 15)
    {
        Console.WriteLine("Sorry, you lose.");
    }
    
    

    Esse é o código que você concluiu na unidade anterior.

  2. Reserve um minuto para examinar as duas instruções if ao final do arquivo:

    if (total >= 15)
    {
        Console.WriteLine("You win!");
    }
    
    if (total < 15)
    {
        Console.WriteLine("Sorry, you lose.");
    }
    
    

    Observe que ambas as instruções if comparam total com o mesmo valor numérico. Essa é a oportunidade perfeita para usar uma instrução else.

  3. Atualize as duas instruções if da seguinte maneira:

    if (total >= 15)
    {
        Console.WriteLine("You win!");
    }
    else 
    {
        Console.WriteLine("Sorry, you lose.");
    }
    
    

    Aqui, se total >= 15 for falso, o bloco de código que vem após a palavra-chave else será executado. Como esses dois resultados são opostos relacionados, este é o cenário perfeito para usar a palavra-chave else.

  4. O arquivo Program.cs atualizado deve conter o seguinte código:

    Random dice = new Random();
    
    int roll1 = dice.Next(1, 7);
    int roll2 = dice.Next(1, 7);
    int roll3 = dice.Next(1, 7);
    
    int total = roll1 + roll2 + roll3;
    
    Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
    
    if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3))
    {
        Console.WriteLine("You rolled doubles!  +2 bonus to total!");
        total += 2;
    }
    
    if ((roll1 == roll2) && (roll2 == roll3))
    {
        Console.WriteLine("You rolled triples!  +6 bonus to total!");
        total += 6;
    }
    
    if (total >= 15)
    {
        Console.WriteLine("You win!");
    }
    else 
    {
        Console.WriteLine("Sorry, you lose.");
    }
    
    

Modificar o código para remover o bônus acumulado para resultados de dois e três números repetidos usando aninhamento

Na unidade anterior, você viu que um bug lógico sutil foi introduzido em seu aplicativo. Você pode corrigir esse problema aninhando suas instruções if.

O aninhamento nos permite colocar blocos de código dentro de outros blocos de código. Nesse caso, você aninhará uma combinação de if e else (verificação de resultados com dois números repetidos) dentro de outra instrução if (verificação de resultados com três números repetidos) para impedir que sejam concedidos ambos os bônus em uma só jogada.

  1. Modifique seu código de forma que corresponda à seguinte listagem de código:

    Random dice = new Random();
    
    int roll1 = dice.Next(1, 7);
    int roll2 = dice.Next(1, 7);
    int roll3 = dice.Next(1, 7);
    
    int total = roll1 + roll2 + roll3;
    
    Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
    
    if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3))
    {
        if ((roll1 == roll2) && (roll2 == roll3))
        {
            Console.WriteLine("You rolled triples!  +6 bonus to total!");
            total += 6;
        }
        else
        {
            Console.WriteLine("You rolled doubles!  +2 bonus to total!");
            total += 2;
        }
    }
    
    if (total >= 15)
    {
        Console.WriteLine("You win!");
    }
    else 
    {
        Console.WriteLine("Sorry, you lose.");
    }
    
    
  2. Reserve um minuto para analisar as instruções if aninhadas.

    A meta é criar um constructo if-else interno em que os dois resultados são opostos relacionados, e usar os resultados opostos (if/verdadeiro e else/falso) para conceder os pontos de bônus para resultados com dois ou três números repetidos. Para atingir essa meta, você verifica resultados com dois números repetidos na instrução if externa, e verifica resultados com três números repetidos na instrução if interna. Esse padrão garante que, quando a verificação interna retornar false, seu bloco de código else poderá conceder os pontos para os resultados com dois números repetidos.

    A seguir, você "incluirá diretamente no código" os resultados dos três lançamentos de dados para testar a lógica do seu código.

  3. Crie uma linha em branco acima da linha em que total é declarada e inicializada.

  4. Para testar um lançamento com dois valores iguais, insira o seguinte código:

    roll1 = 6;
    roll2 = 6;
    roll3 = 5;
    

    A definição dos valores das três variáveis roll diretamente no código permite que você teste seu código sem precisar executar o aplicativo dezenas de vezes até abranger todos os cenários possíveis.

  5. No menu Arquivo do Visual Studio Code, clique em Salvar.

  6. No painel EXPLORER, para abrir o Terminal no local da pasta TestProject, clique com o botão direito do mouse em TestProject e selecione Abrir no Terminal Integrado.

    Um painel Terminal deve ser aberto e incluir um prompt de comando mostrando que o Terminal está aberto no local da pasta TestProject.

  7. No prompt de comando do Terminal, para executar seu código, digite dotnet run e pressione Enter.

    Quando o código for executado, você deverá ver o seguinte:

    Dice roll: 6 + 6 + 5 = 17
    You rolled doubles!  +2 bonus to total!
    You win!
    
    
  8. Para testar um lançamento com três valores iguais, atualize os valores inseridos diretamente no código para suas variáveis de lançamento de dados da seguinte maneira:

    roll1 = 6;
    roll2 = 6;
    roll3 = 6;
    
  9. No menu Arquivo do Visual Studio Code, clique em Salvar.

  10. No painel EXPLORER, para abrir o Terminal no local da pasta TestProject, clique com o botão direito do mouse em TestProject e selecione Abrir no Terminal Integrado.

  11. No prompt de comando do Terminal, para executar seu código, digite dotnet run e pressione Enter.

    Quando o código for executado, você deverá ver o seguinte:

    Dice roll: 6 + 6 + 6 = 18
    You rolled triples!  +6 bonus to total!
    You win!
    
    

Usar as instruções if, else e elseif para conceder um prêmio em vez de uma mensagem de vitória ou derrota

Para deixar o jogo mais divertido, em vez de uma mensagem de "vitória" ou "derrota", você pode mudar para a concessão de prêmios fictícios para cada pontuação. Você pode oferece quatro prêmios. No entanto, o jogador deve ganhar apenas um prêmio:

  • Se a pontuação do jogador for maior ou igual a 16, ele ganhará um carro novo.
  • Se a pontuação do jogador for maior ou igual a 10, ele ganhará um laptop novo.
  • Se a pontuação do jogador for exatamente 7, ele ganhará uma viagem.
  • Caso contrário, ganhará um gatinho.
  1. Modifique o código das etapas anteriores para a seguinte listagem de código:

    Random dice = new Random();
    
    int roll1 = dice.Next(1, 7);
    int roll2 = dice.Next(1, 7);
    int roll3 = dice.Next(1, 7);
    
    int total = roll1 + roll2 + roll3;
    
    Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
    
    if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3))
    {
        if ((roll1 == roll2) && (roll2 == roll3))
        {
            Console.WriteLine("You rolled triples!  +6 bonus to total!");
            total += 6;
        }
        else
        {
            Console.WriteLine("You rolled doubles!  +2 bonus to total!");
            total += 2;
        }
    
        Console.WriteLine($"Your total including the bonus: {total}");
    }
    
    if (total >= 16)
    {
        Console.WriteLine("You win a new car!");
    }
    else if (total >= 10)
    {
        Console.WriteLine("You win a new laptop!");
    }
    else if (total == 7)
    {
        Console.WriteLine("You win a trip for two!");
    }
    else
    {
        Console.WriteLine("You win a kitten!");
    }
    
    
  2. Reserve um minuto para examinar o constructo if-elseif-else atualizado.

    As instruções if, else if e else permitem criar várias condições exclusivas como expressões boolianas. Em outras palavras, quando quiser que apenas um resultado aconteça, mas tiver várias condições e resultados possíveis, use quantas instruções else if você quiser. Se as instruções if e else if não se aplicarem, o bloco de código else final será executado. O else é opcional, mas deve ficar por último se você optar por incluí-lo.

  3. Use a técnica de incluir temporariamente os valores das variáveis roll diretamente no código para testar cada mensagem.

Recapitulação

  • A combinação de instruções if e else permite testar uma condição e executar um dos dois resultados possíveis. O bloco de código de if será executado quando a expressão booliana for true, e o bloco de código de else será executado quando a expressão booliana for false.
  • Você pode aninhar instruções if para restringir uma condição possível. No entanto, considere o uso das instruções if, else if e else.
  • Use instruções else if para criar várias condições exclusivas.
  • O else é opcional, mas deve sempre ficar por último quando utilizado.