← Přehled všech hodin

Stav hry mezi koly a herní smyčka

Cíl hodiny: Děti odcházejí s programem, který neskončí po jednom výpisu, ale pořád dokola se ptá hráče na příkaz a mezi koly si pamatuje životy, zlato i počet soubojů.
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.
Proč je tahle hodina zlomová:

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 Program z minula spustíte dvakrát — a ukážete, že si nic nepamatuje 10 min
Výklad Bloky Program, který skončíStav hrdiny pohromadě 35 min
Ukázky Demo 1–5, zvlášť demo 5 (souboj) promítejte a hrajte s třídou 25 min
Cvičení Děti pracují samy, vy obcházíte 55 min
Závěr Kdo chce, pustí svůj souboj před třídou 5 min
Hlavní pedagogický cíl

Dnešní téma se dá shrnout jednou větou: program může běžet dál a mezi koly si něco pamatovat.

V paralelním kurzu Pythonu je tahle hodina o st.session_state — tedy o tom, jak udržet hodnotu, když se webová aplikace při každém kliknutí spustí celá znovu. My žádnou reaktivní webovou aplikaci nemáme, takže bychom session_state učili naprázdno. Konzolový program má na stejný problém jiný, ale úplně stejně důležitý recept: herní smyčku.

Podstata je totožná: aplikace dělá věci opakovaně a hodnoty musí přežít z jednoho kroku do dalšího. Ve Streamlitu se stav ukládá do session_state, protože skript umírá a rodí se znovu. V konzoli stačí proměnnou deklarovat nad smyčkou, protože program neumírá — jen se točí dokola.

Tuhle souvislost dětem říkat nemusíte. Vám se ale hodí, až se vás někdo zeptá, proč kamarádka v Pythonu dělá něco jiného.

Tři věci, které dnes NEVYSVĚTLUJTE
  1. Cykly for a foreach. Dnes existuje jediná smyčka: while (true), a je to smyčka hry. Ostatní cykly přijdou později jako samostatné téma.
  2. Platnost proměnných (scope) formálně. Stačí obraz: „co je uvnitř složených závorek, po každém kole zmizí; co je nad nimi, zůstává."
  3. switch. Řetěz if / else if / else je dnes úplně dost. Kdo přijde s switch sám, nechte ho — ale neučte to celou třídu.

Jak pracovat se smíšenou úrovní. Každé cvičení má tři stupně: Minimum, Rozšíření, Výzva. Slabším řekněte, že stačí Minimum. Rychlíky posaďte k někomu, kdo se trápí — dnešní téma se výborně vysvětluje nahlas.

Poznámky pro učiteleRozjezd: ukažte problém, ne řešení1. Vysvětlení a souvislosti

Než řeknete slovo „smyčka", nechte děti narazit na problém.

Spusťte to dvakrát po sobě a zeptejte se: „Kolik zlata má hrdina po druhém spuštění?" Většina třídy řekne 40. Spusťte a ukažte, že je to zase 20.

Program po posledním řádku skončí a všechno v paměti zmizí. Příště začíná úplně od nuly.

Pak položte otázku, která otevře celou hodinu: „Co kdybychom chtěli zaútočit desetkrát? Zkopírujeme ten kód desetkrát?"

Někdo vždycky řekne „to by bylo hloupé". Přesně tam chcete být.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Na co se připravit

Nekonečná smyčka. Dnes ji minimálně jedno dítě vyrobí. Na počítači se zastavuje Ctrl+C v terminálu, tady na stránce stačí zavřít nebo obnovit kartu. Napište Ctrl+C na tabuli hned na začátku hodiny, ne až to nastane.

Zapomenutý break. Program se ptá pořád dokola a nejde z něj ven. Není to katastrofa, je to nejlepší možná lekce o tom, k čemu break je.

Proměnná uvnitř smyčky. Dítě napíše int zlato = 0; dovnitř a diví se, že zlato pořád naskakuje na nulu. Tohle je hlavní myšlenka hodiny — až to nastane, zastavte třídu a ukažte to všem.

Blok 1Smyčka: kód, který se opakuje1. Vysvětlení a souvislosti

Zapamatuj si:

while (podmínka) { ... } znamená „dokud platí podmínka, opakuj to, co je ve složených závorkách." Kód uvnitř závorek se jmenuje tělo smyčky.

Přečti program nahlas jako větu: „Dokud je kolo menší nebo rovno třem, vypiš nadpis, vypiš hlášku a zvyš kolo o jedna."

  • kolo = kolo + 1; je nutné. Bez něj by podmínka platila pořád a program by se točil donekonečna.
  • Zkráceně jde psát kolo++; — dělá přesně totéž.
  • Řádek Console.WriteLine("Souboj skončil."); je pod závorkami, takže se provede až po dotočení smyčky. Jednou.

