Wachsen
Jetzt beginnt die Saison: sechs Tage, jeder mit eigenem Wetter. An einem sonnigen oder wolkigen Tag wächst jedes Beet um einen Tag. An einem regnerischen Tag gießt der Regen die Beete, und sie wachsen um zwei. Das Wetter der sechs Tage steht in einer Liste: sonnig, sonnig, regnerisch, wolkig, sonnig, wolkig. In einem echten Spiel könnte es zufällig sein, mit math.random. Dann würde das Programm aber bei jedem Ausführen etwas anderes ausgeben, und die Tests könnten es nicht prüfen. Deshalb steht das Wetter fest.
Wie stark die Beete wachsen, hängt vom Wetter ab, und das ist ein Fall für ein Dictionary. Seine Schlüssel sind die Wetterarten und seine Werte die Wachstumstage: wachstum[heute] ist 2, wenn heute "regnerisch" ist. Jede Wetterart aus der Liste braucht ihren Schlüssel im Dictionary. Ein Tippfehler in der Liste, etwa "sonng", ergibt nil, und das Programm bricht in lasseWachsen ab, weil es nil nicht addieren kann:
main.lua:35: attempt to perform arithmetic on a nil value (local 'menge')Ein Beet kann nicht mehr wachsen, als seine Pflanze braucht. Karotten, die 2 von 3 Tagen gewachsen sind, haben nach einem regnerischen Tag 3 von 3, nicht 4. math.min gibt die kleinere von zwei Zahlen zurück, also ist math.min(beet.gewachsen + menge, beet.pflanze.tage) die neue Anzahl der Tage, aber nie mehr als beet.pflanze.tage.
Die Funktion lasseWachsen ändert das Beet, das sie bekommt, und muss nichts zurückgeben. Eine Tabelle wird beim Übergeben an eine Funktion nicht kopiert, die Änderung passiert also am Beet in der Liste beete.
Die Zeile jedes Tages beschreibt alle Beete. Das ist ein Muster aus der Lektion über Listen: Baue in einer Schleife eine Liste von Texten und verbinde sie dann mit table.concat. Zum Beispiel legen Emmas Hühner an einem sonnigen Tag zwei Eier und an einem regnerischen Tag eins:
local huehner = {
{name = "Goldie", eier = 0},
{name = "Pepper", eier = 0},
}
local gelegt = {sonnig = 2, regnerisch = 1}
for tag, himmel in ipairs({"sonnig", "regnerisch"}) do
local teile = {}
for _, huhn in ipairs(huehner) do
huhn.eier = huhn.eier + gelegt[himmel]
table.insert(teile, huhn.name .. " " .. huhn.eier)
end
print("Tag " .. tag .. ": " .. table.concat(teile, ", "))
endDas gibt Folgendes aus:
Tag 1: Goldie 2, Pepper 2
Tag 2: Goldie 3, Pepper 3Die äußere Schleife geht die Tage durch, die innere die Hühner. ipairs liefert sowohl die Nummer des Tages als auch sein Wetter, im ersten Durchlauf ist tag also 1 und himmel ist "sonnig". Die Liste teile wird innerhalb der äußeren Schleife erstellt, jeder Tag beginnt also mit einer leeren. Über der Schleife erstellt, würde sie weiterwachsen, und die Zeile des zweiten Tages würde vier Hühner aufzählen.
So schreibst du es:
Anweisungen
- 1
Erstelle unter
planeine Listewettermit dem Wetter der sechs Tage,"sonnig", "sonnig", "regnerisch", "wolkig", "sonnig", "wolkig", und ein Dictionarywachstum, in demsonnigundwolkigden Wert1haben undregnerischden Wert2. - 2
Schreibe unter
findePflanzezwei Funktionen.lasseWachsen(beet, menge)addiertmengezumgewachsendes Beets, aber nie über dietageseiner Pflanze hinaus.beschreibeBeet(beet)gibt einen kurzen Text über das Beet zurück, zum BeispielKarotte 2/3: den Namen der Pflanze, die Tage, die sie gewachsen ist, und die Tage, die sie braucht. - 3
Gehe am Ende des Hauptprogramms mit
ipairsdurchwetter. An jedem Tag wächst jedes Beet umwachstum[heute], und dann gibt das Programm eine Zeile mit der Nummer des Tages, seinem Wetter und den Beschreibungen aller Beete aus, verbunden mit", ". Das Programm endet so:Münzen: 6 Tag 1 (sonnig): Karotte 1/3, Weizen 1/2, Kürbis 1/6 Tag 2 (sonnig): Karotte 2/3, Weizen 2/2, Kürbis 2/6 Tag 3 (regnerisch): Karotte 3/3, Weizen 2/2, Kürbis 4/6 Tag 4 (wolkig): Karotte 3/3, Weizen 2/2, Kürbis 5/6 Tag 5 (sonnig): Karotte 3/3, Weizen 2/2, Kürbis 6/6 Tag 6 (wolkig): Karotte 3/3, Weizen 2/2, Kürbis 6/6Steht bei den Karotten an Tag 3
4/3, ist das Beet über die Tage seiner Pflanze hinausgewachsen.