Shrnutí
V této lekci jste se naučili, že:
- Korutina je funkce, která se umí uprostřed pozastavit a později pokračovat od stejného místa, i se svými lokálními proměnnými. Hry korutiny používají pro věci, které trvají několik tahů nebo snímků.
coroutine.create(f)vytvoří korutinu z funkcef(bez závorek zaf).coroutine.resume(co)ji spustí a nechá běžet až k dalšímucoroutine.yield()nebo na konec funkce. Korutina je hodnota typuthread, ne funkce, takžeco()skončí chybouattempt to call a thread value.coroutine.status(co)jesuspended(ještě nezačala nebo je pozastavená),running(běží) nebodead(skončila).coroutine.yield()mimo korutinu, třeba ve funkci, kterou jste zavolali sami, skončí chybouattempt to yield from outside a coroutine.coroutine.yield(v)předávven:resumevrátítrueav.coroutine.resume(co, x)předáxdovnitř: prvníresumeparametrům funkce, každé další jako výsledek tohoyield, u kterého korutina čeká.- Cyklus
while true dosyielduvnitř není nekonečný: u každéhoyieldse zastaví. coroutine.wrap(f)vrátí generátor: funkci, která korutinu spustí a vrátí jen hodnoty zyield. Hodí se dofor … in, který skončí, když funkce korutiny doběhne. Spotřebovaný generátor nejde spustit znovu; vytvořte nový.- Ve hře může mít každá postava korutinu se svým scénářem. Herní cyklus spustí v každém tahu každou z nich jednou. Postavy se střídají, nikdy neběží současně.
- Chyba uvnitř korutiny zastaví jen korutinu:
resumevrátífalsea hlášku a korutina jedead. Spuštění mrtvé korutiny vrátífalseacannot resume dead coroutine. Proto kontrolujte první hodnotu. Generátor zwrapchybu pošle dál a program skončí.
V další lekci, v závěrečném projektu, poskládáte celý kurz dohromady: sezónu na Emině farmě, jeden program postavený krok za krokem, od nákupu semínek po prodej úrody. Nebude chybět ani obchodník Hugo, samozřejmě jako korutina.
Nejdřív si ale procvičte tuhle lekci. Ema se chystá zalévat pole; seznam jejích záhonů najdete v editoru.
Jak psát:
Pokyny
Napište funkci zizniveZahony(zahony), která vrátí generátor vytvořený pomocí coroutine.wrap. Generátor předává přes yield každý záhon ze seznamu zahony, jehož voda je větší než 0. Projděte cyklem zizniveZahony(pole) a u každého záhonu vypište plodinu a vodu takto:
Zalít: mrkev (2 l)
Zalít: dýně (3 l)
Zalít: brambory (2 l)
Zalít: rajčata (1 l)Emina konev je korutina. Napište funkci zalevaciKonev(litry) s cyklem, který běží donekonečna. V cyklu konev předá přes yield, kolik litrů v ní je, a počká, kolik má nalít, local mnozstvi = coroutine.yield(litry), a pak je nalije: odečte mnozstvi od litry. Vytvořte z ní korutinu konev, spusťte ji pomocí coroutine.resume(konev, 6) a vypište, kolik v ní je. Pak projděte cyklem nový generátor zizniveZahony(pole), spusťte konev s hodnotou voda každého záhonu a vypište, kolik zbývá. Pod seznamem z 1. kroku program vypíše (poslední dva řádky jsou špatně, opravíte je v dalším kroku):
V konvi je 6 l
mrkev: zbývá 4 l
dýně: zbývá 1 l
brambory: zbývá -1 l
rajčata: zbývá -2 lKonev nemůže nalít víc vody, než v ní je. Ve funkci zalevaciKonev skončete chybou error("málo vody", 0), když je mnozstvi větší než litry. V cyklu přes záhony kontrolujte, co vrací resume: když selže, vypište plodinu a hlášku a ukončete cyklus pomocí break. Za cyklem vypište Ema jde ke studni. Celý program vypíše:
Zalít: mrkev (2 l)
Zalít: dýně (3 l)
Zalít: brambory (2 l)
Zalít: rajčata (1 l)
V konvi je 6 l
mrkev: zbývá 4 l
dýně: zbývá 1 l
brambory: málo vody
Ema jde ke studni.Začněte programovat zdarma
6/6