← Přehled všech hodin

Podmínky a pravidla hry

Cíl hodiny: Děti umí napsat program, který se sám rozhodne, co udělá — podle hodnoty proměnné, podle vstupu od hráče, podle několika podmínek najednou.
Jak stránku používat: vpravo nahoře je tlačítko Prezentace — schová všechno kromě jednoho bloku a přepíná se šipkami. U ukázek a cvičení je kód vlevo editovatelný: uprav ho a klikni na Spustit (nebo Ctrl+Enter). Program se přeloží a spustí přímo v prohlížeči a vpravo se objeví to, co vypsal do konzole. Nic se neinstaluje.
Na co navazujeme: Podmínka je první místo, kde program přestává být kalkulačka a začíná být hra.

1. Vysvětlení a souvislosti

Poznámky pro učiteleJak celou hodinu vést1. Vysvětlení a souvislosti

Tenhle blok je jen pro vás — dětem ho nepromítejte.

Fáze Co se děje Čas
Rozjezd Kontrola domácího úkolu, „komu program spadl a proč?" 10 min
První if Bloky Program se musí rozhodnout a Porovnáváme 25 min
Větve else, else if, pořadí podmínek, semafor zdraví 30 min
Spojky &&, ||, ! a tabulka pravdivosti na prstech 20 min
switch Rozcestník a moderní switch expression 15 min
Ukázky Demo 1–5, hlavně demo 5 (křižovatka v jeskyni) 15 min
Cvičení Děti pracují samy, vy obcházíte 45 min
Závěr Kdo chce, ukáže svoje rozhodování 5 min
Hlavní pedagogický cíl

Dnešek stojí a padá na jediném uvědomění: podmínka se ptá, ne přiřazuje. zivoty = 0 nastaví životy na nulu. zivoty == 0 se zeptá, jestli jsou nulové. Jedno rovnítko versus dvě. Tohle rozliší dobrého programátora od zoufalce a dnes je na to ten správný den.

Druhý cíl: pořadí podmínek má význam. Když se nejdřív zeptáš „je to víc než 0?", už se nikdy nedozvíš, jestli to není víc než 50. Nechte je na to narazit vlastní chybou — je to nezapomenutelné.

Tři věci, které dnes NEVYSVĚTLUJTE
  1. Ternární operátor ? :. Je lákavý a krátký, ale děti si ho pletou s podmínkou a přestanou psát čitelný kód. Nechte si ho na později.
  2. switch s when, vzory a rozsahy. Ukážeme jen switch podle hodnoty a jednoduchý switch výraz. Pattern matching přijde za pár hodin.
  3. Zkrácené vyhodnocování (&& nevyhodnotí pravou stranu). Je to pravda a je to důležité, ale dneska by to jen mátlo. Stačí „obě musí platit".

Jak pracovat se smíšenou úrovní. Každé cvičení má tři stupně: Minimum, Rozšíření, Výzva. Slabším stačí Minimum — tedy jeden if a jeden else. Rychlíkům dávejte Výzvu s switch výrazem, ta je baví, protože vypadá „profi".

Blok 1Program se musí umět rozhodnout1. Vysvětlení a souvislosti

Doteď program dělal pořád to samé — řádek po řádku, shora dolů. Od téhle chvíle se umí rozhodnout: když něco platí, udělá jednu věc, když ne, udělá jinou (nebo nic).

Kulatá závorka za if obsahuje otázku, na kterou jde odpovědět ano/ne — tedy bool. Když vyjde true, spustí se blok ve složených závorkách. Když false, celý se přeskočí.

Zkus změnit 12 na 80 a spusť znovu. Varování zmizí, protože 80 < 20 je nepravda.

Řádek s výpisem životů je mimo složené závorky, takže se vypíše vždycky.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Složené závorky nejsou povinné, ale piš je

C# dovolí napsat if (zivoty < 20) Console.WriteLine("..."); bez závorek. Nedělej to. Jakmile přidáš druhý řádek, program se začne chovat jinak, než čekáš — a hledá se to hodiny. Vždycky složené závorky.

Blok 2Porovnáváme: šest otázek, na které jde odpovědět ano/ne1. Vysvětlení a souvislosti

Uvnitř if se skoro vždycky něco porovnává. Operátorů je přesně šest:

Operátor Čte se Příklad Výsledek
== rovná se zivoty == 0 true, když jsou životy nula
!= nerovná se jmeno != "" true, když jméno není prázdné
> je větší než utok > obrana true, když útok přebije obranu
< je menší než zlato < cena true, když nemáš dost peněz
>= je větší nebo rovno uroven >= 10 true i při přesně desítce
<= je menší nebo rovno zivoty <= 0 true při nule i při minusu

Všimni si, že porovnání se dá uložit do proměnné. Není na tom nic kouzelného — utok > obrana je prostě hodnota typu bool, stejně jako 14 je hodnota typu int.