Zkus změnit 3 na 10 a spusť. Jeden znak, desetkrát víc textu.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Jak číst složené závorky

{ a } říkají „tady začíná a tady končí to, co k sobě patří." Všechno mezi nimi se opakuje. Co je pod }, se opakovat nebude.

Zvyk v C#: tělo smyčky se odsazuje o čtyři mezery, ať je vidět, co je uvnitř. Překladači je odsazení jedno, tobě ne.

Blok 2while (true) a break — smyčka, která běží pořád1. Vysvětlení a souvislosti

while (true) je smyčka bez konce. Podmínka true znamená „ano, platí" — a platí vždycky. Sama od sebe taková smyčka nikdy neskončí.

break je nouzový východ. Jakmile ho program potká, okamžitě vyskočí ze smyčky ven a pokračuje pod ní.

Tenhle pár — nekonečná smyčka + podmínka s break — je přesně to, na čem stojí každá hra. Herní smyčka běží, dokud hráč neřekne dost.

Všimni si, že break je schovaný uvnitř if. Kdyby byl venku, smyčka by skončila hned po prvním kole a byla by k ničemu.

Pozor na nekonečnou smyčku. Kdybys break zapomněl, program by běžel napořád. Na počítači ho zastavíš v terminálu klávesami Ctrl+C, tady na stránce obnovením stránky.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Blok 3Proměnná nad smyčkou si pamatuje, uvnitř ne1. Vysvětlení a souvislosti

Tohle je nejdůležitější blok celé hodiny. Spusť ho a porovnej oba sloupce:

Kolo venku uvnitř
1 10 10
2 20 10
3 30 10
  • zlatoVenku vzniklo nad smyčkou. Existuje celou dobu, takže se hodnota hromadí z kola do kola.
  • zlatoUvnitr vzniká znovu v každém kole a na konci kola zaniká. Proto pořád začíná od nuly.

Pravidlo dneška: co si má hra pamatovat, deklaruj NAD smyčkou. Životy, zlato, počet soubojů, jméno hrdiny — všechno nad ni.

Zkus int zlatoUvnitr = 0; přesunout nad while (a smazat int uvnitř). Oba sloupce se začnou chovat stejně.

Klikni vlevo na Spustit a objeví se tu výstup programu.
Proč to tak je

Složené závorky určují, jak dlouho proměnná žije. Proměnná deklarovaná uvnitř { } zanikne, jakmile program dojde na }. Angličtina pro to má slovo scope, česky platnost. Nemusíš si pamatovat název — stačí obraz: krabice uvnitř smyčky se na konci každého kola vysype.

Blok 4Příkaz od hráče v každém kole1. Vysvětlení a souvislosti
while (true)
{
    Console.Write("> ");
    string prikaz = Console.ReadLine();

    if (prikaz == null || prikaz == "konec")
    {
        break;
    }

    Console.WriteLine($"Napsal jsi: {prikaz}");
}

Console.ReadLine() uvnitř smyčky se ptá znovu v každém kole. Jedno kolo = jeden řádek od hráče.

Rozbor tří nových detailů:

  • Console.Write("> "); vykreslí výzvu bez odřádkování. Vypadá to jako opravdový terminál hry.
  • prikaz == "konec" porovnává text s textem. V C# se texty porovnávají dvojitým rovnítkem == úplně normálně.
  • prikaz == null je pojistka. Když vstup dojde (hráč nic dalšího nenapsal), ReadLine vrátí null — tedy „nic". Bez téhle pojistky by se smyčka točila donekonečna.

Tenhle kód potřebuje stdin, takže ho nespustíš tlačítkem u výkladu — o dva bloky níž je celý v dílně, kde si ho pustit můžeš.

Co je null

null znamená „vůbec nic" — ani prázdný text, prostě nic. Console.ReadLine() ho vrátí ve chvíli, kdy už není co číst.

Dnes ti stačí jediné: do každé herní smyčky patří prikaz == null jako pojistka proti nekonečnému běhu. Ber to jako bezpečnostní pás.

Blok 5Menu: rozhodování podle příkazu1. Vysvětlení a souvislosti
demo/demo_menu.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: uvnitř smyčky je obyčejný řetěz if / else if / else, který už znáš. Nové je jenom to, že se provede v každém kole znovu a že hodnoty nad smyčkou se mezi koly hromadí.

Jak funguje políčko stdin

Konzolová hra na počítači čeká, až něco napíšeš na klávesnici. Tady v prohlížeči žádná konzolová klávesnice není, takže odpovědi napíšeš dopředu do políčka Standardní vstup (stdin) pod kódem:

zaútočit
lektvar
zaútočit
konec

Každý řádek = jedno kolo smyčky. Program si je bere shora dolů. Zkus do políčka přidat další řádky a spusť znovu — hra bude mít víc kol.

