Lua Textadventure Engine 1.3 – Übungen
<strong>Anmerkung Januar 2021: </strong>Leider lässt es repl.it nicht mehr zu, dass nicht angemeldete Benutzer:innen die Codebeispiele ändern. Das ist sehr bedauerlich, ich kann es aber nicht ändern. Ihr müsst also, wenn ihr die Codebeispiele modifizieren oder Übungsaufgaben lösen wollt, einen repl.it Account anlegen. Das ist in der Basisversion kostenlos: <a href=“https://repl.it/signup“ target=“_blank“ rel=“noopener noreferrer“>https://repl.it/signup</a>
Aufgaben
1. Objekte positionieren und benutzen
Aufgabe 1.1
Füge dem Spieler ein Objekt hinzu, das „Troete“ heisst.
In der Datei spiele/uebung/_spieler:
spieler = { lebendig = true, ort = start_ort, objekte = { Troete = { } } }
Aufgabe 1.2
Sorge dafür, dass die Troete bei Benutzen die Nachricht „Trööööööt“ ausgeben.
In der Datei uebung/_spieler:
spieler = { lebendig = true, ort = start_ort, objekte = { Troete = { benutzen = function(selbst) nachricht("Tröööööt!") end } } }
Anmerkung: Auch wenn wir für die Benutzung der Troete den Bezug auf selbst nicht brauchen, schreiben wir ihn immer rein.
Aufgabe 1.3
Programmiere ein Buch, das bei Benutzung die Nachricht „Du schnappst Dir das Buch und liest eine Runde.“ ausgibt.
In der Datei spiele/uebung/_spieler:
objekte = { Troete = { benutzen = function(selbst) nachricht("Tröööööt!") end }, Buch = { benutzen = function(selbst) nachricht("Du schnappst Dir das Buch und liest eine Runde.") end } }
Beachte: Troete und Buch sind Tabelleneinträge, die durch ein Komma getrennt werden müssen!
Aufgabe 1.4
Programmiere ein Objekt Xylophon, das bei Benutzung die Nachricht „Kling Klang Klong“ ausgibt. Positioniere das Xylophon im Kinderzimmer.
In der Datei spiele/uebung/kinderzimmer:
kinderzimmer = { name = "Kinderzimmer", objekte = { Xylophon = { benutzen = function(selbst) nachricht("kling klang klong") end } } }
2. Objekte anschauen
Aufgabe 2.1
Bei Anschauen soll die Troete folgende Nachricht ausgeben: „Die Tröte ist ganz schön alt und verbeult.“
In der Datei spiele/uebung/_spieler:
objekte = { Troete = { benutzen = function(selbst) nachricht("Tröööööt!") end, anschauen = function(selbst) nachricht("Die Tröte ist ganz schön alt und verbeult.") end }, ...
Beachte auch hier: Die Tröte ist – wie alle Objekte – eine Tabelle. Die Funktionen benutzen und anschauen sind Tabelleneinträge, und müssen mit einem Komma getrennt werden!
Aufgabe 2.2
Das Buch soll bei Anschauen folgende Nachricht ausgeben: „Das Buch trägt den Titel: Textadventures heil und gesund überstehen – 1000 Tipps für Anfänger und Profis.“
In der Datei spiele/uebung/_spieler:
Buch = { benutzen = function(selbst) nachricht("Du schnappst Dir das Buch und liest eine Runde.") end, anschauen = function(selbst) nachricht("Das Buch trägt den Titel: Textadventures heil und gesund überstehen - 1000 Tipps für Anfänger und Profis.") end }
3. Eigenschaften von Objekten
Aufgabe 3.1
Füge der Troete eine Eigenschaft troetzaehler hinzu. Sie soll am Anfang den Wert 0 haben und bei jedem Tröten um 1 erhöht werden. Dazu soll nach jedem tröten eine Nachricht wie „Du hast 2 mal getrötet“ erscheinen.
– Die Troete ist (wie alle Objekte!!!) eine Tabelle. Also ist troetenzaehler
ein Tabelleneintrag.
– Innerhalb der Funktion benutzen(selbst)
kriegst Du den Wert des Zählers über selbst.troetenzaehler
– Die Erhöhung um 1 sieht so aus: selbst.troetzaehler = selbst.troetzaehler + 1
– nachricht("Du hast " .. selbst.troetzaehler .. " mal getrötet")
liefert die gewünschte Ausgabe.
In der Datei spiele/uebung/_spieler:
Troete = { troetzaehler = 0, benutzen = function(selbst) nachricht("Tröööööt!") selbst.troetzaehler = selbst.troetzaehler + 1 nachricht("Du hast " .. selbst.troetzaehler .. " mal getrötet") end, anschauen = function(selbst) nachricht("Die Tröte ist ganz schön alt und verbeult.") end },
Aufgabe 3.2
Sorge dafür, dass die Spielerin oder der Spieler maximal dreimal tröten darf. Bei einem erneuten Versuch soll die Nachricht „Jetzt ist aber mal gut mit dem Getröte!“ erscheinen.
Du musst den Wert des Zählers mit if
abfragen: if selbst.troetenzaehler < 3 then ...
In der Datei spiele/uebung/_spieler:
Troete = { troetzaehler = 0, benutzen = function(selbst) if selbst.troetzaehler < 3 then nachricht("Tröööööt!") selbst.troetzaehler = selbst.troetzaehler + 1 nachricht("Du hast " .. selbst.troetzaehler .. " mal getrötet") else nachricht("Jetzt ist aber mal gut mit dem Getröte!") end end, ...
4. Objekte gemeinsam benutzen
Aufgabe 4.1
Erzeuge ein Objekt Erfrischer, das, gemeinsam mit der Troete benutzt, den Troetenzaehler auf 0 setzt.
In der Datei spiele/uebung/_spieler:
Erfrischer = { benutzen_mit = function(selbst, partner) partner.troetzaehler = 0 end },
5. Orte anlegen und verbinden
Zustand vor Lösung der Aufgaben
Aufgabe 5.1
Erzeuge einen neuen Ort flur
. Schau Dir dafür den Ort kinderzimmer
an.
In der neuen Datei uebung/flur.lua
flur = { name = "Flur", objekte = { } }
Aufgabe 5.2
Der neue Flur nützt Dir nichts, da es keinen Weg gibt, um dorthin zu gelangen! Positioniere ein Objekt Tuer
im kinderzimmer
, das bei Benutzung den Ort des Spielers ändert. Verwende dafür die Funktion ort_wechseln(neuer_ort)
.
In der neuen Datei spiele/uebung/kinderzimmer.lua
kinderzimmer = { name = "Kinderzimmer", objekte = { ... Tuer = { benutzen = function(selbst) ort_wechseln(flur) end } } }
Aufgabe 5.3
Verpasse dem Flur eine Kinderzimmertuer, über die Du wiederum in den Flur gelangen kannst.
In der neuen Datei spiele/uebung/flur.lua
flur = { name = "Flur", objekte = { Kinderzimmertuer = { benutzen = function(selbst) ort_wechseln(kinderzimmer) end } } }
Aufgabe 5.4
Die Funktion ort_wechseln() liefert eine Standard-Nachricht „Du gehst nach Flur“ oder „Du gehst nach Kinderzimmer“. Mit einem zweiten Argument nach dem neuen Ort kannst Du eine individuelle Nachricht bestimmen. Probiere das aus!
Zustand nach Lösung der Aufgaben
6. Dem Spiel ein Ziel geben
In der Datei _ziele
ist eine Tabelle ziele()
definiert. Die legt fest, was die Spielerin oder der Spieler erledigen muss, um das Spiel abzuschliessen. Genauer gesagt: eine Funktion überprüft, ob alle Elemente in der Tabelle true
sind. Ist das der Fall, wird der Inhalt des Tabellenelementes nachricht
ausgegeben.
Aufgabe 6.1
– Benenne das Feld ziel1
in knopf1_gedrueckt
um.
– Du kannst bei der Gelegenheit auch die Glückwunschnachricht anpassen.
– Positioniere im Kinderzimmer ein Objekt Knopf1
.
– Sorge dafür, dass bei Benutzen von Knopf1
das Feld knopf1_gedrueckt
auf true
gesetzt wird.
In der Datei spiele/uebung/_ziele.lua:
ziele = { knopf1_gedrueckt = false, nachricht = "Du hast den Knopf gedrückt, herzlichen Glückwunsch!" }
In der Datei spiele/uebung/kinderzimmer.lua:
objekte = { ... Knopf1 = { benutzen = function(selbst) ziele.knopf1_gedrueckt = true end } }
Aufgabe 6.2
Positioniere ein Objekt Knopf2 auf dem Flur, der ansonsten genau so funktionieren soll wie Knopf1.
In der Datei spiele/uebung/_ziele.lua:
ziele = { knopf1_gedrueckt = false, knopf2_gedrueckt = false, nachricht = "Du hast alle Knöpfe gedrückt, herzlichen Glückwunsch!" }
In der Datei spiele/uebung/flur.lua:
objekte = { ... Knopf2 = { benutzen = function(selbst) ziele.knopf2_gedrueckt = true end } }
Aufgabe 6.3 Für Expert:innen
– Lege einen Raum Küche an.
– Sorge dafür, dass Du mit einer Tür vom Flur in die Küche wechseln kannst.
– Positioniere ein Objekt Knopf3 in der Küche
– Füge das Drücken des dritten Knopfes den Zielen hinzu.
In der Datei spiele/uebung/_ziele.lua:
ziele = { knopf1_gedrueckt = false, knopf2_gedrueckt = false, knopf3_gedrueckt = false, nachricht = "Du hast alle Knöpfe gedrückt, herzlichen Glückwunsch!" }
In der Datei spiele/uebung/flur.lua:
objekte = { ... Kuechentuer = { schwer = true, benutzen = function(selbst) ort_wechseln(kueche, "Die Tür öffnet sich knarrend und Du gehst in die Kueche.") end } }
In der neuen Datei spiele/uebung/kueche.lua:
kueche = { name = "Küche", objekte = { Knopf3 = { benutzen = function(selbst) ziele.knopf3_gedrueckt = true end } } }