Díky tomu se dá napsat if (probil) a kód se čte skoro jako věta. To je nejlepší způsob, jak udělat podmínky srozumitelné.

Zkus nastavit obě čísla na stejnou hodnotu a podívej se, co se stane.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Jedno rovnítko versus dvě

= znamená ulož do. == znamená je rovno?

Když napíšeš if (zivoty = 0), C# tě naštěstí zastaví chybou CS0029, protože int není bool. U proměnné typu bool tě ale nezastaví nic a program bude tiše dělat blbosti. Hlídej si to.

Blok 3else a else if: kolik má hra konců1. Vysvětlení a souvislosti

Samotný if umí jen „udělej, nebo neudělej nic". Pomocí else přidáš druhou možnost a pomocí else if klidně pátou.

Program jde shora dolů a zastaví se u první podmínky, která platí. Zbytek už ani nečte. Proto je pořadí tak důležité.

else na konci nemá závorku s otázkou — je to „ve všech ostatních případech". Nemusí tam být, ale bez něj může nastat situace, kdy se nevypíše nic.

Zkus postupně 0, 10, 50 a 100 a sleduj, která větev se chytí.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Pozor na pořadí!

Kdyby byla první podmínka zivoty < 70, chytila by úplně všechno pod sedmdesát — i nulu, i deset. Zprávu o smrti bys nikdy neviděl.

Pravidlo: řaď podmínky od nejpřísnější po nejvolnější. Nejdřív <= 0, pak < 30, pak < 70, pak zbytek.

Blok 4Spojky: && , || a !1. Vysvětlení a souvislosti

Často potřebuješ víc podmínek najednou. Na to jsou tři spojky:

Zápis Čte se Platí, když
a && b a zároveň b platí obě
a || b a nebo b platí aspoň jedna
!a ne a a neplatí

&& je přísné — stačí jedno false a je konec. || je velkorysé — stačí jedno true a platí. ! prostě otočí odpověď naruby.

Na prstech: && jsou dvě ruce (musíš mít obě), || je dvojí cesta (stačí jedna).

Zkus přehodit maKlic na false a sleduj, jak se změní všechny tři řádky.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Závorky nestojí nic

a || b && c se vyhodnotí jako a || (b && c), protože && má přednost. Je to matoucí. Když si nejsi jistý, napiš závorky — zdarma získáš jistotu a kód se dá číst.

Blok 5switch: rozcestník podle jedné hodnoty1. Vysvětlení a souvislosti

Když se pořád dokola ptáš na tu samou proměnnou (povolani == "mag", povolani == "valecnik", …), je čitelnější použít switch.

demo/vyklad1_switch.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.

Každá větev musí končit break, jinak C# ohlásí chybu CS0163. default je „ve všech ostatních případech" — stejná role jako else.

Kdy switch a kdy if

switch použij, když se ptáš na jednu proměnnou a její konkrétní hodnoty. if použij, když porovnáváš rozsahy (zivoty < 30) nebo kombinuješ podmínky. Rozsahy do klasického switch nepatří.

Blok 6switch expression: moderní a krátký zápis1. Vysvětlení a souvislosti

Když z rozhodnutí potřebuješ jen hodnotu, jde to napsat mnohem stručněji. Tenhle zápis se jmenuje switch výraz a v modernim C# se používá pořád.

demo/vyklad2_switch_vyraz.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.

Rozdíly proti klasickému switch: proměnná je před slovem switch, místo case se píše =>, místo default je podtržítko _ a celý výraz končí středníkem, protože vrací hodnotu.

Co si zapamatovat

Klasický switch dělá (vypisuje, počítá, volá). switch výraz vrací jednu hodnotu, kterou si uložíš do proměnné. Obojí je správně — vyber si podle toho, co potřebuješ.

Blok 7Všechno dohromady: brána do jeskyně1. Vysvětlení a souvislosti
demo/vyklad3_brana.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Program čte z konzole. Co sem napíšeš, to „odpoví" na každé Console.ReadLine() — jeden řádek na jedno čtení.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.

Tohle je celá dnešní hodina v jednom programu: zeptat se, převést odpověď na bool, zkombinovat spojkami a rozhodnout. Zkus do políčka stdin napsat ne a 0 a podívej se, jak hra dopadne.

Poznámky pro učiteleTechnické pozadí — jen pro vás1. Vysvětlení a souvislosti

Tohle dětem neříkejte, ale hodí se to vědět, až se někdo zeptá.

Proč if potřebuje bool a ne číslo. V C i v C++ platí, že nenulové číslo je „pravda". C# to zakázal schválně — právě proto, aby if (x = 5) neprošlo. Chyba CS0029 („nelze převést int na bool") je tedy vlastnost, ne buzerace. Když se dítě zeptá „proč to Python dovolí a C# ne?", tohle je odpověď.