Blok 6Stav hrdiny pohromadě1. Vysvětlení a souvislosti
demo/demo_stav.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: nahoře je stav hry (jméno, životy, zlato, kolo), dole smyčka, která ho mění. Tahle dvojice je kostra každé hry, kterou kdy napíšeš.

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

Věci, které dětem dnes neříkejte, ale vy je vědět potřebujete.

Proč while (true) a ne while (prikaz != "konec"). Druhá varianta vypadá elegantněji, ale vyžaduje deklaraci a první načtení příkazu před smyčkou (a pak ještě jednou uvnitř). To je pro začátečníka horší: tentýž řádek je v kódu dvakrát a děti ho zapomínají synchronizovat. while (true) + break má jediný bod čtení vstupu a čte se přirozeně: „pořád dokola, dokud nepadne konec."

Proč všude kontrolujeme null. V terminálu Console.ReadLine() vrátí null při konci vstupu (Ctrl+D, přesměrovaný soubor, prázdné stdin v prohlížeči). Bez téhle kontroly se v prohlížeči vyrobí nekonečná smyčka a stránka zamrzne. Berte to jako povinnou součást vzoru, ne jako volitelnou eleganci.

Varování CS8600. string prikaz = Console.ReadLine(); v novém projektu podtrhne žlutá vlnovka, protože metoda může vrátit null. Je to varování, ne chyba — program se přeloží a poběží. Vaše kontrola prikaz == null je přesně to, co varování požaduje; jen o tom překladač neví, protože proměnná je deklarovaná jako string, ne string?. Kdo chce mít čistý výstup, napíše string? prikaz = Console.ReadLine();. Dětem to nevysvětlujte.

Porovnávání textu. V C# == na dvou stringech porovnává obsah, ne adresu v paměti (na rozdíl od Javy). prikaz == "konec" tedy funguje přesně tak, jak děti čekají. Velká a malá písmena ale rozlišuje: "Konec" není "konec". Řešení (ToLower(), Trim()) přijde v hodině o řetězcích — dnes stačí dát do zadání přesné tvary příkazů.

Scope proměnných. Proměnná deklarovaná v těle while vzniká a zaniká v každé iteraci. Překladač navíc nedovolí ve stejném bloku deklarovat dvě proměnné stejného jména (CS0128), takže přesun deklarace nad smyčku bez smazání původní hlášku vyvolá. Je to častá chyba a děti ji dnes uvidí.

Vztah k session_state v Pythonu. Streamlit spouští skript při každé interakci znovu, takže potřebuje externí úložiště stavu. Konzolový program běží souvisle a stav drží v obyčejných proměnných. Stejný problém, jiné prostředí — až budou děti později psát webovou aplikaci v ASP.NET, potkají totéž, protože i HTTP požadavek je „program, který skončí".

Nekonečná smyčka v prohlížeči. Běhové prostředí je jednovláknové WebAssembly. Když se kód zacyklí, karta přestane reagovat a pomůže jen obnovení stránky (Ctrl+R / Cmd+R). Mějte to připravené jako klid­nou informaci, ne jako drama — dnes se to stane několikrát.

2. Ukázky pro projekci

Blok 7Ukázka 1 — Kola se počítají2. Ukázky pro projekci
Studenti zkuste změnit
  • Změň kolo <= 3 na kolo <= 8. Kolik řádků se vypíše?
  • Přidej do těla smyčky další Console.WriteLine.
  • Smaž řádek kolo++; a spusť. (Pak stránku obnov — vyrobil jsi nekonečnou smyčku!)
  • Přesuň Console.WriteLine("Souboj skončil."); nad }. Co se změní?
demo/demo1_kola.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: smyčka není kouzlo. Je to tentýž kód provedený několikrát za sebou — a kolo++ je to, co ji posouvá k cíli.

Blok 8Ukázka 2 — Stav se hromadí2. Ukázky pro projekci
Studenti zkuste změnit
  • Zvyš počet kol na 10. Kolik zlata bude na konci?
  • Přidej proměnnou int zkusenosti = 0; a v každém kole jí přičti 7.
  • Zkus přesunout int zlato = 0; dovnitř smyčky. Co se stane a proč?
  • Vypiš na konci průměr zlata na jedno kolo (zlato / (kolo - 1)).
demo/demo2_hromadeni.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: proměnné nad smyčkou drží stav hry. Smyčka je jen motor, který tím stavem otáčí.

Blok 9Ukázka 3 — Hráč píše příkazy2. Ukázky pro projekci
Studenti zkuste změnit
  • Do políčka stdin přidej další řádky. Kolik kol hra vydrží?
  • Napiš do stdin příkaz, který program nezná. Co odpoví?
  • Přidej příkaz utéct, který vypíše hlášku a taky ukončí hru pomocí break.
  • Nech program počítat, kolik příkazů hráč celkem zadal.
