while (true), break, čtení příkazu v každém kole, proměnné deklarované mimo smyčku, počítadlo kolkonecif z minulých hodinzaútočit, lektvar, konec.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čí až 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 |
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.
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.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.
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.
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.
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.kolo++; — dělá přesně totéž.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.
{ 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.
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.
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ě.
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.
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š.
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.
Console.ReadLine() — jeden řádek na jedno čtení.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í.
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.
Console.ReadLine() — jeden řádek na jedno čtení.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š.
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 klidnou informaci, ne jako drama —
dnes se to stane několikrát.
kolo <= 3 na kolo <= 8. Kolik řádků se vypíše?Console.WriteLine.kolo++; a spusť. (Pak stránku obnov — vyrobil jsi nekonečnou smyčku!)Console.WriteLine("Souboj skončil."); nad }. Co se změní?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.
int zkusenosti = 0; a v každém kole jí přičti 7.int zlato = 0; dovnitř smyčky. Co se stane a proč?zlato / (kolo - 1)).Co si z toho odnést: proměnné nad smyčkou drží stav hry. Smyčka je jen motor, který tím stavem otáčí.
utéct, který vypíše hlášku a taky ukončí hru pomocí break.Console.ReadLine() — jeden řádek na jedno čtení.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.
else if.prodat, který vrátí polovinu ceny meče.Console.ReadLine() — jeden řádek na jedno čtení.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á.
obrana, který sníží drakův útok na polovinu v tomto kole.█ zkus # nebo ♥.Console.ReadLine() — jeden řádek na jedno čtení.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.
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.
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 |
Tvoje zadání:
Napiš program, který počítá, kolik příšer hrdina zabil. Hráč píše příkazy, dokud nenapíše
konec.
- Nad smyčkou vytvoř proměnnou
zabitos hodnotou 0 a vypiš uvítání💡 Poradit
Počítadlo musí vzniknout nad smyčkou, jinak by se každé kolo vynulovalo.
Napříkladint zabito = 0;a pod toConsole.WriteLine("Příkazy: zaútočit, konec");.- 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("> ");astring prikaz = Console.ReadLine();.
Zawhile (true)nepatří středník — hned následuje{.- Když hráč napíše
konec(nebo vstup dojde), smyčku ukonči💡 Poradit
Použijbreakuvnitř podmínky.
Napříkladif (prikaz == null || prikaz == "konec") { break; }. Bez části== nullse program může zacyklit.- Když hráč napíše
zaútočit, zvyš počítadlo a vypiš aktuální počet💡 Poradit
zabito++;zvýší číslo o jedna (totéž jakozabito = zabito + 1;).
Pak vypiš hlášku s interpolací:Console.WriteLine($"Zabil jsi příšeru! Celkem: {zabito}");.- 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í |
Console.ReadLine() — jeden řádek na jedno čtení.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:
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á?"break. Stránka zamrzne. Klid: Ctrl+R a hledáme.while (true);. Přeloží se, ale smyčka má prázdné tělo
a program zamrzne. Zákeřné — koukejte dětem na prsty.}, nebo pod ním?"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ě.
Console.ReadLine() — jeden řádek na jedno čtení.Tvoje zadání:
Hrdina vydělává a utrácí. Peněženka si musí pamatovat, kolik v ní zbývá.
- Nad smyčkou vytvoř
zlato = 50autraceno = 0a vypiš nabídku příkazů💡 Poradit
Dvě krabice typuintnad smyčkou:int zlato = 50;aint utraceno = 0;.
Pod ně vypiš nápovědu:Console.WriteLine("Příkazy: vydělat, utratit, stav, konec");.- Smyčka
while (true)s čtením příkazu a ukončením nakonec💡 Poradit
Stejná kostra jako v prvním cvičení:Console.Write("> ");,string prikaz = Console.ReadLine();a hned pojistkaif (prikaz == null || prikaz == "konec") { break; }.- Příkaz
vydělatpřidá 30 zlata, příkazstavvypíše peněženku💡 Poradit
Použij řetěz podmínek:if (prikaz == "vydělat") { zlato = zlato + 30; ... }aelse if (prikaz == "stav") { ... }.
Ve výpisu ukaž obě čísla:Console.WriteLine($"💰 {zlato} utraceno {utraceno}");.- Příkaz
utratitodeč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 iutraceno, aby sedělo.- Pod smyčkou vypiš, kolik zlata zbylo a kolik se celkem utratilo
💡 Poradit
Až 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 |
Console.ReadLine() — jeden řádek na jedno čtení.Očekávaný výsledek: peněženka, ve které zlato roste i klesá a nikdy nespadne pod nulu.
Kde se zaseknou:
zlato = zlato + 30; chybí. Ptejte se: „změnilo se to opravdu, nebo jsi to jen napsal?"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ě.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.
Console.ReadLine() — jeden řádek na jedno čtení.Tvoje zadání:
Hra si bude zapisovat, co hrdina dělal, a na konci deník přečte nahlas.
- Nad smyčkou vytvoř prázdný text
denika počítadlokolo = 1💡 Poradit
Prázdný text se zapisuje dvěma uvozovkami bez ničeho mezi nimi:string denik = "";.
Pod toint kolo = 1;.- 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áš? ");.
Pakstring akce = Console.ReadLine();a pojistka sbreak.- Každou akci připiš do deníku i s číslem kola
💡 Poradit
Text se dá připisovat operátorem+=:denik += $"{kolo}. {akce}\n";.\nna konci udělá odřádkování, takže zápisy budou pod sebou.- Po zápisu zvyš číslo kola a vypiš potvrzení
💡 Poradit
kolo++;a k tomu hláška typuConsole.WriteLine($"📖 Zapsáno ({kolo - 1}. záznam).");.
Pozor: pokolo++už je číslo o jedna větší.- 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ů jekolo - 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 |
Console.ReadLine() — jeden řádek na jedno čtení.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.\n. Všechno se slepí na jeden řádek. Ať si \n přidají
a hned spustí — rozdíl je okamžitě vidět.string denik = ""; uvnitř smyčky. Stejná chyba jako minule,
jen v novém kabátě. Připomeňte pravidlo: stav patří nad smyčku.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.
Console.ReadLine() — jeden řádek na jedno čtení.Tvoje zadání:
V hospodě U Zlomeného meče stojí automat. Má zásoby, počítá tržbu a dochází mu zboží.
- Nad smyčkou vytvoř zásoby
cerveny = 3,modry = 2atrzba = 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íš.- Smyčka
while (true)s výběrem lektvaru a ukončením nakonec💡 Poradit
Kostra už ti musí jít z prstů:Console.Write("vyber> ");,string volba = Console.ReadLine();, pojistkaif (volba == null || volba == "konec") { break; }.- Volba
červenýsníží zásobu o 1 a přidá 10 do tržby💡 Poradit
cerveny--;je zkratka zacerveny = cerveny - 1;.
Tržbu zvyš zvlášť:trzba = trzba + 10;.- 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"); }.- 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ů |
Console.ReadLine() — jeden řádek na jedno čtení.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:
if.
Krásná příležitost na otázku „za co ti zákazník zaplatil, když nic nedostal?""červený" se musí napsat úplně stejně jako
v podmínce. Případ pro budoucí hodinu o řetězcích (ToLower, Trim).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.
Console.ReadLine() — jeden řádek na jedno čtení.Tvoje zadání:
Velké finále hodiny: hrdina proti drakovi. Oba mají životy a souboj běží kolo za kolem.
- Nad smyčkou vytvoř
zivotyHrdiny = 100,zivotyDraka = 80akolo = 1💡 Poradit
Třiintproměnné nad smyčkou. Jsou to čísla, která musí přežít všechna kola souboje.- Smyčka
while (true)s příkazyútok,obranaakonec💡 Poradit
V každém kole vypiš hlavičkuConsole.WriteLine($"--- {kolo}. kolo ---");, pak načti příkaz a nezapomeň na pojistku sbreak.útoksebere drakovi 15 životů, drak vždy vrátí 10 hrdinovi💡 Poradit
zivotyDraka = zivotyDraka - 15;a hned pod tímzivotyHrdiny = zivotyHrdiny - 10;.
Obě čísla vypiš, ať je vidět, jak souboj postupuje.obranasníží 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.- Když životy klesnou na 0 nebo níž, souboj ukonči a vypiš výsledek
💡 Poradit
Před koncem těla smyčky přidejif (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('█', ...) |
Console.ReadLine() — jeden řádek na jedno čtení.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:
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.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".
Console.ReadLine() — jeden řádek na jedno čtení.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é).
konec, strážce směnu ukončí.drak, strážce ho odmítne (odmitnuto++).vpusteno++ a vybere 5 zlatých mýtného.$"...").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.
Ú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.
Console.ReadLine() — jeden řádek na jedno čtení.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 |
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.