&& versus &. Obě verze existují. && je zkrácené — když levá strana neplatí, pravá se vůbec nevyhodnotí. & vyhodnotí obě vždycky. V praxi se používá && a ||; jednoduché & a | potkají děti až u bitových operací. Dneska o tom mlčte, ale kdyby někdo napsal & a fungovalo mu to, víte proč.

Proč switch vyžaduje break. V C a Javě se větve „propadají" do sebe, což je nekonečný zdroj chyb. C# propadnutí zakázal a vynucuje explicitní konec větve. Výjimka: dva case bezprostředně za sebou bez kódu mezi nimi sdílet můžou (case "mag": case "carodej":).

switch výraz je od C# 8 (rok 2019). Podtržítko _ se jmenuje discard pattern. Kompilátor kontroluje, že jsou pokryté všechny možnosti — když nejsou a hodnota neodpovídá ničemu, program spadne na SwitchExpressionException. Proto _ skoro vždycky pište.

Časté nedorozumění: if (a == b == c) v C# nefunguje tak, jak děti čekají, a naštěstí většinou ani nezkompiluje. Řetězení porovnání zná Python, C# ne — tam se to musí napsat jako a == b && b == c.

Odbočka pro zvídavé: hodnotu bool zabírá v paměti celý bajt, i když by teoreticky stačil jeden bit. Důvod je rychlost — procesor pracuje s bajty.

2. Ukázky

Jak ukázky používat: každou promítněte, spusťte a pak před dětmi něco změňte. Kód jde upravovat i spouštět přímo tady v prohlížeči. U ukázek se vstupem piš odpovědi do políčka stdin pod kódem.
Blok 8Ukázka 1 — Semafor zdraví2. Ukázky
Studenti zkuste změnit
  • Přepiš zivoty na 0, 25, 69 a 70 a sleduj, která věta se vypíše.
  • Prohoď první a poslední podmínku a vysvětli, co se pokazilo.
  • Přidej pátou úroveň „lehce škrábnutý" mezi 70 a 90.
  • Změň < na <= u hranice 30 a najdi hodnotu, kde je rozdíl vidět.
demo/demo1_semafor.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.

Co si z toho odnést: program se zastaví u první podmínky, která platí. Proto se řadí od nejpřísnější po nejvolnější.

Blok 9Ukázka 2 — Pruh života, který mění barvu2. Ukázky
Studenti zkuste změnit
  • Nastav zivoty tak, aby se pruh složil jen ze dvou plných dílků.
  • Vyměň znaky '█' a '░' za jiné, třeba '#' a '.'.
  • Přidej řádek, který se vypíše, jen když je život přesně na maximu.
  • Změň DILKU na 10 a zkontroluj, že pruh pořád sedí.
demo/demo2_pruh.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.

Co si z toho odnést: podmínka nemusí hned vypisovat. Může jen nastavit proměnnou, kterou vypíšeš až potom. Kód je díky tomu mnohem přehlednější.

Blok 10Ukázka 3 — Souboj na jedno kolo2. Ukázky
Studenti zkuste změnit
  • Nastav obě čísla na stejnou hodnotu a najdi větev s remízou.
  • Změň bonus za štít z 3 na 10 a sleduj, kdo teď vyhrává.
  • Přidej bool kritickyZasah = utok > obrana * 2; a vypiš hlášku.
  • Prohoď role — ať útočí příšera a hrdina se brání.
demo/demo3_souboj.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.

Co si z toho odnést: if bez else se hodí, když chceš jen něco přidat za určité podmínky — tady bonus za štít.

Blok 11Ukázka 4 — Povolání dvěma způsoby2. Ukázky
Studenti zkuste změnit
  • Přepiš povolani na "mag" a pak na "kuchar" a porovnej oba výpisy.
  • Přidej do obou variant povolání "zlodej" s vlastními hodnotami.
  • Smaž break u jedné větve a přečti si chybu.
  • Smaž řádek s _ ve výrazu a podívej se, co kompilátor řekne.
demo/demo4_povolani.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.

Co si z toho odnést: klasický switch dělá, switch výraz vrací. Tři výrazy pod sebou nahradily devět ifů — a pořád se to dá číst.

Blok 12Ukázka 5 — Křižovatka v jeskyni2. Ukázky
Studenti zkuste změnit
  • Do stdin napiš vlevo, vpravo, rovne a doprdele a porovnej konce.
  • Zkus zadat VLEVO velkými písmeny — funguje to? A proč?
  • Změň počet pochodní na 0 a sleduj, které cesty se zavřou.
  • Přidej čtvrtou cestu "zpet" s vlastním koncem.
demo/demo5_krizovatka.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Program čte z konzole. Co sem napíšeš, to „odpoví" na každé Console.ReadLine() — jeden řádek na jedno čtení.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.

Co si z toho odnést: tohle je celá hodina v jednom programu — vstup, převod na bool, switch výraz pro popis a if/else if pro rozhodnutí. A hlavně: první podmínka je „nemáš světlo", protože bez něj je zbytek jedno.