demo/demo3_prikazy.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: jeden řádek ve stdin = jedno kolo smyčky. Program se v každém kole zeptá, rozhodne se a jde na další kolo.

Blok 10Ukázka 4 — Obchod, kde zlato opravdu ubývá2. Ukázky pro projekci
Studenti zkuste změnit
  • Změň ceny zboží a zkus nakoupit tak, aby zlato došlo.
  • Přidej třetí zboží (štít za 60) a další větev else if.
  • Přidej příkaz prodat, který vrátí polovinu ceny meče.
  • Nech program hlídat, že nejde koupit dvakrát tentýž meč.
demo/demo4_obchod.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: podmínka může být i uvnitř větve if — nejdřív zjistíme, jaký je příkaz, a pak jestli na něj hrdina má.

Blok 11Ukázka 5 — Souboj s drakem na víc kol2. Ukázky pro projekci
Studenti zkuste změnit
  • Změň drakovi životy na 200. Kolik kol souboj vydrží?
  • Přidej příkaz obrana, který sníží drakův útok na polovinu v tomto kole.
  • Uprav pruhy životů: místo zkus # nebo .
  • Přidej hlášku, když drakovi zbývá méně než 30 životů („Drak krvácí!").
demo/demo5_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.

Co si z toho odnést: tohle už je opravdová hra. Uvnitř jednoho kola se stane několik věcí v pevném pořadí: vykreslit stav → načíst příkaz → provést akci → tah nepřítele → zkontrolovat konec. Pořadí je celý návrh hry.

Zápis {jmeno,-8}

Uvnitř interpolace smíš za proměnnou napsat čárku a číslo: {jmeno,-8} znamená „zarovnej doleva na osm znaků". Kladné číslo ({zlato,6}) zarovná doprava. Je to rychlejší náhrada za PadRight a PadLeft přímo v textu.

Blok 12Když se něco pokazí2. Ukázky pro projekci
Program.cs(12,5): error CS0128: A local variable named 'zlato' is already defined

Nejčastější dnešní chyba má dvě podoby.

První: dítě přesune deklaraci nad smyčku, ale zapomene smazat tu původní uvnitř. Překladač pak vidí dvě krabice stejného jména a hlásí CS0128. Oprava: uvnitř smyčky smaž slovo int i s deklarací a nech tam jen zlato = ...;.

Druhá podoba je opačná a překladač ji nenajde — program se přeloží a běží, jen se stav pořád resetuje. Tady pomůže jediná otázka: „Je ta proměnná nad while, nebo pod ním?"

Pravidlo: deklarace stavu patří nad smyčku, změny stavu dovnitř.

Hláška / projev Co to znamená Jak to opravit
Program běží pořád, stránka zamrzne chybí break nebo kontrola null přidej if (prikaz == null \|\| prikaz == "konec") break;, stránku obnov
Stav se pořád resetuje proměnná je deklarovaná uvnitř smyčky přesuň int zlato = 0; nad while
CS0128: already defined proměnná je deklarovaná dvakrát uvnitř smyčky smaž int, nech jen přiřazení
CS0165: Use of unassigned variable proměnná dostane hodnotu jen v některé větvi dej jí výchozí hodnotu hned při deklaraci
CS0136 / CS0103 u proměnné ze smyčky proměnná zaniká na konci kola deklaruj ji nad smyčkou
Program ignoruje příkaz nesedí přesný tvar textu "Konec" není "konec" — C# rozlišuje velká písmena
CS1525 / CS1002 u while chybí závorka nebo středník while (podmínka) bez středníku, tělo do { }
Smyčka proběhne jen jednou break není uvnitř if odsaď break dovnitř podmínky

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. Kód ve cvičení i v řešení jde spustit a upravovat přímo tady v prohlížeči. Do políčka Standardní vstup (stdin) pod kódem se píšou příkazy hráče, každý na svůj řádek.
Blok 13Cvičení 1 — Počítadlo zabitých příšer (15 min)3. Cvičení

Tvoje zadání:

Napiš program, který počítá, kolik příšer hrdina zabil. Hráč píše příkazy, dokud nenapíše konec.

  1. Nad smyčkou vytvoř proměnnou zabito s hodnotou 0 a vypiš uvítání
    💡 Poradit
    Počítadlo musí vzniknout nad smyčkou, jinak by se každé kolo vynulovalo.
    Například int zabito = 0; a pod to Console.WriteLine("Příkazy: zaútočit, konec");.
  2. Přidej smyčku while (true), která se v každém kole zeptá na příkaz
    💡 Poradit
    Uvnitř složených závorek napiš výzvu a čtení: Console.Write("> "); a string prikaz = Console.ReadLine();.
    Za while (true) nepatří středník — hned následuje {.
  3. Když hráč napíše konec (nebo vstup dojde), smyčku ukonči
    💡 Poradit
    Použij break uvnitř podmínky.
    Například if (prikaz == null || prikaz == "konec") { break; }. Bez části == null se program může zacyklit.
  4. Když hráč napíše zaútočit, zvyš počítadlo a vypiš aktuální počet
    💡 Poradit
    zabito++; zvýší číslo o jedna (totéž jako zabito = zabito + 1;).
    Pak vypiš hlášku s interpolací: Console.WriteLine($"Zabil jsi příšeru! Celkem: {zabito}");.
  5. Pod smyčkou vypiš celkový výsledek a odměnu 10 zlata za každou příšeru
    💡 Poradit
    Výpis patří pod uzavírací } smyčky, aby se provedl jen jednou.
    Odměnu spočítej rovnou v interpolaci: {zabito * 10}.
Úroveň Co má zvládnout
Minimum Body 1–3: smyčka běží a dá se z ní vyskočit příkazem konec
Rozšíření Body 4–5 a větev else s hláškou „takový příkaz neznám"
Výzva Přidat příkaz utéct, který smyčku ukončí, ale odměnu vypíše poloviční
cviceni/cviceni1_pocitadlo.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: program se ptá dokola, počítá útoky a po konec vypíše součet a odměnu.

Kde se zaseknou:

  • Počítadlo uvnitř smyčky. int zabito = 0; napsané dovnitř způsobí, že počet je pořád 1. Nejdůležitější moment cvičení — nechte je chvíli hledat a pak se zeptejte: „kde ta krabice vzniká?"
  • Zapomenutý break. Stránka zamrzne. Klid: Ctrl+R a hledáme.
  • Středník za while (true);. Přeloží se, ale smyčka má prázdné tělo a program zamrzne. Zákeřné — koukejte dětem na prsty.
  • Výpis výsledku uvnitř smyčky. Vypíše se po každém kole. Ptejte se: „je ten řádek nad }, nebo pod ním?"
  • Diakritika v příkazu. zaútočit se špatně píše. Klidně povolte utok bez háčků — ať neztrácejí čas překlepy ve stdin.

