Gestaltungsorientierte Informatik

Dies ist eine alte Version des Dokuments!


Ich packe meinen Rucksack … (Listen)

Kaum ein Textadventure kommt ohne einen Rucksack aus. Viele Rätsel erfordern, dass man vorher an einem anderen Ort Gegenstände eingesammelt hat. Diese müssen „irgendwie“ transportiert werden, z.B. in einem Rucksack oder verallgemeinert in einem „Inventar“. Programmiertechnisch bedeutet das, dass man sich Information über den Stand des Abenteuers merken muss. Wurde der rostigeSchlüssel schon eingesammelt? Python bietet dafür als Datentyp die Liste an.

Eine Liste ist – wie der Name schon sagt – eine Aufzählung von Daten. Man kann also in einer Liste Strings, Zahlen, Wahrheitswerte (und sogar andere Listen) zusammenfassen. Es gibt einfach Anweisungen, mit denen man Daten einer Liste hinzufügen, entfernen oder sie darin suchen kann. Anders als in einem Rucksack, in dem die Dinge oft durcheinander geraten, bleiben Daten in einer Liste immer in der Reihenfolge, in der man sie hinzugefügt hat.

Schauen wir uns ein einfaches Beispiel an.

listen.py
  1. inventar = ["Fackel", "Seil", "Proviant", "Wasserflasche"]
  2.  
  3. def waldlichtung():
  4. gute_antwort = False
  5. while not gute_antwort:
  6. print("Waldlichtung")
  7. print("Du befindest dich auf einer kleinen Lichtung im Wald. Hohe Bäume umringen den Platz, ihr Blätterdach lässt nur vereinzelte Sonnenstrahlen hindurch. Ein schmaler Pfad führt nach Norden und ein anderer nach Osten. Der Boden ist weich, mit Moos bedeckt, und du meinst, in der Ferne das Plätschern von Wasser zu hören.")
  8. wahl = input("Wohin soll es gehen? (n=Norden, o=Osten) ")
  9. if wahl == "n":
  10. gute_antwort = True
  11. flussufer()
  12. elif wahl == "o":
  13. gute_antwort = True
  14. verlasseneHuette()
  15. else:
  16. dunklerWald()
  17.  
  18. def flussufer():
  19. gute_antwort = False
  20. while not gute_antwort:
  21. print("Flussufer")
  22. print("Der Pfad mündet an ein glitzerndes Flussufer. Das Wasser ist klar und fließt ruhig dahin, doch weiter auf der anderen Seite siehst du dichten Wald. Ein alter Holzsteg ragt ein Stück in den Fluss – instabil, aber vielleicht noch nutzbar. Du kannst zurück nach Süden zur Waldlichtung gehen oder versuchen, den Holzsteg zu betreten.")
  23. wahl = input("Wohin soll es gehen? (s=Süden, h=Holzsteg) ")
  24. if wahl == "s":
  25. gute_antwort = True
  26. waldlichtung()
  27. elif wahl == "h":
  28. gute_antwort = True
  29. holzsteg()
  30. else:
  31. dunklerWald()
  32.  
  33. def holzsteg():
  34. gute_antwort = False
  35. while not gute_antwort:
  36. print("Holzsteg")
  37. if "Rostiger Schlüssel" in inventar:
  38. print("Der Steg ächzt und wankt unter deinem Gewicht, aber er hält. Unter dir fließt das Wasser klar und ruhig dahin. Du kannst zurück zum Flussufer gehen.")
  39. wahl = input("Was willst du tun? (f=zum Flussufer gehen) ")
  40. if wahl == "f":
  41. gute_antwort = True
  42. flussufer()
  43. else:
  44. print("Der Steg ächzt und wankt unter deinem Gewicht, aber er hält. Unter dir fließt das Wasser klar und ruhig dahin. Du beobachtest einige Fische und plötzlich siehst du einen rostigen Schlüssel auf Grund des Flusses liegen. Du kannst zurück zum Flussufer gehen oder versuchen, den Schlüssel zu nehmen.")
  45. wahl = input("Was willst du tun? (f=zum Flussufer gehen, s=Schlüssel nehmen) ")
  46. if wahl == "f":
  47. gute_antwort = True
  48. flussufer()
  49. elif wahl == "s":
  50. gute_antwort = True
  51. inventar.append("Rostiger Schlüssel")
  52. holzsteg()
  53.  
  54. def verlasseneHuette():
  55. gute_antwort = False
  56. while not gute_antwort:
  57. print("Verlassene Hütte")
  58. print("Ein schmaler Weg führt dich zu einer kleinen, verwitterten Hütte. Die Fenster sind blind vor Staub, die Tür geschlossen. Drinnen scheint es dunkel, aber du meinst, einen schwachen Geruch von Rauch wahrzunehmen – vielleicht war hier kürzlich jemand. Du kannst zurück nach Westen, zur Waldlichtung, oder versuchen, die Tür zu öffnen.")
  59. wahl = input("Was willst du tun? (w=nach Westen gehen, t=die Tür öffnen) ")
  60. if wahl == "w":
  61. gute_antwort = True
  62. waldlichtung()
  63. elif wahl == "t":
  64. if "Rostiger Schlüssel" in inventar:
  65. print("Die Tür ist verschlossen, aber der rostige Schlüssel passt und du kannst die Tür aufschließen. Die Hütte ist leer und kalt und du verlässt sie sofort wieder.")
  66. else:
  67. print("Die Tür ist verschlossen und du kannst sie nicht öffnen.")
  68. else:
  69. dunklerWald()
  70.  
  71. def dunklerWald():
  72. print("Dunkler Wald")
  73. print("Du verlässt den schmalen Pfad und schlägst dich durchs Unterholz. Schon nach wenigen Schritten verdunkelt sich das Licht, und die Luft wird kälter. Der Wald wirkt hier älter, dichter – fast lebendig. Zwischen den knorrigen Wurzeln scheint Nebel aufzusteigen, der lautlos über den Boden kriecht. Schnell kehrst du um, bevor du den Weg zurück nicht mehr findest.")
  74.  
  75. waldlichtung()