Blok 13Když se něco pokazí2. Ukázky

Podmínky mají svoje typické chyby. Většina z nich se dá poznat podle hlášky.

Hláška / projev Co to znamená Jak to spravit
CS0029: Cannot implicitly convert type 'int' to 'bool' v if je přiřazení místo porovnání napiš == místo =
CS0029: Cannot implicitly convert type 'string' to 'bool' v if je text místo otázky porovnej: if (odpoved == "ano")
CS0163: Control cannot fall through from one case label to another chybí break na konci větve switch přidej break; do každé větve
CS0152: The switch statement contains multiple cases with the label value dvakrát stejný case smaž duplicitní větev
CS8509: The switch expression does not handle all possible values ve switch výrazu chybí _ přidej větev _ => ...
CS1525: Invalid expression term 'else' else bez předchozího if, nebo středník za if (...) zkontroluj složené závorky a přebytečný ;
CS0136 / CS0128 dvě proměnné stejného jména (často z out) přejmenuj jednu z nich
Vypíše se špatná větev podmínky jsou ve špatném pořadí seřaď od nejpřísnější po nejvolnější
Nevypíše se nic žádná podmínka neplatí a chybí else přidej else jako záchrannou síť
if (odpoved == "Ano") nefunguje porovnání textu rozlišuje velikost písmen uprav vstup přes .ToLower()
Program porovnává "10" > "9" divně porovnáváš texty, ne čísla nejdřív převeď přes int.TryParse
Jak s tabulkou pracovat

Nechte ji promítnutou celou dobu cvičení. Dnešní chyby jsou hodně „tiché" — kód se přeloží a běží, jen dělá něco jiného. Poslední čtyři řádky tabulky proto nemají kód chyby, ale popis projevu.

Nejčastější dnešní zážitek: „mně to vypisuje pořád to samé!" V devíti z deseti případů je to pořadí podmínek. Ptejte se: „která podmínka to chytla dřív?"

3. Cvičení

Jak cvičení používat: zadání promítněte. Části Pro učitele a Řešení jsou schované — rozbalí se až kliknutím, takže je můžete mít otevřené a děti je neuvidí, dokud nechcete. Odpovědi pro program piš do políčka stdin pod kódem, každou na samostatný řádek.
Blok 14Cvičení 1 — Semafor zdraví (15 min)3. Cvičení

Tvoje zadání:

Program se zeptá na počet životů a řekne hráči, jak na tom je.

  1. Načti životy z klávesnice bezpečně přes TryParse
    💡 Poradit
    Otázku vypiš přes Console.Write a načti přes int.TryParse(Console.ReadLine(), out int zivoty);.
    Když hráč napíše nesmysl, zůstane v proměnné nula — a to je pro dnešek v pořádku.
  2. Přidej první podmínku: životy nula nebo míň znamenají konec
    💡 Poradit
    Nejpřísnější podmínka patří nahoru: if (zivoty <= 0).
    Do složených závorek dej výpis o tom, že hrdina padl.
  3. Přidej větev pro kriticky raněného (méně než 30 životů)
    💡 Poradit
    Druhá větev se píše jako else if (zivoty < 30) hned za uzavírací závorku první větve.
    Pozor na pořadí — tahle podmínka musí být až za nulou.
  4. Dodělej zbylé větve a else na konci
    💡 Poradit
    Přidej ještě else if (zivoty < 70) a pak samotné else bez závorky s otázkou.
    else je záchranná síť — chytne všechno, co neplatilo dřív.
  5. Přidej pruh života a rámeček
    💡 Poradit
    Dílky spočítej jako zivoty * DILKU / MAX_ZIVOTY — nejdřív násob, pak děl.
    Pruh složíš z new string('█', dilky) + new string('░', DILKU - dilky).
Úroveň Co má zvládnout
Minimum Body 1–3 fungují a program pozná mrtvého i kriticky raněného
Rozšíření Všechny čtyři větve včetně else
Výzva Přidat pruh a hlášku „lektvar doporučen" jako samostatný if bez else
cviceni/cviceni1_semafor.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Program čte z konzole. Co sem napíšeš, to „odpoví" na každé Console.ReadLine() — jeden řádek na jedno čtení.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Pro učitele — na co si dát pozor

Očekávaný výsledek: se vstupem 45 se vypíše pruh z devíti plných dílků, hláška „Zraněný, ale pořád bojeschopný." a doporučení lektvaru.

