Die Pflanzen
Willkommen zur letzten Lektion des Lua-Kurses! In ihr setzt du alles zusammen, was du gelernt hast, und baust Schritt für Schritt ein einziges Programm: eine Saison auf Emmas Hof. Emma kauft Saatgut, pflanzt es, schaut ihm sechs Tage beim Wachsen zu, erntet es und verkauft es. Wenn du fertig bist, gibt dein Programm Folgendes aus:
PREISLISTE
Karotte: Samen 2, Verkauf 5
Kürbis: Samen 5, Verkauf 20
Erdbeere: Samen 4, Verkauf 12
Weizen: Samen 1, Verkauf 3
Tomate: Samen 2, Verkauf 7
Beet 1: Karotte x4 für 8 Münzen
Beet 2: Weizen x6 für 6 Münzen
Beet 3: Kürbis x2 für 10 Münzen
Nicht genug Münzen für Erdbeere x2
Beet 4: Tomate x3 für 6 Münzen
Münzen: 0
Tag 1 (sonnig): Karotte 1/3, Weizen 1/2, Kürbis 1/6, Tomate 1/4
Tag 2 (sonnig): Karotte 2/3, Weizen 2/2, Kürbis 2/6, Tomate 2/4
Hugo: Weizen 6 x 4 = 24
Tag 3 (regnerisch): Karotte 3/3, Weizen 2/2, Kürbis 4/6, Tomate 4/4
Tag 4 (wolkig): Karotte 1/3, Weizen 1/2, Kürbis 5/6, Tomate 1/4
Hugo: Karotte 4 x 7, Tomate 3 x 9, Weizen 6 x 5 = 85
Tag 5 (sonnig): Karotte 2/3, Weizen 2/2, Kürbis 6/6, Tomate 2/4
Hugo: Kürbis 2 x 21, Weizen 6 x 4 = 66
Tag 6 (wolkig): Karotte 3/3, Weizen 1/2, Kürbis 1/6, Tomate 3/4
Markt: Karotte 4 x 5 = 20
Saisonende: 195 MünzenZuerst kommt die Preisliste der Pflanzen. Emma hat 30 Münzen und kauft Samen für ihre Beete. Für die Erdbeeren reichen die Münzen nicht, für die Tomaten aber schon. Dann vergehen sechs Tage. An jedem Tag wachsen die Beete, an einem regnerischen Tag doppelt so viel: Karotte 2/3 bedeutet, dass die Karotten 2 der 3 Tage gewachsen sind, die sie brauchen. Eine reife Pflanze kommt in die Scheune, und das Beet beginnt von vorn zu wachsen. Hugo, der Händler, kommt jeden Tag vorbei, und wenn er mehr zahlt als der Markt, verkauft Emma ihm, was in ihrer Scheune liegt. Was am Ende der Saison übrig ist, geht auf den Markt.
Du setzt fast den ganzen Kurs ein: Datensätze in Listen, Dictionaries, Funktionen, Schleifen, Bedingungen, string.format, eine Klasse mit einer Metatabelle und eine Koroutine. Jede Übung setzt dort an, wo die vorige aufgehört hat (der Editor beginnt mit ihrem fertigen Code), und fügt ein Stück hinzu.
Der Aufbau. Im Editor stehen drei Kommentare, die das Programm in Teile gliedern. Ganz oben -- Daten: die Dinge, mit denen das Programm arbeitet, zum Beispiel die Pflanzen und später Emmas Plan und das Wetter. Darunter -- Funktionen und ganz unten -- Hauptprogramm, das die Daten und die Funktionen benutzt und die Ergebnisse ausgibt. Die Reihenfolge ist wichtig. Lua führt das Programm von oben nach unten aus, und eine lokale Variable oder Funktion gibt es erst ab der Zeile, in der sie erstellt wird. Eine Funktion, die pflanzen liest, muss also unter pflanzen stehen, und das Hauptprogramm, das die Funktionen aufruft, unter ihnen.
Der erste Schritt: die Pflanzen. Jede Pflanze hat einen Namen, die Anzahl der Tage, die sie zum Wachsen braucht, den Preis eines Samens und den Preis, den der Markt für eine Pflanze zahlt. Das ist ein Datensatz, eine Tabelle mit benannten Feldern, wie in der Lektion über Dictionaries. Und alle Pflanzen zusammen sind eine Liste von Datensätzen. Zum Beispiel der Marktstand von Opa Josef:
local stand = {
{name = "Eier", einheit = "Schachtel", preis = 4},
{name = "Milch", einheit = "Flasche", preis = 3},
}
for _, artikel in ipairs(stand) do
print(string.format("%s (%s): %d Münzen", artikel.name, artikel.einheit, artikel.preis))
endDas gibt Folgendes aus:
Eier (Schachtel): 4 Münzen
Milch (Flasche): 3 MünzenBeachte das Komma nach dem letzten Datensatz: Lua erlaubt es, und ein weiterer Datensatz lässt sich dann leichter ergänzen. Das Komma zwischen zwei Datensätzen darf aber nicht fehlen. Ohne es läuft das Programm gar nicht: main.lua:3: '}' expected (to close '{' at line 1) near '{'. Lua hat erwartet, dass die Liste nach dem ersten Datensatz endet, weil kein Komma gesagt hat, dass noch einer folgt.
Die Schleife for _, artikel in ipairs(stand) geht die Liste der Reihe nach durch. Den Index braucht sie nicht, deshalb steht _ an seiner Stelle. string.format setzt die Werte in den Text ein, %s einen Text und %d eine Ganzzahl, in der Reihenfolge, in der sie folgen. Hat der Name eines Feldes einen Tippfehler, zum Beispiel pflanze.samenpreis mit kleinem p, ist das Feld nil, und %d kann es nicht ausgeben: main.lua:16: bad argument #3 to 'format' (number expected, got nil). Argument #3 ist der dritte Wert in den Klammern von string.format, wobei der Text mit dem Format mitzählt.
So schreibst du es:
Anweisungen
- 1
Erstelle unter
-- Dateneine lokale Variablepflanzen: eine Liste aus vier Datensätzen mit den Feldernname,tage,samenPreisundpreis. Der erste ist{name = "Karotte", tage = 3, samenPreis = 2, preis = 5}. Danach kommen ein Kürbis (6 Tage, ein Samen für 5, Verkaufspreis 20), eine Erdbeere (5 Tage, 4, 12) und Weizen (2 Tage, 1, 3). Schreibe die Namen genau so, wie du sie in der Ausgabe siehst:"Kürbis","Erdbeere"und"Weizen". - 2
Gib unter
-- Hauptprogrammdie ÜberschriftPREISLISTEaus. Gehe darunter mitipairsdurchpflanzenund gib den Namen jeder Pflanze aus. Das Programm gibt die Überschrift und vier Namen aus. - 3
Vervollständige die Zeile in der Schleife mit
string.format, sodass sie auch den Preis eines Samens und das zeigt, was der Markt zahlt:PREISLISTE Karotte: Samen 2, Verkauf 5 Kürbis: Samen 5, Verkauf 20 Erdbeere: Samen 4, Verkauf 12 Weizen: Samen 1, Verkauf 3Wenn der Samen der Karotte 5 kostet, hast du die beiden Preise vertauscht.