Scénáře postav

Teď to, k čemu hry korutiny používají nejčastěji: scénáře postav. Každá postava dostane korutinu, která popisuje, co dělá, od začátku do konce, tah po tahu. Hra běží v tazích (na naší farmě je tahem jeden den): v každém tahu spustí korutinu každé postavy jednou a každá postava udělá jeden krok a pomocí yield pustí na řadu další.

Obchodník Hugo má trasu se třemi zastávkami. Kráva Bella má každé dva dny stejný režim, a proto je její scénář cyklus, který nikdy neskončí:

-- Kdo co dělá na farmě Slunečnice
local function hugo()
    print("Hugo je na trhu.")
    coroutine.yield()
    print("Hugo navštíví farmu Slunečnice.")
    coroutine.yield()
    print("Hugo odjíždí do města.")
end

local function bella()
    while true do
        print("Bella se pase na louce.")
        coroutine.yield()
        print("Bella odpočívá ve stodole.")
        coroutine.yield()
    end
end

local postavy = {coroutine.create(hugo), coroutine.create(bella)}

for den = 1, 4 do
    print("Den " .. den)
    for _, postava in ipairs(postavy) do
        if coroutine.status(postava) ~= "dead" then
            coroutine.resume(postava)
        end
    end
end

Vypíše:

Den 1
Hugo je na trhu.
Bella se pase na louce.
Den 2
Hugo navštíví farmu Slunečnice.
Bella odpočívá ve stodole.
Den 3
Hugo odjíždí do města.
Bella se pase na louce.
Den 4
Bella odpočívá ve stodole.

Korutiny jsou v seznamu, takže hernímu cyklu je jedno, kolik postav je: každé dá tah, v pořadí podle seznamu. Postavy se střídají, nikdy neběží současně. Každá běží až ke svému yield a teprve pak přijde na řadu další. Čtvrtý den už Hugův scénář skončil (dead), a tak ho cyklus přeskočí.

Proč korutiny? Bez nich by Hugo potřeboval proměnnou, která si pamatuje jeho krok, a každý den if krok == 1 then … elseif krok == 2 then …, a takové proměnné by potřebovala každá postava. Korutina si pamatuje, kde se zastavila, i své lokální proměnné, a tak se každý scénář čte shora dolů jako příběh: nejdřív tohle, pak počkat, pak tamto. Ukazuje to Bellin scénář: cyklus se dvěma kroky, nic víc.

Pokyny

Pes Rex nosí Emě každý den klacek a počítá je. Napište funkci rex pro jeho scénář: lokální proměnnou klacky, která začíná na 0, a pak cyklus, který běží donekonečna. V cyklu Rex přidá jeden klacek, vypíše Rex nese klacek číslo 1. (s aktuálním číslem) a zavolá coroutine.yield(). Z funkce rex vytvořte korutinu a každý den ji spusťte, hned po Hugovi. Program vypíše:

Den 1
Hugo prodává semínka na trhu.
Rex nese klacek číslo 1.
Den 2
Hugo kupuje vejce na farmě Slunečnice.
Rex nese klacek číslo 2.
Den 3
Hugo odjíždí do města.
Rex nese klacek číslo 3.

Soused děda Josef chodí na kus řeči každý druhý den: 2., 4., 6. den a tak dál. Napište jeho scénář dedaJosef: v cyklu, který běží donekonečna, nejdřív nechá uběhnout den (jen coroutine.yield()), pak vypíše Děda Josef přichází na kus řeči. a znovu zavolá coroutine.yield(). Všechny tři korutiny dejte do seznamu postavy, v pořadí Hugo, Rex, děda Josef, a v cyklu s ipairs spusťte každou, která není dead. Hra ať trvá čtyři dny. Program vypíše:

Den 1
Hugo prodává semínka na trhu.
Rex nese klacek číslo 1.
Den 2
Hugo kupuje vejce na farmě Slunečnice.
Rex nese klacek číslo 2.
Děda Josef přichází na kus řeči.
Den 3
Hugo odjíždí do města.
Rex nese klacek číslo 3.
Den 4
Rex nese klacek číslo 4.
Děda Josef přichází na kus řeči.

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

4/6