Kde se zaseknou:

  • Špatné pořadí podmínek. Kdo dá zivoty < 70 nahoru, nikdy neuvidí ani smrt, ani kritický stav. Tohle je nejdůležitější chyba dneška — nechte je na ni narazit a pak se ptejte, která podmínka to chytla dřív.
  • Středník za if (...). if (zivoty <= 0); se přeloží a nic nedělá. Kompilátor většinou jen varuje, takže je to zákeřné.
  • Samostatné if místo else if. Program pak vypíše dvě hlášky najednou. Krásná ukázka rozdílu — nechte to schválně spustit.
  • else if (zivoty < 30 && zivoty > 0). Není chyba, jen zbytečnost. Ukažte, že zivoty <= 0 bylo vyřešeno už první větví.
  • Záporné životy a pruh. new string('█', -2) skončí výjimkou. Ať to někdo zkusí a pak přemýšlí, jak to ohlídat.

Kdo je hotový dřív: ať přidá pátou úroveň nebo ať pruh zkrátí na nulu u záporných životů pomocí dalšího if.

Otázka na závěr cvičení: „Kolik větví se může vypsat naráz?" U if/else if právě jedna. U samostatných ifů klidně všechny.

Řešení 1 — jedna z možných variant
reseni/reseni1_semafor.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Program čte z konzole. Co sem napíšeš, to „odpoví" na každé Console.ReadLine() — jeden řádek na jedno čtení.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Blok 15Cvičení 2 — Vstup do jeskyně (20 min)3. Cvičení

Tvoje zadání:

Do jeskyně se dostane jen ten, kdo má klíč a zároveň světlo. Nauč program kombinovat podmínky.

  1. Zeptej se, jestli má hráč klíč, a odpověď převeď na bool
    💡 Poradit
    Načti text a hned ho uprav: string odpoved = Console.ReadLine().Trim().ToLower();.
    Pak porovnej: bool maKlic = odpoved == "ano";.
  2. Zeptej se na počet pochodní a udělej z něj bool maSvetlo
    💡 Poradit
    Číslo načti přes int.TryParse(Console.ReadLine(), out int pochodne);.
    Světlo máš, když je pochodní víc než nula: bool maSvetlo = pochodne > 0;.
  3. Pusť hráče dovnitř, jen když má obojí
    💡 Poradit
    Obě podmínky najednou spojíš přes &&: if (maKlic && maSvetlo).
    Jedno false stačí k tomu, aby celá podmínka neplatila.
  4. Dopiš zbylé tři možnosti přes else if a else
    💡 Poradit
    Použij vykřičník jako „ne": else if (maKlic && !maSvetlo).
    Poslední else chytne případ, kdy nemá ani klíč, ani světlo.
  5. Přidej zkratku pro toho, kdo má lano nebo hodně pochodní
    💡 Poradit
    Stačí jedna z věcí, takže použij ||: if (maLano || pochodne >= 5).
    Tenhle if dej jako samostatný, aby se mohl vypsat i k ostatním hláškám.
Úroveň Co má zvládnout
Minimum Body 1–3 fungují a program pozná, kdo má klíč i světlo
Rozšíření Všechny čtyři kombinace přes && a !
Výzva Zkratka přes logické NEBO plus přehledová tabulka stavu na konci
cviceni/cviceni2_jeskyne.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Program čte z konzole. Co sem napíšeš, to „odpoví" na každé Console.ReadLine() — jeden řádek na jedno čtení.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Pro učitele — na co si dát pozor

Očekávaný výsledek: se vstupem ano / 2 / ano se otevře brána a navíc se vypíše hláška o zkratce.

Nejlepší aktivita hodiny: projděte s třídou všechny čtyři kombinace klíč × světlo. Napište je na tabuli jako tabulku a nechte děti předpovědět, která větev se chytne. Teprve pak to spusťte.

Kde se zaseknou:

  • if (maKlic == true). Funguje, ale je to zbytečné. Ukažte, že if (maKlic) znamená totéž a čte se líp.
  • if (maKlic && maSvetlo == false) místo !maSvetlo. Taky funguje, jen je to delší. Vykřičník je hezčí.
  • if (odpoved == "Ano"). Nefunguje, protože porovnání rozlišuje velikost písmen. Proto je v zadání .ToLower().
  • & místo &&. Zkompiluje se a většinou i funguje. Nezdržujte se tím, jen řekněte „píšeme dvě".
  • Zkratka jako else if. Pak se nikdy nevypíše spolu s hlavní hláškou. Musí to být samostatný if — dobrá příležitost si rozdíl zopakovat.

Kdo je hotový dřív: ať přidá podmínku „bez klíče, ale s lanem se dá vlézt oknem" a vymyslí, kam v pořadí patří.

Otázka na závěr cvičení: „Kdy je a && b nepravda?" Když neplatí aspoň jedna. „A kdy je a || b nepravda?" Až když neplatí obě.

Řešení 2 — jedna z možných variant
reseni/reseni2_jeskyne.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Program čte z konzole. Co sem napíšeš, to „odpoví" na každé Console.ReadLine() — jeden řádek na jedno čtení.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Blok 16Cvičení 3 — Souboj na jedno kolo (20 min)3. Cvičení

Tvoje zadání:

