Plodiny

Vítejte v poslední lekci kurzu Lua! V ní spojíte všechno, co jste se naučili, a krok za krokem napíšete jeden program: sezónu na Emině farmě. Ema koupí semínka, zaseje je, šest dní sleduje, jak rostou, sklidí úrodu a prodá ji. Až budete hotovi, program vypíše tohle:

CENÍK
mrkev: semínko za 2, prodej za 5
dýně: semínko za 5, prodej za 20
jahody: semínko za 4, prodej za 12
pšenice: semínko za 1, prodej za 3
rajčata: semínko za 2, prodej za 7
Záhon 1: mrkev x4 za 8 mincí
Záhon 2: pšenice x6 za 6 mincí
Záhon 3: dýně x2 za 10 mincí
Na jahody x2 nemá Ema dost mincí
Záhon 4: rajčata x3 za 6 mincí
Mince: 0
Den 1 (slunečno): mrkev 1/3, pšenice 1/2, dýně 1/6, rajčata 1/4
Den 2 (slunečno): mrkev 2/3, pšenice 2/2, dýně 2/6, rajčata 2/4
Hugo: pšenice 6 x 4 = 24
Den 3 (déšť): mrkev 3/3, pšenice 2/2, dýně 4/6, rajčata 4/4
Den 4 (zataženo): mrkev 1/3, pšenice 1/2, dýně 5/6, rajčata 1/4
Hugo: mrkev 4 x 7, pšenice 6 x 5, rajčata 3 x 9 = 85
Den 5 (slunečno): mrkev 2/3, pšenice 2/2, dýně 6/6, rajčata 2/4
Hugo: dýně 2 x 21, pšenice 6 x 4 = 66
Den 6 (zataženo): mrkev 3/3, pšenice 1/2, dýně 1/6, rajčata 3/4
Trh: mrkev 4 x 5 = 20
Konec sezóny: 195 mincí

Nejdřív přijde ceník plodin. Ema má 30 mincí a kupuje semínka pro své záhony. Na jahody jí mince nestačí, na rajčata ano. Pak uběhne šest dní. Každý den záhony povyrostou, a když prší, tak dvakrát víc: mrkev 2/3 znamená, že mrkev roste už 2 ze 3 dní, které potřebuje. Zralá úroda putuje do stodoly a záhon začne růst znovu. Každý den se u farmy zastaví obchodník Hugo, a když platí víc než trh, prodá mu Ema, co má ve stodole. Co zbude na konci sezóny, prodá na trhu.

Použijete většinu kurzu: záznamy v seznamech, slovníky, funkce, cykly, podmínky, string.format, třídu s metatabulkou a korutinu. Každé cvičení navazuje na to předchozí (editor začíná jeho hotovým kódem) a přidá jeden kousek.

Plán. V editoru jsou tři komentáře, které program dělí na části. Nahoře -- Data: to, s čím program pracuje, třeba plodiny a později Emin plán a počasí. Pod nimi -- Funkce a úplně dole -- Hlavní program, který data a funkce používá a vypisuje výsledky. Na pořadí záleží. Lua program spouští shora dolů a lokální proměnná nebo funkce existuje až od řádku, na kterém vznikne. Funkce, která čte plodiny, proto musí být pod nimi a hlavní program, který funkce volá, musí být pod funkcemi.

První krok: plodiny. Každá plodina má název, počet dní, které potřebuje k růstu, cenu jednoho semínka a cenu, kterou za jeden kus zaplatí trh. To je záznam, tabulka s pevně danými klíči, jako v lekci o slovnících. A všechny plodiny dohromady tvoří seznam záznamů. Třeba stánek dědy Josefa na trhu:

local stanek = {
    {nazev = "vejce", baleni = "krabička", cena = 4},
    {nazev = "mléko", baleni = "láhev", cena = 3},
}

for _, zbozi in ipairs(stanek) do
    print(string.format("%s (%s): %d mince", zbozi.nazev, zbozi.baleni, zbozi.cena))
end

Vypíše:

vejce (krabička): 4 mince
mléko (láhev): 3 mince

Všimněte si čárky za posledním záznamem: Lua ji dovolí a další záznam se pak přidává snáz. Čárka mezi dvěma záznamy ale chybět nesmí. Bez ní se program vůbec nespustí: main.lua:3: '}' expected (to close '{' at line 1) near '{'. Po prvním záznamu Lua čeká konec seznamu, protože žádná čárka neříká, že přijde další.

Cyklus for _, zbozi in ipairs(stanek) prochází seznam popořadě. Index nepotřebuje, a proto je na jeho místě _. string.format vloží hodnoty do textu, %s text a %d celé číslo, v pořadí, v jakém za textem následují. Když má název klíče překlep, třeba plodina.cenaseminka s malým s, je hodnota nil a %d ji vypsat neumí: main.lua:16: bad argument #3 to 'format' (number expected, got nil). Argument č. 3 (#3) je třetí hodnota v závorkách za string.format, když počítáte i text s formátem.

Pokyny

Pod -- Data vytvořte lokální proměnnou plodiny: seznam čtyř záznamů s klíči nazev, dny, cenaSemen a cena. První je {nazev = "mrkev", dny = 3, cenaSemen = 2, cena = 5}. Pak následují dýně (6 dní, semínko za 5, prodej za 20), jahody (5 dní, 4, 12) a pšenice (2 dny, 1, 3). Názvy pište malými písmeny a s háčky a čárkami, jak je vidíte ve výstupu: "dýně", "jahody" a "pšenice".

Pod -- Hlavní program vypište nadpis CENÍK. Pod ním projděte plodiny pomocí ipairs a vypište název každé plodiny. Program vypíše nadpis a čtyři názvy.

Doplňte řádek v cyklu pomocí string.format, aby ukazoval i cenu semínka a to, kolik platí trh:

CENÍK
mrkev: semínko za 2, prodej za 5
dýně: semínko za 5, prodej za 20
jahody: semínko za 4, prodej za 12
pšenice: semínko za 1, prodej za 3

Pokud semínko mrkve stojí 5, máte obě ceny prohozené.

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

1/7