Kdo je hotový dřív: ať přidá druhý druh příšery (zaútočit-drak, 3 body) a počítá body zvlášť od počtu příšer.

Otázka na závěr cvičení: „Proč je int zabito = 0; nad smyčkou?" Odpověď: aby přežilo z kola do kola. To je celá dnešní hodina v jedné větě.

Řešení 1 — jedna z možných variant
reseni/reseni1_pocitadlo.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 14Cvičení 2 — Peněženka hrdiny (20 min)3. Cvičení

Tvoje zadání:

Hrdina vydělává a utrácí. Peněženka si musí pamatovat, kolik v ní zbývá.

  1. Nad smyčkou vytvoř zlato = 50 a utraceno = 0 a vypiš nabídku příkazů
    💡 Poradit
    Dvě krabice typu int nad smyčkou: int zlato = 50; a int utraceno = 0;.
    Pod ně vypiš nápovědu: Console.WriteLine("Příkazy: vydělat, utratit, stav, konec");.
  2. Smyčka while (true) s čtením příkazu a ukončením na konec
    💡 Poradit
    Stejná kostra jako v prvním cvičení: Console.Write("> ");, string prikaz = Console.ReadLine(); a hned pojistka if (prikaz == null || prikaz == "konec") { break; }.
  3. Příkaz vydělat přidá 30 zlata, příkaz stav vypíše peněženku
    💡 Poradit
    Použij řetěz podmínek: if (prikaz == "vydělat") { zlato = zlato + 30; ... } a else if (prikaz == "stav") { ... }.
    Ve výpisu ukaž obě čísla: Console.WriteLine($"💰 {zlato} utraceno {utraceno}");.
  4. Příkaz utratit odečte 20 zlata, ale jen když na to hrdina má
    💡 Poradit
    Uvnitř větve dej ještě jednu podmínku: if (zlato >= 20) { ... } else { Console.WriteLine("Na to nemáš!"); }.
    Nezapomeň zvýšit i utraceno, aby sedělo.
  5. Pod smyčkou vypiš, kolik zlata zbylo a kolik se celkem utratilo
    💡 Poradit
    pod uzavírací } smyčky. Můžeš přidat i součet {zlato + utraceno} — tolik zlata hrdina za hru viděl.
Úroveň Co má zvládnout
Minimum Body 1–3: zlato roste a příkaz stav ho ukáže
Rozšíření Bod 4 s kontrolou, že zlato nejde do mínusu, a bod 5
Výzva Přidat příkaz koupit meč za 90 zlata a bool maMec, který se pamatuje
cviceni/cviceni2_penezenka.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: peněženka, ve které zlato roste i klesá a nikdy nespadne pod nulu.