Hrdina udeří, příšera se brání. Program spočítá, jak to dopadlo.

  1. Načti útok hrdiny z klávesnice
    💡 Poradit
    Otázku přes Console.Write, načtení přes int.TryParse(Console.ReadLine(), out int utok);.
    Když hráč zadá nesmysl, zůstane nula a program nespadne.
  2. Načti obranu příšery a spočítej poškození
    💡 Poradit
    Druhé TryParse s jiným názvem out proměnné.
    Poškození je prostý rozdíl: int poskozeni = utok - obrana;.
  3. Vypiš zásah, když je poškození kladné
    💡 Poradit
    Stačí jedna podmínka: if (poskozeni > 0).
    Do hlášky vlož hodnotu poškození přes interpolaci.
  4. Dodělej větve pro remízu a pro odraženou ránu
    💡 Poradit
    Remíza je else if (poskozeni == 0) — pozor, dvě rovnítka.
    Poslední else chytne záporné poškození.
  5. Přidej kritický zásah a přehled souboje
    💡 Poradit
    Kritický zásah pozná podmínka poskozeni >= obrana nebo poskozeni > 8 — vyber si.
    Přehled vypiš mezi dva řádky new string('═', 40).
Úroveň Co má zvládnout
Minimum Body 1–3 fungují a program pozná zásah
Rozšíření Všechny tři výsledky včetně remízy
Výzva Kritický zásah, bonus za štít a zbývající životy příšery
cviceni/cviceni3_souboj.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Program čte z konzole. Co sem napíšeš, to „odpoví" na každé Console.ReadLine() — jeden řádek na jedno čtení.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Pro učitele — na co si dát pozor

Očekávaný výsledek: se vstupem 17 / 12 je obrana se štítem 15, poškození 2, tedy obyčejný zásah a trollovi zbývá 38 životů.

Kde se zaseknou:

  • poskozeni = 0 místo poskozeni == 0. Nejtypičtější chyba dneška. V if naštěstí neprojde (CS0029), tak si toho hned všimnou.
  • Pořadí: > 0 před > 8. Pak se kritický zásah nikdy nevypíše. Ať to zkusí a opraví — je to stejná lekce jako v cvičení 1.
  • Zapomenutá ochrana proti zápornému poškození. Bez ní troll po odražené ráně „ozdraví". Pěkná ukázka, proč se hodnoty ořezávají.
  • if (maStit) bez else. Někdo hledá, kam dát else. Nikam — když štít není, obrana prostě zůstane, jak byla.

Kdo je hotový dřív: ať přidá protiútok příšery (další dvě čísla ze stdin) a rozhodne, kdo kolo vyhrál.

Otázka na závěr cvičení: „Proč jsme poškození ořízli na nulu místo toho, abychom prostě nic neodečetli?" Protože pak stačí jeden vzorec a podmínka je jen jedna. Méně větví = méně chyb.

Řešení 3 — jedna z možných variant
reseni/reseni3_souboj.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Program čte z konzole. Co sem napíšeš, to „odpoví" na každé Console.ReadLine() — jeden řádek na jedno čtení.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Blok 17Cvičení 4 — Výběr povolání (20 min)3. Cvičení

Tvoje zadání:

Hráč si vybere povolání a program mu k němu dopočítá všechno ostatní. Tady si vyzkoušíš oba druhy switch.

  1. Zeptej se na povolání a odpověď ukliď
    💡 Poradit
    Text načti a hned uprav: string povolani = Console.ReadLine().Trim().ToLower();.
    Díky ToLower() bude fungovat i MAG nebo Mag.
  2. Napiš klasický switch, který k povolání vypíše hlášku
    💡 Poradit
    Každá větev začíná case "mag": a končí break;.
    Na konci nezapomeň na default: pro neznámá povolání.
  3. Přidej switch výraz, který vrátí počet životů
    💡 Poradit
    Zápis je int zivoty = povolani switch { ... };.
    Uvnitř se píše "mag" => 70, a na konci _ => 50.
  4. Stejným způsobem dopočítej zbraň a značku
    💡 Poradit
    Další dva výrazy vypadají stejně, jen vracejí string a char.
    U char se hodnoty píšou v jednoduchých uvozovkách: 'M'.
  5. Vypiš kartu povolání v rámečku
    💡 Poradit
    Rámeček složíš z new string('═', 40) a sloupce srovnáš přes PadRight.
    Značku dej do hranatých závorek: $"[{znacka}] {povolani}".
Úroveň Co má zvládnout
Minimum Body 1–2 fungují a switch vypíše správnou hlášku
Rozšíření switch výraz pro životy a zbraň
Výzva Čtvrté povolání, dopočítaný útok a karta v rámečku
cviceni/cviceni4_povolani.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Program čte z konzole. Co sem napíšeš, to „odpoví" na každé Console.ReadLine() — jeden řádek na jedno čtení.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Pro učitele — na co si dát pozor

