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
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
comparamtotal
com o mesmo valor numérico. Essa é a oportunidade perfeita para usar uma instruçãoelse
.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-chaveelse
será 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
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çãoif
externa, e verifica resultados com três números repetidos na instruçãoif
interna. Esse padrão garante que, quando a verificação interna retornarfalse
, seu bloco de códigoelse
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.
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
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.No menu Arquivo do Visual Studio Code, clique em Salvar.
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.
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 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.
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-else
atualizado.As instruções
if
,else if
eelse
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çõeselse if
você quiser. Se as instruçõesif
eelse if
não se aplicarem, o bloco de códigoelse
final 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
roll
diretamente no código para testar cada mensagem.
Recapitulação
- A combinação de instruções
if
eelse
permite testar uma condição e executar um dos dois resultados possíveis. O bloco de código deif
será executado quando a expressão booliana fortrue
, e o bloco de código deelse
será executado quando a expressão booliana forfalse
. - Você pode aninhar instruções
if
para restringir uma condição possível. No entanto, considere o uso das instruçõesif
,else if
eelse
. - Use instruções
else if
para criar várias condições exclusivas. - O
else
é opcional, mas deve sempre ficar por último quando utilizado.