Cvičení – vytvoření vnořené rozhodovací logiky s if, else if a else
V předchozí lekci jste použili více if příkazů k implementaci pravidel hry. Na konci lekce jste si ale všimli, že k opravě drobné chyby v kódu jsou potřeba výraznější if příkazy.
V tomto cvičení použijete ifa elseelse if příkazy ke zlepšení možností větvení v kódu a opravě chyby logiky.
Použití příkazů if a else místo dvou samostatných příkazů if
Místo provedení dvou kontrol zobrazíte zprávu "Vyhrát!" nebo "Je nám líto", použijete else klíčové slovo.
Ujistěte se, že kód Program.cs odpovídá následujícímu:
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."); }Toto je kód, který jste dokončili v předchozí lekci.
Prozkoumejte dva
ifpříkazy na konci souboru za minutu:if (total >= 15) { Console.WriteLine("You win!"); } if (total < 15) { Console.WriteLine("Sorry, you lose."); }Všimněte si, že oba
ifpříkazy se porovnávajítotalse stejnou číselnou hodnotou. Toto je ideální příležitost k použitíelsepříkazu.Aktualizujte tyto dva
ifpříkazy následujícím způsobem:if (total >= 15) { Console.WriteLine("You win!"); } else { Console.WriteLine("Sorry, you lose."); }Pokud je false,
total >= 15pak se spustí blok kódu za klíčovým slovemelse. Vzhledem k tomu, že tyto dva výsledky jsou související opaky, je to ideální scénář proelseklíčové slovo.Aktualizovaný soubor Program.cs by měl obsahovat následující kód:
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."); }
Úprava kódu tak, aby odebral bonus pro skládání dvojitých a trojitých hodnot pomocí vnoření
V předchozí lekci jste viděli, že do vaší aplikace byla zavedena malá chyba logiky. Tento problém můžete vyřešit vnořením if příkazů.
Vnoření umožňuje umístit bloky kódu uvnitř bloků kódu. V takovém případě vnořete do if jiného else příkazu (kontrola trojitých hodnot) a if vnořete kombinaci (kontrola trojitých hodnot), abyste zabránili udělení obou bonusů.
Kód upravte tak, aby odpovídal následujícímu zápisu:
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."); }Projděte si vnořené
ifpříkazy za minutu.Cílem je vytvořit vnitřní
if-elsekonstruktor, ve kterém jsou dva výsledky související opaky, a pak použít protichůdné výsledky (if/true a else/false) k udělení bonusových bodů za trojité a dvojité hodnoty. Chcete-li tohoto cíle dosáhnout, zkontrolujte, zda se ve vnějšímifpříkazu zdvojnásobí, a pak v vnitřnímifpříkazu vyhledáte trojité výrazy. Tento vzor zajišťuje, že když vnitřní kontrola trojitých bodů vrátífalse, vášelseblok kódu může udělit body za dvojité hodnoty.Chystáte se "pevně kódovat" výsledky tří hodů, abyste mohli otestovat logiku kódu.
Vytvořte prázdný řádek kódu nad řádkem, kde
totalje deklarován a inicializován.Pokud chcete testovat uvedení dvojitých poklikání, zadejte následující kód:
roll1 = 6; roll2 = 6; roll3 = 5;Pevné kódování těchto tří
rollproměnných umožňuje testovat kód, aniž byste museli aplikaci spouštět desítkykrát.V nabídce Soubor editoru Visual Studio Code klepněte na tlačítko Uložit.
Chcete-li v zobrazení PRŮZKUMNÍKa otevřít terminál v umístění složky TestProject, klepněte pravým tlačítkem myši na TestProject a pak vyberte Otevřít v integrovaném terminálu.
Měl by se otevřít panel terminálu a měl by obsahovat příkazový řádek zobrazující, že terminál je otevřený v umístění složky TestProject.
Na příkazovém řádku terminálu spusťte kód zadáním příkazu dotnet run a stiskněte Enter.
Při spuštění kódu byste měli vidět:
Dice roll: 6 + 6 + 5 = 17 You rolled doubles! +2 bonus to total! You win!Pokud chcete otestovat uvedení trojitých hodnot, aktualizujte pevně zakódované proměnné takto:
roll1 = 6; roll2 = 6; roll3 = 6;V nabídce Soubor editoru Visual Studio Code klepněte na tlačítko Uložit.
Chcete-li v zobrazení PRŮZKUMNÍKa otevřít terminál v umístění složky TestProject, klepněte pravým tlačítkem myši na TestProject a pak vyberte Otevřít v integrovaném terminálu.
Na příkazovém řádku terminálu spusťte kód zadáním příkazu dotnet run a stiskněte Enter.
Při spuštění kódu byste měli vidět:
Dice roll: 6 + 6 + 6 = 18 You rolled triples! +6 bonus to total! You win!
Použijte příkaz if, else a else if k poskytnutí výhry místo zprávy o ztrátě výhry.
Aby hra byla zábavnější, můžete hru změnit z "win-or-lose" na ocenění fiktivních cen pro každé skóre. Můžete nabídnout čtyři ceny. Hráč by však měl vyhrát pouze jednu cenu:
- Pokud hráč dosáhne skóre 16 nebo vyšší, vyhraje nové auto.
- Pokud hráč dosáhne skóre 10 nebo vyšší, vyhraje nový laptop.
- Pokud hráč dosáhne skóre přesně 7, vyhraje zájezd.
- Jinak hráč vyhraje kotě.
Kód, který jste napsali v předchozích krocích, upravte na následující zápis:
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!"); }Zkontrolujte aktualizovaný
if-elseif-elsekonstruktor za minutu.Příkazy
if,else ifaelsepříkazy umožňují vytvořit více exkluzivních podmínek jako logické výrazy. Jinými slovy, pokud chcete, aby se stalo jen jeden výsledek, ale máte několik možných podmínek a výsledků, použijte libovolný početelse ifpříkazů. Pokud se žádný zifpříkazů nepoužijeelse if, provede se konečnýelseblok kódu. Tatoelsemožnost je nepovinná, ale pokud se rozhodnete ji zahrnout, musí být poslední.Pomocí techniky dočasného pevného kódování
rollproměnných otestujte každou zprávu.
Rekapitulace
- Kombinace
ifpříkazůelsea příkazů umožňuje testovat jednu podmínku a pak provést jeden ze dvou výsledků. Blok kódu pro objektifse spustí, když jetruelogický výraz , a blok kódu pro objektelsese spustí, když jefalselogický výraz . - Příkazy můžete vnořit
ifa zúžit tak možnou podmínku. Měli byste však zvážit použitíifpříkazu ,else ifaelsemísto toho. - Příkazy použijte
else ifk vytvoření několika exkluzivních podmínek. - Je
elsenepovinná, ale při zahrnutí musí být vždy poslední.