Kde se zaseknou:

  • Zapomenutá změna proměnné. Napíšou hlášku „vydělal jsi 30", ale zlato = zlato + 30; chybí. Ptejte se: „změnilo se to opravdu, nebo jsi to jen napsal?"
  • Kontrola až po odečtení. Nejdřív zlato = zlato - 20; a pak teprve if (zlato >= 0). Zlato se propadne do mínusu. Pořadí je celá pointa.
  • else if vs. dvě samostatná if. Obojí tady funguje, ale ukažte, že else if je čitelnější a rychlejší — program nezkouší zbytek zbytečně.
  • Vnořené závorky. Podmínka v podmínce je pro ně nová. Nechte je odsazovat o čtyři mezery, jinak se v tom ztratí.

Kdo je hotový dřív: bool maMec = false; a příkaz koupit meč. Bonus: nedovolit koupi podruhé (if (maMec) { ... }).

Otázka na závěr cvičení: „Co se stane, když dáš kontrolu zlata až za odečtení?" Ať to zkusí schválně — chyba, kterou si vyrobí sami, se pamatuje nejlíp.

Řešení 2 — jedna z možných variant
reseni/reseni2_penezenka.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í 3 — Deník dobrodružství (20 min)3. Cvičení

Tvoje zadání:

Hra si bude zapisovat, co hrdina dělal, a na konci deník přečte nahlas.

  1. Nad smyčkou vytvoř prázdný text denik a počítadlo kolo = 1
    💡 Poradit
    Prázdný text se zapisuje dvěma uvozovkami bez ničeho mezi nimi: string denik = "";.
    Pod to int kolo = 1;.
  2. Smyčka while (true), která v každém kole načte, co hrdina dělal
    💡 Poradit
    Výzva ať ukazuje číslo kola: Console.Write($"[{kolo}] co děláš? ");.
    Pak string akce = Console.ReadLine(); a pojistka s break.
  3. Každou akci připiš do deníku i s číslem kola
    💡 Poradit
    Text se dá připisovat operátorem +=: denik += $"{kolo}. {akce}\n";.
    \n na konci udělá odřádkování, takže zápisy budou pod sebou.
  4. Po zápisu zvyš číslo kola a vypiš potvrzení
    💡 Poradit
    kolo++; a k tomu hláška typu Console.WriteLine($"📖 Zapsáno ({kolo - 1}. záznam).");.
    Pozor: po kolo++ už je číslo o jedna větší.
  5. Pod smyčkou vypiš celý deník a počet záznamů
    💡 Poradit
    Deník je jeden dlouhý text s odřádkováními, takže stačí Console.WriteLine(denik);.
    Počet záznamů je kolo - 1, protože počítadlo je vždy o krok napřed.
Úroveň Co má zvládnout
Minimum Body 1–3: deník se plní a na konci se vypíše
Rozšíření Body 4–5 s číslováním záznamů a počtem
Výzva Příkaz deník, který vypíše zápisky během hry, aniž by hru ukončil
cviceni/cviceni3_denik.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: na konci se vypíše očíslovaný seznam všeho, co hrdina během hry dělal.

Kde se zaseknou:

  • = místo +=. denik = $"{kolo}. {akce}\n"; deník pokaždé přepíše a na konci zbude jediný řádek. Krásná ukázka rozdílu mezi nahradit a přidat.
  • Chybějící \n. Všechno se slepí na jeden řádek. Ať si \n přidají a hned spustí — rozdíl je okamžitě vidět.
  • Deklarace string denik = ""; uvnitř smyčky. Stejná chyba jako minule, jen v novém kabátě. Připomeňte pravidlo: stav patří nad smyčku.
  • Číslování o jedna vedle. Po kolo++ je počítadlo napřed, proto kolo - 1. Nechte je to vyzkoušet s oběma variantami a porovnat výstup.

