Oefening: geneste beslissingslogica maken met if, else if en else
In de vorige les hebt u meerdere if instructies gebruikt om de regels van een spel te implementeren. Aan het einde van de les hebt u echter gemerkt dat er meer expressieve if instructies nodig zijn om een subtiele fout in uw code op te lossen.
In deze oefening gebruikt ifu , elseen else if instructies om de vertakkingsopties in uw code te verbeteren en een logicafout op te lossen.
Gebruik if- en else-instructies in plaats van twee afzonderlijke if-instructies
In plaats van twee controles uit te voeren om het bericht 'U wint!' of 'Sorry, u verliest' weer te geven, gebruikt u het else trefwoord.
Zorg ervoor dat uw Program.cs code overeenkomt met het volgende:
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."); }Dit is de code die u in de vorige les hebt voltooid.
Neem even de tijd om de twee
ifinstructies aan het einde van het bestand te bekijken:if (total >= 15) { Console.WriteLine("You win!"); } if (total < 15) { Console.WriteLine("Sorry, you lose."); }U ziet dat beide
ifinstructies vergelijkentotalmet dezelfde numerieke waarde. Dit is de perfecte gelegenheid om eenelseverklaring te gebruiken.Werk de twee
ifinstructies als volgt bij:if (total >= 15) { Console.WriteLine("You win!"); } else { Console.WriteLine("Sorry, you lose."); }total >= 15Als dit onwaar is, wordt het codeblok na hetelsetrefwoord uitgevoerd. Omdat de twee resultaten gerelateerde tegengestelden zijn, is dit een perfect scenario voor hetelsetrefwoord.Het bijgewerkte Program.cs-bestand moet de volgende code bevatten:
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."); }
Wijzig de code om de stapelbonus te verwijderen voor doubles en triples met behulp van nesting
In de vorige les hebt u gezien dat er een subtiele logische fout is geïntroduceerd in uw toepassing. U kunt dit probleem oplossen door uw if instructies te nesten.
Met nesten kunt u codeblokken in codeblokken plaatsen. In dit geval nest je een if en else combinatie (het controleren op doubles) binnen een andere if instructie (de controle op drie keer) om te voorkomen dat beide bonussen worden toegekend.
Pas uw code aan zodat deze overeenkomt met het volgende code-uittreksel:
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."); }Neem even de tijd om de geneste
ifinstructies te bekijken.Het doel is om een binnenste
if-elseconstructie te creëren waarbij de twee resultaten gerelateerde tegengestelde tegengestelde resultaten zijn en vervolgens de tegengestelde resultaten (indien/waar en anders/onwaar) gebruiken om de bonuspunten voor drievoudige en dubbele punten toe te kennen. Om dit doel te bereiken, controleert u op doubles in de buitensteifinstructie en vervolgens op drie keer in de binnensteifinstructie. Dit patroon zorgt ervoor dat wanneer de binnenste controle op triples retourneertfalse, uwelsecodeblok de punten voor doubles kan toekennen.U gaat nu de resultaten van uw drie worpen 'hard code' gebruiken om uw codelogica te testen.
Maak een lege coderegel boven de regel waar
totalwordt gedeclareerd en geïnitialiseerd.Voer de volgende code in om te testen op een roll of doubles:
roll1 = 6; roll2 = 6; roll3 = 5;Met hard coderen van de drie
rollvariabelen kunt u de code testen zonder de toepassing tientallen keren uit te voeren.Klik in het menu Visual Studio Code File op Opslaan.
Als u in de EXPLORER-weergave een Terminal wilt openen op de locatie van de map TestProject, klikt u met de rechtermuisknop op TestProject en selecteert u Openen in geïntegreerde terminal.
Er moet een terminalvenster worden geopend en moet een opdrachtprompt bevatten die laat zien dat de Terminal is geopend voor de locatie van de testproject-map.
Typ dotnet-run bij de Terminal-opdrachtprompt en druk op Enter om uw code uit te voeren.
Wanneer uw code wordt uitgevoerd, ziet u het volgende:
Dice roll: 6 + 6 + 5 = 17 You rolled doubles! +2 bonus to total! You win!Als u wilt testen op een roll of triples, werkt u de vaste roll variables als volgt bij:
roll1 = 6; roll2 = 6; roll3 = 6;Klik in het menu Visual Studio Code File op Opslaan.
Als u in de EXPLORER-weergave een Terminal wilt openen op de locatie van de map TestProject, klikt u met de rechtermuisknop op TestProject en selecteert u Openen in geïntegreerde terminal.
Typ dotnet-run bij de Terminal-opdrachtprompt en druk op Enter om uw code uit te voeren.
Wanneer uw code wordt uitgevoerd, ziet u het volgende:
Dice roll: 6 + 6 + 6 = 18 You rolled triples! +6 bonus to total! You win!
Gebruik if,else, and else if statements to give a prize in plaats van a win-lose message
Om het spel leuker te maken, kunt u het spel wijzigen van "win-or-lose" tot het toekennen van fictieve prijzen voor elke score. U kunt vier prijzen aanbieden. De speler mag echter slechts één prijs winnen:
- Als de speler hoger dan of precies 16 gooit, wint hij of zij een nieuwe auto.
- Als de speler hoger dan of precies 10 gooit, wint hij of zij een nieuwe laptop.
- Als de speler precies 7 gooit, wint hij of zij een reis.
- In alle andere gevallen wint de speler een kitten.
Pas de code uit de vorige stap aan zodat deze overeenkomt met de volgende codevermelding:
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!"); }Neem even de tijd om de bijgewerkte
if-elseif-elseconstructie te bekijken.Met de
ifinstructies ,else ifenelseinstructies kunt u meerdere exclusieve voorwaarden maken als Boole-expressies. Met andere woorden, als u maar één resultaat wilt, maar u meerdere mogelijke voorwaarden en resultaten hebt, gebruikt u zoveelelse ifinstructies als u wilt. Als geen van deifenelse ifinstructies van toepassing is, wordt het uiteindelijkeelsecodeblok uitgevoerd. Hetelseis optioneel, maar het moet als laatste komen als u ervoor kiest om het op te nemen.Gebruik de techniek van het tijdelijk hard coderen van de
rollvariabelen om elk bericht te testen.
Samenvatting
- Met de combinatie van
ifenelseinstructies kunt u één voorwaarde testen en vervolgens een van de twee resultaten uitvoeren. Het codeblok voor deifexpressie wordt uitgevoerd wanneer de Boole-expressie istrueen het codeblok voor deelseexpressie wordt uitgevoerd wanneer de Boole-expressie isfalse. - U kunt instructies nesten
ifom een mogelijke voorwaarde te beperken. U moet echter overwegen om in plaats daarvan deif,else ifenelseinstructies te gebruiken. - Gebruik
else ifinstructies om meerdere exclusieve voorwaarden te maken. - Een
elseis optioneel, maar deze moet altijd als laatste komen wanneer deze is opgenomen.