Exercício - Crie lógica de decisão aninhada com if, else if e else
Na unidade anterior, você usou várias if
instruções para implementar as regras de um jogo. No entanto, no final da unidade, você notou que instruções mais expressivas if
são necessárias para corrigir um bug sutil em seu código.
Neste exercício, você usará if
, else
e instruções para melhorar as opções de ramificação em seu código e else if
corrigir um bug lógico.
Use 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ê ganha!" ou "Desculpe, você perde", você usará a else
palavra-chave.
Certifique-se de que o código .cs programa 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."); }
Este é o código que você completou na unidade anterior.
Reserve um minuto para examinar as duas
if
declarações no final do arquivo:if (total >= 15) { Console.WriteLine("You win!"); } if (total < 15) { Console.WriteLine("Sorry, you lose."); }
Observe que ambas as
if
instruções se comparamtotal
com o mesmo valor numérico. Esta é a oportunidade perfeita para usar umaelse
declaração.Atualize as duas
if
instruções da seguinte forma:if (total >= 15) { Console.WriteLine("You win!"); } else { Console.WriteLine("Sorry, you lose."); }
Aqui, se
total >= 15
for false, o bloco de código que segue aelse
palavra-chave será executado. Uma vez que os dois resultados são opostos relacionados, este é um cenário perfeito para aelse
palavra-chave.O arquivo .cs programa 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."); }
Modifique o código para remover o bônus de empilhamento para duplos e triplos usando aninhamento
Na unidade anterior, você viu que um bug de lógica sutil foi introduzido em seu aplicativo. Você pode corrigir esse problema aninhando suas if
declarações.
O aninhamento permite que você coloque blocos de código dentro de blocos de código. Neste caso, você aninhará uma if
combinação (o cheque para duplas) dentro de outra if
declaração (else
o cheque para triplos) para evitar que ambos os bônus sejam concedidos.
Modifique o código para corresponder à 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 revisar as instruções aninhadas
if
.O objetivo é criar uma construção interna
if-else
onde os dois resultados são opostos relacionados e, em seguida, usar os resultados opostos (se/verdadeiro e outro/falso) para conceder os pontos de bônus para triplos e duplos. Para atingir esse objetivo, você verifica se há duplos na declaração externaif
e, em seguida, triplos na declaração internaif
. Esse padrão garante que, quando a verificação interna para triplos retornarfalse
, seuelse
bloco de código possa conceder os pontos para duplos.Em seguida, você "codificará" os resultados de seus três rolos para testar sua lógica de código.
Crie uma linha de código em branco acima da linha onde
total
é declarada e inicializada.Para testar um rolo de duplas, digite o seguinte código:
roll1 = 6; roll2 = 6; roll3 = 5;
A codificação rígida das três
roll
variáveis permite que você teste o código sem ter que executar o aplicativo dezenas de vezes.No menu Arquivo de código do Visual Studio, clique em Salvar.
No painel 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 deve incluir um prompt de comando mostrando que o Terminal está aberto para o local da pasta TestProject.
No prompt de comando do Terminal, para executar o código, digite dotnet run e pressione Enter.
Quando o código é executado, você deve ver:
Dice roll: 6 + 6 + 5 = 17 You rolled doubles! +2 bonus to total! You win!
Para testar um rolo de triplos, atualize suas variáveis de rolo codificadas da seguinte maneira:
roll1 = 6; roll2 = 6; roll3 = 6;
No menu Arquivo de código do Visual Studio, clique em Salvar.
No painel 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 o código, digite dotnet run e pressione Enter.
Quando o código é executado, você deve ver:
Dice roll: 6 + 6 + 6 = 18 You rolled triples! +6 bonus to total! You win!
Use if, else e else if declarações para dar um prêmio em vez de uma mensagem ganha-perde
Para tornar o jogo mais divertido, você pode mudar o jogo de "ganhar ou perder" para atribuir prêmios fictícios para cada pontuação. Pode oferecer quatro prémios. No entanto, o jogador deve ganhar apenas um prémio:
- Se o jogador obtiver uma pontuação maior ou igual a 16, ganhará um carro novo.
- Se o jogador obtiver uma pontuação maior ou igual a 10, ganhará um computador portátil novo.
- Se o jogador obtiver uma pontuação igual a 7, ganhará uma viagem.
- Caso contrário, o jogador ganha um gatinho.
Modifique o código dos passos 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 revisar a construção atualizada
if-elseif-else
.As
if
instruções , ,else if
eelse
permitem que você crie várias condições exclusivas como expressões booleanas. Em outras palavras, quando você quer que apenas um resultado aconteça, mas você tem várias condições e resultados possíveis, use quantaselse if
declarações quiser. Se nenhuma dasif
instruções eelse if
se aplicar, o bloco de código finalelse
será executado. Oelse
é opcional, mas deve vir por último se você optar por incluí-lo.Use a técnica de codificação temporária das
roll
variáveis para testar cada mensagem.
Recapitulação
- A combinação de
if
instruções eelse
permite que você teste uma condição e, em seguida, execute um dos dois resultados. O bloco de código para o será executado quando a expressão booleana for , e o bloco de código para oif
será executado quando a expressão booleana forfalse
true
.else
- Você pode aninhar
if
instruções para restringir uma possível condição. No entanto, você deve considerar usar asif
instruções ,else if
eelse
em vez disso. - Use
else if
instruções para criar várias condições exclusivas. - Um
else
é opcional, mas deve sempre vir por último quando incluído.