Exercício – Criar lógica de decisão aninhada com if, elseif e else
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.
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.
Reserve um minuto para examinar as duas instruções
ifao final do arquivo:if (total >= 15) { Console.WriteLine("You win!"); } if (total < 15) { Console.WriteLine("Sorry, you lose."); }Observe que ambas as instruções
ifcomparamtotalcom o mesmo valor numérico. Essa é a oportunidade perfeita para usar uma instruçãoelse.Atualize as duas instruções
ifda seguinte maneira:if (total >= 15) { Console.WriteLine("You win!"); } else { Console.WriteLine("Sorry, you lose."); }Aqui, se
total >= 15for falso, o bloco de código que vem após a palavra-chaveelseserá executado. Como esses dois resultados são opostos relacionados, este é o cenário perfeito para usar a palavra-chaveelse.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.
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."); }Reserve um minuto para analisar as instruções
ifaninhadas.A meta é criar um constructo
if-elseinterno 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çãoifexterna, e verifica resultados com três números repetidos na instruçãoifinterna. Esse padrão garante que, quando a verificação interna retornarfalse, seu bloco de códigoelsepoderá 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.
Crie uma linha em branco acima da linha em que
totalé declarada e inicializada.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
rolldiretamente 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.No menu Arquivo do Visual Studio Code, clique em Salvar.
No modo de exibição EXPLORER, para abrir um 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.
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!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;No menu Arquivo do Visual Studio Code, clique em Salvar.
No modo de exibição EXPLORER, para abrir um Terminal no local da pasta TestProject, clique com o botão direito do mouse em TestProject e selecione Abrir no Terminal Integrado.
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.
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!"); }Reserve um minuto para examinar o constructo
if-elseif-elseatualizado.As instruções
if,else ifeelsepermitem 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çõeselse ifvocê quiser. Se as instruçõesifeelse ifnão se aplicarem, o bloco de códigoelsefinal será executado. Oelseé opcional, mas deve ficar por último se você optar por incluí-lo.Use a técnica de incluir temporariamente os valores das variáveis
rolldiretamente no código para testar cada mensagem.
Recapitulação
- A combinação de instruções
ifeelsepermite testar uma condição e executar um dos dois resultados possíveis. O bloco de código deifserá executado quando a expressão booliana fortrue, e o bloco de código deelseserá executado quando a expressão booliana forfalse. - Você pode aninhar instruções
ifpara restringir uma condição possível. No entanto, considere o uso das instruçõesif,else ifeelse. - Use instruções
else ifpara criar várias condições exclusivas. - O
elseé opcional, mas deve sempre ficar por último quando utilizado.