Očekávaný výsledek: se vstupem mag vyjde hláška o holi, životy 70, útok 22, značka M.

Kde se zaseknou:

  • Zapomenutý breakCS0163. Stane se skoro každému a je to dobře, protože hláška je srozumitelná.
  • Chybějící _ ve switch výrazuCS8509. Vysvětlete, že kompilátor chce jistotu, že je pokrytá každá možnost.
  • Středník za switch výrazem. Musí tam být, protože je to výraz, ne blok. U klasického switch naopak středník nepatří. Tohle je hlavní rozdíl, který si dneska mají zapamatovat.
  • Čárky mezi větvemi výrazu. Ve switch výrazu se odděluje čárkou, ne středníkem. Poslední čárka být může i nemusí.
  • case mag: bez uvozovek → chyba, protože mag není proměnná.

Kdo je hotový dřív: ať sloučí dvě povolání do jedné větve (case "mag": case "carodej":) nebo ať přidá switch výraz na popis osobnosti hrdiny.

Otázka na závěr cvičení: „Kdy použiješ klasický switch a kdy výraz?" Klasický, když se má něco udělat. Výraz, když se má něco vrátit.

Řešení 4 — jedna z možných variant
reseni/reseni4_povolani.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Program čte z konzole. Co sem napíšeš, to „odpoví" na každé Console.ReadLine() — jeden řádek na jedno čtení.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Blok 18Cvičení 5 — CsQuest: první rozhodnutí (25 min)3. Cvičení

Tvoje zadání:

Velké finále hodiny. Hráč si vytvoří postavu, vybere cestu a hra mu podle jeho rozhodnutí napíše, jak to dopadlo.

  1. Zeptej se na jméno a povolání a odpovědi ukliď
    💡 Poradit
    Jméno načti přes Console.ReadLine().Trim(), povolání navíc přes .ToLower().
    Díky tomu bude fungovat i MAG.
  2. Dopočítej switch výrazem životy, značku a zbraň
    💡 Poradit
    Zápis je int zivoty = povolani switch { "mag" => 70, ..., _ => 50 };.
    Tři výrazy pod sebou nahradí devět ifů.
  3. Zeptej se, kam hrdina půjde, a popiš cestu
    💡 Poradit
    Směr načti stejně jako povolání a popis vyrob dalším switch výrazem.
    Nezapomeň na větev _ => "slepá stěna".
  4. Zeptej se na pochodně a rozhodni, jak výprava dopadne
    💡 Poradit
    Číslo načti přes TryParse a udělej z něj bool maSvetlo = pochodne > 0;.
    První podmínka ať je if (!maSvetlo) — bez světla je zbytek jedno.
  5. Vypiš kartu hrdiny s pruhem života a koncem příběhu
    💡 Poradit
    Pruh spočítej jako zivoty * DILKU / MAX_ZIVOTY — nejdřív násob, pak děl.
    Rámeček složíš z '╔', '═' a '╗' nebo prostě z new string('═', SIRKA).
Úroveň Co má zvládnout
Minimum Body 1–3 fungují a program zná povolání i směr
Rozšíření Rozhodnutí podle světla a směru přes if/else if
Výzva Pruh života, přehled stavu a vlastní čtvrtá cesta
cviceni/cviceni5_rozhodnuti.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Program čte z konzole. Co sem napíšeš, to „odpoví" na každé Console.ReadLine() — jeden řádek na jedno čtení.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Pro učitele — na co si dát pozor

Očekávaný výsledek: se vstupem Elara / mag / vlevo / 2 vyjde karta mága se 70 životy, pruh z dvanácti plných dílků, cíl „podzemní jezero" a hláška o starém člunu.

Tohle je odměna za celou hodinu. Spojuje vstup (hodina 3), typy (hodina 2), switch výrazy i if/else if. Nechte na konci pár dětí promítnout jejich verzi — a hlavně ať si navzájem zadávají vstupy a hádají, jak to dopadne.

Kde se zaseknou:

  • Pořadí podmínek. if (!maSvetlo) musí být první. Kdo to dá jinam, pošle hrdinu do tmy a pak se diví.
  • Zapomenutý _ ve switch výrazuCS8509.
  • Porovnání znacka != '?'. Jednoduché uvozovky u char, dvojité u string. Snadno se to plete a hláška je CS0029.
  • PadRight a rámeček. Diakritika v některých terminálech rozhodí šířku. Není to jejich chyba, jen vlastnost terminálu.
  • Málo řádků ve stdin. Otázky jsou čtyři, takže odpovědi taky.

Když zbývá čas: ať přidají čtvrtou cestu, vlastní povolání a podmínku, která pustí dál jen hrdinu s dostatkem životů. Příští hodinu z toho udělají opravdovou hru s cyklem.