Wie immer: Führe das Programm mit Thonny aus und untersuche, wie es funktioniert. Achte besonders auf die Zeile 1 sowie die Funktion holzsteg(). Benutze den Debugger und lasse dir die Variablen anzeigen.

In Zeile 1 wird die Listen-Variable inventar initialisiert. Listen schreibt man in eckigen Klammern und die Listenelemente werden durch Kommas voneinander getrennt. Anfänglich enthält unsere Liste schon vier Elemente, nämlich die Strings: „Fackel“, „Seil“, „Proviant“ und „Wasserflasche“. Beachte, dass man Variablen, die man verwenden möchte, immer zunächst initialisieren muss. Das heißt, man muss Variablen zunächst einen Wert zuweisen. Andernfalls bekommt man eine Fehlermeldung, wenn man auf die Variable zugreift.

Probiere es selbst aus: Lösche die Zeile 1, dann gibt es eine Fehlermeldung, sobald die Programmausführung in Zeile 37 (bzw. 35 oder 36) angekommen ist. Wie lautet die Fehlermeldung?

Möchte man eine leere Liste haben, soll also der Rucksack anfänglich leer sein, dann schreibt man einfach nur „leere“ Klammern:

inventar = []

In der Funktion holzsteg() kanns du sehen, wie man Listen benutzt. In Zeile 37 wird mit dem Operator in geprüft, ob der String „Rostiger Schlüssel“ in der Variablen inventar enthalten ist. Je nachdem, wie die Prüfung ausfällt, wird der if- oder der else-Block der Fallunterscheidung ausgeführt.

textadventure/inventar.1779949838.txt.gz · Zuletzt geändert: von celandir