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>

Leeres Adventure

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
      
    }

  }

}