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, elsee else if instruções para melhorar as opções de ramificação em seu código e 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 do seu 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."); }Este é o código que você completou na unidade anterior.
Reserve um minuto para examinar as duas
ifdeclarações no final do arquivo:if (total >= 15) { Console.WriteLine("You win!"); } if (total < 15) { Console.WriteLine("Sorry, you lose."); }Observe que ambas as
ifinstruções se comparamtotalcom o mesmo valor numérico. Esta é a oportunidade perfeita para usar umaelsedeclaração.Atualize as duas
ifinstruções da seguinte forma:if (total >= 15) { Console.WriteLine("You win!"); } else { Console.WriteLine("Sorry, you lose."); }Aqui, se
total >= 15for false, o bloco de código que segue aelsepalavra-chave será executado. Uma vez que os dois resultados são opostos relacionados, este é um cenário perfeito para aelsepalavra-chave.Seu arquivo de 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."); }
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 ( else o cheque para duplas) dentro de outra if declaração (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-elseonde 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 externaife, em seguida, triplos na declaração internaif. Esse padrão garante que, quando a verificação interna para triplos retornarfalse, seuelsebloco 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
rollvariá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.
Na vista EXPLORER, para abrir um Terminal na localização da pasta TestProject, clique com o botão direito do rato em TestProject e, em seguida, 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.
Na vista EXPLORER, para abrir um Terminal na localização da pasta TestProject, clique com o botão direito do rato em TestProject e, em seguida, 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
ifinstruções ,else if, eelsepermitem 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 ifdeclarações quiser. Se nenhuma dasifinstruções eelse ifse aplicar, o bloco de código finalelseserá executado. Oelseé opcional, mas deve vir por último se você optar por incluí-lo.Use a técnica de codificação temporária das
rollvariáveis para testar cada mensagem.
Recapitulação
- A combinação de
ifinstruções eelsepermite que você teste uma condição e, em seguida, execute um dos dois resultados. O bloco de código para oifserá executado quando a expressão booleana fortrue, e o bloco de código para oelseserá executado quando a expressão booleana forfalse. - Você pode aninhar
ifinstruções para restringir uma possível condição. No entanto, você deve considerar usar asifinstruções ,else ifeelseem vez disso. - Use
else ifinstruções para criar várias condições exclusivas. - Um
elseé opcional, mas deve sempre vir por último quando incluído.