Růst

Teď začíná sezóna: šest dní a každý má své počasí. Za slunečného nebo zataženého dne povyroste každý záhon o jeden den. Když prší, déšť záhony zalije a povyrostou o dva. Počasí šesti dní je v seznamu: slunečno, slunečno, déšť, zataženo, slunečno, zataženo. Ve skutečné hře by mohlo být náhodné, pomocí math.random. Program by ale pak při každém spuštění vypsal něco jiného a testy by ho nemohly zkontrolovat. Proto je počasí pevně dané.

O kolik záhony povyrostou, závisí na počasí, a na to se hodí slovník. Jeho klíče jsou druhy počasí a hodnoty dny růstu: rust[dnes] je 2, když je dnes rovno "déšť". Názvy počasí mají háčky a čárky, a takový klíč musíte ve slovníku napsat do hranatých závorek a uvozovek: ["déšť"] = 2. Jako obyčejný název ho Lua nepřijme a program se vůbec nespustí: main.lua:19: '}' expected near '<\196>'. <\196> je první bajt písmene č ze slova slunečno, se kterým Lua v názvu nepočítá.

Každý druh počasí ze seznamu potřebuje ve slovníku svůj klíč. Překlep v seznamu, třeba "slunecno" bez háčku, dá nil a program skončí ve funkci zahonRoste, která k nil nic přičíst neumí:

main.lua:35: attempt to perform arithmetic on a nil value (local 'prirustek')

Záhon nesmí vyrůst víc, než jeho plodina potřebuje. Mrkev, která roste 2 ze svých 3 dní, má po deštivém dni 3 ze 3, ne 4. math.min vrátí menší ze dvou čísel, takže math.min(zahon.dnyRustu + prirustek, zahon.plodina.dny) je nový počet dní, ale nikdy víc než zahon.plodina.dny.

Funkce zahonRoste mění záhon, který dostane, a nemusí nic vracet. Tabulka se při předání funkci nekopíruje, takže se změna projeví u záhonu v seznamu zahony.

Řádek každého dne popisuje všechny záhony. To je postup z lekce o seznamech: v cyklu postavte seznam textů a pak ho spojte pomocí table.concat. Třeba Eminy slepice snesou za slunečného dne dvě vejce a za deště jedno:

local kurnik = {
    {jmeno = "Zlatka", vejce = 0},
    {jmeno = "Kropenka", vejce = 0},
}
local snaska = {["slunečno"] = 2, ["déšť"] = 1}

for den, obloha in ipairs({"slunečno", "déšť"}) do
    local casti = {}
    for _, slepice in ipairs(kurnik) do
        slepice.vejce = slepice.vejce + snaska[obloha]
        table.insert(casti, slepice.jmeno .. " " .. slepice.vejce)
    end
    print("Den " .. den .. ": " .. table.concat(casti, ", "))
end

Vypíše:

Den 1: Zlatka 2, Kropenka 2
Den 2: Zlatka 3, Kropenka 3

Vnější cyklus prochází dny a vnitřní slepice. ipairs dává číslo dne i jeho počasí, takže v prvním průchodu je den rovno 1 a obloha rovno "slunečno". Seznam casti vzniká uvnitř vnějšího cyklu, takže každý den začíná s prázdným. Kdyby vznikl nad cyklem, pořád by rostl a řádek druhého dne by vypsal čtyři slepice.

Pokyny

Pod seznamem plan vytvořte seznam pocasi s počasím šesti dní, "slunečno", "slunečno", "déšť", "zataženo", "slunečno", "zataženo", a slovník rust, ve kterém mají klíče "slunečno" a "zataženo" hodnotu 1 a klíč "déšť" hodnotu 2.

Pod najdiPlodinu napište dvě funkce. zahonRoste(zahon, prirustek) přičte prirustek k dnyRustu záhonu, ale nikdy ne nad dny jeho plodiny. popisZahon(zahon) vrátí krátký text o záhonu, třeba mrkev 2/3: název plodiny, kolik dní už roste a kolik jich potřebuje.

Na konci hlavního programu projděte pocasi pomocí ipairs. Každý den povyroste každý záhon o rust[dnes] a program pak vypíše řádek s číslem dne, jeho počasím a popisy všech záhonů spojenými pomocí ", ". Program končí takto:

Mince: 6
Den 1 (slunečno): mrkev 1/3, pšenice 1/2, dýně 1/6
Den 2 (slunečno): mrkev 2/3, pšenice 2/2, dýně 2/6
Den 3 (déšť): mrkev 3/3, pšenice 2/2, dýně 4/6
Den 4 (zataženo): mrkev 3/3, pšenice 2/2, dýně 5/6
Den 5 (slunečno): mrkev 3/3, pšenice 2/2, dýně 6/6
Den 6 (zataženo): mrkev 3/3, pšenice 2/2, dýně 6/6

Pokud má mrkev třetí den 4/3, záhon vyrostl přes počet dní své plodiny.

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

3/7