Kdo je hotový dřív: příkaz deník, který zápisky vypíše během hry (else if (akce == "deník") { Console.WriteLine(denik); continue; }continue znamená „přeskoč zbytek kola a jdi na další").

Otázka na závěr cvičení: „Čím se liší = a +=?" Odpověď: = přepíše, += připíše na konec.

Řešení 3 — jedna z možných variant
reseni/reseni3_denik.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í 4 — Automat na lektvary (25 min)3. Cvičení

Tvoje zadání:

V hospodě U Zlomeného meče stojí automat. Má zásoby, počítá tržbu a dochází mu zboží.

  1. Nad smyčkou vytvoř zásoby cerveny = 3, modry = 2 a trzba = 0
    💡 Poradit
    Tři celá čísla nad smyčkou. Červený lektvar bude stát 10 zlata, modrý 25 — ceny si můžeš dát taky do proměnných, ale nemusíš.
  2. Smyčka while (true) s výběrem lektvaru a ukončením na konec
    💡 Poradit
    Kostra už ti musí jít z prstů: Console.Write("vyber> ");, string volba = Console.ReadLine();, pojistka if (volba == null || volba == "konec") { break; }.
  3. Volba červený sníží zásobu o 1 a přidá 10 do tržby
    💡 Poradit
    cerveny--; je zkratka za cerveny = cerveny - 1;.
    Tržbu zvyš zvlášť: trzba = trzba + 10;.
  4. Když je zásoba nulová, automat lektvar nevydá
    💡 Poradit
    Nejdřív se zeptej, pak teprve odečítej: if (cerveny > 0) { ... } else { Console.WriteLine("VYPRODÁNO"); }.
  5. Přidej volbu modrý za 25 a pod smyčkou vypiš zbylé zásoby a tržbu
    💡 Poradit
    Modrá větev je kopie červené — jen s jinými proměnnými a cenou.
    Souhrn pod smyčkou: Console.WriteLine($"Zbývá: 🔴 {cerveny} 🔵 {modry}");.
Úroveň Co má zvládnout
Minimum Body 1–3: červený lektvar se vydává a tržba roste
Rozšíření Body 4–5: kontrola vyprodání a druhý lektvar
Výzva Volba doplnit, která zásoby vrátí na původní počet, a počítadlo odmítnutých nákupů
cviceni/cviceni4_automat.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: automat, kterému při čtvrtém červeném lektvaru dojdou zásoby a slušně to oznámí.

Kde se zaseknou:

  • Zásoba jde do mínusu. Zapomenou vnořenou podmínku a automat vydává i „mínus jeden" lektvar. Ukažte, že kontrola musí být před odečtením.
  • Tržba roste i při vyprodání. Přičtení ceny nechají mimo vnitřní if. Krásná příležitost na otázku „za co ti zákazník zaplatil, když nic nedostal?"
  • Diakritika v příkazech. "červený" se musí napsat úplně stejně jako v podmínce. Případ pro budoucí hodinu o řetězcích (ToLower, Trim).
  • Kopírování větve bez přepsání proměnných. Modrá větev vznikne Ctrl+C, ale uvnitř zůstane cerveny. Klasika — ať čtou, co zkopírovali.

Kdo je hotový dřív: volba doplnit (zásoby zpět na 3 a 2) a počítadlo odmitnuto, kolikrát automat nic nevydal.

Otázka na závěr cvičení: „Kolik podmínek se musí splnit, aby lektvar vypadl?" Dvě: správný knoflík a nenulová zásoba.

Řešení 4 — jedna z možných variant
reseni/reseni4_automat.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í 5 — CsQuest: souboj na víc kol (30 min)3. Cvičení

Tvoje zadání:

Velké finále hodiny: hrdina proti drakovi. Oba mají životy a souboj běží kolo za kolem.

  1. Nad smyčkou vytvoř zivotyHrdiny = 100, zivotyDraka = 80 a kolo = 1
    💡 Poradit
    Tři int proměnné nad smyčkou. Jsou to čísla, která musí přežít všechna kola souboje.
  2. Smyčka while (true) s příkazy útok, obrana a konec
    💡 Poradit
    V každém kole vypiš hlavičku Console.WriteLine($"--- {kolo}. kolo ---");, pak načti příkaz a nezapomeň na pojistku s break.
  3. útok sebere drakovi 15 životů, drak vždy vrátí 10 hrdinovi
    💡 Poradit
    zivotyDraka = zivotyDraka - 15; a hned pod tím zivotyHrdiny = zivotyHrdiny - 10;.
    Obě čísla vypiš, ať je vidět, jak souboj postupuje.
  4. obrana sníží drakův zásah jen na 3 a zvyš číslo kola
    💡 Poradit
    V obranné větvi drak nedostane nic, ale hrdina ztratí jen 3 životy.
    kolo++; dej až na konec těla smyčky, ať platí pro obě větve.
  5. Když životy klesnou na 0 nebo níž, souboj ukonči a vypiš výsledek
    💡 Poradit
    Před koncem těla smyčky přidej if (zivotyDraka <= 0) { Console.WriteLine("🏆 Drak padl!"); break; } a podobně pro hrdinu.
    Souhrn souboje patří až pod smyčku.
Úroveň Co má zvládnout
Minimum Body 1–3: útok ubírá životy oběma stranám
Rozšíření Body 4–5: obrana, číslování kol a konec souboje při nule
Výzva Příkaz lektvar (max 2 použití, +30 životů) a ukazatel životů z new string('█', ...)
cviceni/cviceni5_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: souboj, který má průběh a konec — a který děti budou chtít hrát znovu s jinými čísly.

Kde se zaseknou:

  • Kontrola životů až pod smyčkou. Souboj pak pokračuje s drakem, který má −25 životů. Kontrola musí být uvnitř smyčky.
  • kolo++ na špatném místě. Když ho dají jen do jedné větve, čísla kol přeskakují. Připomeňte: co platí pro celé kolo, patří na konec těla smyčky.
  • break v obou kontrolách zapomenutý. Hláška se vypíše, ale souboj běží dál. Hláška bez break je jen text.
  • Pořadí kontrol. Když dá kontrolu hrdiny před drakem, při současné nule vyhraje drak. Není to chyba, je to rozhodnutí — nechte je ho obhájit.

Kdo je hotový dřív: příkaz lektvar s limitem dvou použití (int lektvary = 2;) a ukazatel životů z bloků: new string('█', Math.Max(0, zivotyDraka) / 10).

Otázka na závěr cvičení: „Co by se stalo, kdybys break po pádu draka smazal?" Souboj by pokračoval a drak by měl záporné životy — program by „lhal".

Řešení 5 — jedna z možných variant
reseni/reseni5_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.

4. Domácí úkol

Blok 18Domácí úkol — Strážce brány4. Domácí úkol

Zadání: Naprogramuj strážce, který u brány do města kontroluje poutníky.

Strážce běží ve smyčce while (true) a v každém kole načte jméno poutníka. Nad smyčkou si drží tři čísla: vpusteno, odmitnuto a zlato (mýtné).

  1. Když poutník napíše konec, strážce směnu ukončí.
  2. Když je jméno drak, strážce ho odmítne (odmitnuto++).
  3. Kohokoli jiného vpustí, přičte vpusteno++ a vybere 5 zlatých mýtného.
  4. U každého poutníka vypiš hlášku s jeho jménem ($"...").
  5. Po směně vypiš přehled: kolik lidí prošlo, kolik bylo odmítnuto a kolik se vybralo.

Co musí program umět:

Požadavek Popis
Stav nad smyčkou Tři počítadla, která přežijí všechna kola
Pojistka if (jmeno == null || jmeno == "konec") { break; }
Rozhodování Alespoň dvě větve (if / else)
Souhrn Výpis až pod smyčkou

Bonus (nepovinně): přidej druhého nevítaného hosta (třeba skřet) a spočítej, kolik by strážce vybral, kdyby mýtné zdražil na 8 zlatých.

Pro učitele

Úkol záměrně kombinuje úplně stejné tři dovednosti jako celá hodina: stav nad smyčkou, break s pojistkou, souhrn pod smyčkou. Nic nového.

Hodnoťte hlavně to, jestli jsou počítadla nad smyčkou a jestli souhrn sedí s tím, co se během směny vypsalo. Když se čísla rozejdou, bývá to zapomenuté vpusteno++ v jedné z větví.

Nejčastější odevzdaný nesmysl: souhrn uvnitř smyčky (vypíše se po každém poutníkovi). Není to chyba syntaxe, ale chyba návrhu — dobrý námět na společné čtení kódu na začátku další hodiny.

Zobrazit ukázkové řešení domácího úkolu
domaci/domaci_ukol05.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 19Oficiální dokumentace4. Domácí úkol

Až budeš chtít vědět víc, tady jsou původní zdroje. Jsou anglicky, ale kód v nich je stejný jako ten tvůj.

Téma Odkaz
Příkaz while learn.microsoft.com — while
break a continue learn.microsoft.com — jump statements
Console.ReadLine() learn.microsoft.com — Console.ReadLine
if a else learn.microsoft.com — selection statements
Operátory ++ a += learn.microsoft.com — arithmetic operators
Interpolace a zarovnání learn.microsoft.com — string interpolation
Math.Max learn.microsoft.com — Math.Max

5. Umíme informatiku

Blok 20Co jsme se dnes naučili5. Umíme informatiku

Dneska se z tvých programů staly hry. Rozdíl není v počtu řádků, ale v tom, že program teď běží dál a něco si pamatuje.

Dovednost Kde se ti bude hodit
while (true) a break Každá hra, menu, chatbot i ovládání robota
Stav nad smyčkou Životy, skóre, peníze — všechno, co má trvat
Příkaz od hráče v kole Textové hry, terminál, příkazová řádka
Souhrn pod smyčkou Výsledková tabulka na konci kola

Kde to potkáš v životě: každá počítačová hra má uvnitř přesně takovou smyčku — jen místo Console.ReadLine() čte, co jsi zmáčkl na klávesnici, a běží šedesátkrát za sekundu. Herní smyčka je jedna z nejstarších a nejdůležitějších myšlenek v programování a ty ji teď umíš napsat.

Příště: hrdina má zatím jen čísla. Příště dostane batoh — naučíme se List<string>, do kterého jde přidávat a odebírat věci, a inventář CsQuestu konečně začne dávat smysl.