Řešení 5 — jedna z možných variant
reseni/reseni5_rozhodnuti.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Program čte z konzole. Co sem napíšeš, to „odpoví" na každé Console.ReadLine() — jeden řádek na jedno čtení.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.

4. Domácí úkol

Blok 19Domácí úkol na příští hodinu4. Domácí úkol

Rozšiř svůj CsQuest o pravidla. Program má:

  • zeptat se aspoň na tři věci a všechny odpovědi bezpečně zpracovat,
  • obsahovat aspoň jeden if / else if / else se třemi a více větvemi,
  • obsahovat aspoň jednu složenou podmínku s && nebo ||,
  • obsahovat aspoň jeden switch (klasický nebo výraz — nebo oba),
  • a vypsat dva různé konce příběhu podle toho, co hráč zadal.

Vyzkoušej program aspoň třikrát tak, aby pokaždé skončil jinak. Do komentáře napiš, které vstupy k jakému konci vedou.

Pro učitele

Nejcennější část úkolu je poslední odstavec. Dítě musí samo vymyslet vstupy, které dovedou program do konkrétní větve — a to je přesně dovednost testera.

Na začátku příští hodiny promítněte dva tři programy a nechte třídu hádat, jaké vstupy vedou ke kterému konci. Zabere to pět minut a zopakuje to celou hodinu.

Časté odevzdané chyby: špatné pořadí podmínek (nejvolnější nahoře), = místo ==, zapomenutý break, chybějící _ ve switch výrazu. Všechny jsou v tabulce Když se něco pokazí.

Kdo nemá doma .NET, může úkol udělat přímo tady v prohlížeči — vstupy napíše do políčka stdin a odevzdá snímek obrazovky.

Zobrazit ukázkové řešení domácího úkolu

Toto je jedna z možných variant, jak mohl úkol dopadnout. Tvoje řešení se může lišit a to je v pořádku.

domaci/domaci_ukol04.cs
Tady se objeví výstupKlikni na Spustit. Kód vlevo můžeš měnit a spouštět opakovaně klávesami Ctrl+Enter.
Program čte z konzole. Co sem napíšeš, to „odpoví" na každé Console.ReadLine() — jeden řádek na jedno čtení.
Kód vlevo jde upravovat. Tab odsazuje o čtyři mezery.
Blok 20Oficiální dokumentace4. Domácí úkol

Oficiální dokumentace je místo, kam se programátoři chodí podívat, když si chtějí něco ověřit nebo zjistit víc detailů. Je většinou v angličtině, ale to nevadí — zkus se orientovat podle názvu příkazu a podle ukázek kódu.

Co jsme použili Oficiální dokumentace Co tam najdeš
if, else Příkazy if a else základní tvar podmínky a vnořování
switch Příkaz switch větve, break, default, sdílené case
switch výraz Výraz switch moderní zápis s => a _
==, !=, <, > Porovnávací operátory co přesně porovnávají a co vrací
&&, ||, ! Logické operátory pravdivostní tabulky a zkrácené vyhodnocení
bool Typ bool jediné dvě možné hodnoty
Přednost operátorů Pořadí vyhodnocení proč se vyplatí psát závorky
String.ToLower String.ToLower porovnávání textu bez ohledu na velikost písmen
int.TryParse int.TryParse bezpečný převod z minulé hodiny
CS8509 Chyba CS8509 proč switch výraz chce větev _
Jak s dokumentací pracovat na hodině

Stránku o switch výrazu mějte otevřenou při výkladu — je na ní vedle sebe klasický switch i výraz, takže rozdíl je vidět na první pohled.

Ve VS Code najeďte myší na switch nebo na kód chyby v seznamu problémů a stejná nápověda se ukáže přímo v editoru. Naučte je ten pohyb myší.

5. Umíme informatiku

Blok 21Navazující cvičení na Umíme informatiku5. Umíme informatiku

Pro rychlejší studenty, kteří dokončí cvičení dřív, nebo na posledních 10–15 minut.

Cvičení Odkaz Proč se hodí
Programování — podmínky umimeinformatiku.cz Přesně dnešní téma, jen v jiném prostředí
Logika a výroky umimeinformatiku.cz „A zároveň" a „nebo" bez kódu — čistá logika
Programování — základy umimeinformatiku.cz Čtení kódu a předvídání, kterou větví program projde

Cvičení na podmínky je zde obzvlášť vhodné, protože trénuje tu nejtěžší dovednost dnešní hodiny — udržet v hlavě, která větev se chytne jako první.

Jak to zařadit

Nedávejte to celé třídě naráz. Použijte to jako záložní aktivitu pro tři až pět nejrychlejších dětí.

Dobrá alternativa pro rychlíky bez počítače: napište na tabuli zivoty = 25 a pod to čtyři podmínky ve špatném pořadí (< 70, < 30, <= 0, else). Nechte je určit, která se chytne, a pak je přeskládat správně. Zabere to tři minuty a sedne to líp než deset minut výkladu.