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 funkce f (bez závorek za f). coroutine.resume(co) ji spustí a nechá běžet až k dalšímu coroutine.yield() nebo na konec funkce. Korutina je hodnota typu thread, ne funkce, takže co() skončí chybou attempt to call a thread value.
  • coroutine.status(co) je suspended (ještě nezačala nebo je pozastavená), running (běží) nebo dead (skončila).
  • coroutine.yield() mimo korutinu, třeba ve funkci, kterou jste zavolali sami, skončí chybou attempt to yield from outside a coroutine.
  • coroutine.yield(v) předá v ven: resume vrátí true a v. coroutine.resume(co, x) předá x dovnitř: první resume parametrům funkce, každé další jako výsledek toho yield, u kterého korutina čeká.
  • Cyklus while true do s yield uvnitř není nekonečný: u každého yield se zastaví.
  • coroutine.wrap(f) vrátí generátor: funkci, která korutinu spustí a vrátí jen hodnoty z yield. Hodí se do for … 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: resume vrátí false a hlášku a korutina je dead. Spuštění mrtvé korutiny vrátí false a cannot resume dead coroutine. Proto kontrolujte první hodnotu. Generátor z wrap chybu 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.

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 l

Konev 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

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

6/6