Gestaltungsorientierte Informatik

Wenn du dir den Code deines bisherigen Programmes (oder des letzten Beispiels) anschaust, dann fällt dir sicher auf, dass viele Teile sehr änlich sind. Das ist ein klassischer Fall für Funktionen. In Funktionen kann man Codeteile zusammenfassen, die immer gleich sind. Bisher hast du das benutzt, um den Code für einzelne Orte in deinem Adventure zusammenzufassen. Es gibt aber weitere Möglichkeiten.

Naheliegend ist, den Code zum Anzeigen des Inventars in eine Funktion auszulagern. Dieser taucht an vielen Stellen in deinem Adventure auf. Wenn du daraus eine eigene Funktion machst, dann sparst du dir zum einen, den immer wieder gleichen Code zu tippen. Zum anderen kannst du später auch leicht die Ausgabe des Inventars an einer Stelle anpassen, falls du z.B. Nummern mit ausgeben möchtest, die Überschrift ändern etc. Das könnte so ausshen:

inventar = ["Fackel", "Seil", "Proviant", "Wasserflasche"]
 
def inventar_anzeigen()
    print("Inventar:")
    for ding in inventar:
        print(ding)

Dort, wo du diese Anweisungen bisher in deinem Code stehen hattest, kannst du nun „einfach“ die Funktion inventar_anzeigen() aufrufen:

wahl = input("Wohin soll es gehen? (n=Norden, o=Osten, i=Inventar) ")
if wahl == "i":
    inventar_anzeigen()

Baue jetzt eine solche Funktion in dein eigenes Adventure ein. Denke daran, überall dort den Funktionsaufruf einzubauen, wo du bisher das Inventar direkt ausgibst.


Wenn Code nur ähnlich ist, dann kann man die Parameter einer Funktion verwenden, um sie etwas flexibler zu gestalten. Ein gutes Beispiel dafür ist die Eingabe, die an jedem Ort ähnlich ist, sich aber auch unterscheidet, weil es durchaus unterschiedliche Auswahlmöglichleiten gibt. Dazu müssen wir das Programm etwas umbauen, wir schauen uns das wieder an einem Beispiel an.

eingabe20a.py
  1. inventar = ["Fackel", "Seil", "Proviant", "Wasserflasche"]
  2.  
  3. def inventar_anzeigen():
  4. print("Inventar:")
  5. for ding in inventar:
  6. print(ding)
  7.  
  8. def eingabe(text, moeglichkeiten):
  9. gute_antwort = False
  10. while not gute_antwort:
  11. wahl = input(text)
  12. if wahl in moeglichkeiten:
  13. gute_antwort = True
  14. return wahl
  15. else:
  16. gute_antwort = False
  17. print("Das ist hier leider nicht möglich.")
  18.  
  19. def waldlichtung():
  20. print("Waldlichtung")
  21. 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.")
  22. wahl = eingabe("Wohin soll es gehen? (n=Norden, o=Osten, i=Inventar) ", ["n","o","i"])
  23. if wahl == "i":
  24. inventar_anzeigen()
  25. waldlichtung()
  26. elif wahl == "n":
  27. flussufer()
  28. elif wahl == "o":
  29. verlasseneHuette()
  30.  
  31. def flussufer():
  32. print("Flussufer")
  33. 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.")
  34. wahl = eingabe("Wohin soll es gehen? (s=Süden, h=Holzsteg, i=Inventar) ", ["s", "h", "i"])
  35. if wahl == "i":
  36. inventar_anzeigen()
  37. flussufer()
  38. elif wahl == "s":
  39. waldlichtung()
  40. elif wahl == "h":
  41. holzsteg()
  42.  
  43. def holzsteg():
  44. print("Holzsteg")
  45. if "Rostiger Schlüssel" in inventar:
  46. 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.")
  47. wahl = eingabe("Was willst du tun? (f=zum Flussufer gehen, i=Inventar) ", ["f", "i"])
  48. if wahl == "i":
  49. inventar_anzeigen()
  50. holzsteg()
  51. elif wahl == "f":
  52. flussufer()
  53. else:
  54. 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.")
  55. wahl = eingabe("Was willst du tun? (f=zum Flussufer gehen, s=Schlüssel nehmen, i=Inventar) ", ["f", "s", "i"])
  56. if wahl == "i":
  57. inventar_anzeigen()
  58. holzsteg()
  59. elif wahl == "f":
  60. flussufer()
  61. elif wahl == "s":
  62. inventar.append("Rostiger Schlüssel")
  63. holzsteg()
  64.  
  65. def verlasseneHuette():
  66. print("Verlassene Hütte")
  67. 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.")
  68. wahl = eingabe("Was willst du tun? (w=nach Westen gehen, t=die Tür öffnen, i=Inventar) ", ["w", "t", "i"])
  69. if wahl == "i":
  70. inventar_anzeigen()
  71. verlasseneHuette()
  72. elif wahl == "w":
  73. waldlichtung()
  74. elif wahl == "t":
  75. if "Rostiger Schlüssel" in inventar:
  76. 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.")
  77. else:
  78. print("Die Tür ist verschlossen und du kannst sie nicht öffnen.")
  79. verlasseneHuette()
  80.  
  81. waldlichtung()

Neu ist hier die Funktion eingabe(text, moeglichkeiten). Diese Funktion erweitert die Funktion input(text), un prüft gleich, ob die eingegebenen Werte zulässig sind. Dazu übergeben wir der Funktion eingabe() neben dem Text, der angezeigt werden soll, auch eine Liste mit zulässigen Eingabemöglichkeiten. Die Funktion fragt jetzt so lange nach, bis eine zulässige Option eingegeben wurde. Sobald eine zulässige Option eingegeben wurde, gibt die Funktion mit dem Ausdruck return wahl den eingegebenen Text zurück und beendet sich dadurch.

Der restliche Code wird so wesentlich einfacher und übersichtlicher, weil die while-Schleife, die wir zur Prüfung der Eingabe verwendet haben, nun nicht mehr an jedem Ort programmiert werden muss, sondern nur noch an einer Stelle auftaucht.

Noch weiter vereinfachen können wir den Code, wenn wir die Ausgabe des Inventars direkt in der Funktion eingabe() abhandeln. Dann brauchen uns auch darum im Weiteren nicht mehr zu kümmern. Das könnte dann so aussehen:

eingabe20b.py
  1. inventar = ["Fackel", "Seil", "Proviant", "Wasserflasche"]
  2.  
  3. def inventar_anzeigen():
  4. print("Inventar:")
  5. for ding in inventar:
  6. print(ding)
  7.  
  8. def eingabe(text, moeglichkeiten):
  9. gute_antwort = False
  10. while not gute_antwort:
  11. wahl = input(text)
  12. if wahl in moeglichkeiten:
  13. if wahl == "i":
  14. gute_antwort = False
  15. inventar_anzeigen()
  16. else:
  17. gute_antwort = True
  18. return wahl
  19. else:
  20. gute_antwort = False
  21. print("Das ist hier leider nicht möglich.")
  22.  
  23. def waldlichtung():
  24. print("Waldlichtung")
  25. 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.")
  26. wahl = eingabe("Wohin soll es gehen? (n=Norden, o=Osten, i=Inventar) ", ["n","o","i"])
  27. if wahl == "n":
  28. flussufer()
  29. elif wahl == "o":
  30. verlasseneHuette()
  31.  
  32. def flussufer():
  33. print("Flussufer")
  34. 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.")
  35. wahl = eingabe("Wohin soll es gehen? (s=Süden, h=Holzsteg, i=Inventar) ", ["s", "h", "i"])
  36. if wahl == "s":
  37. waldlichtung()
  38. elif wahl == "h":
  39. holzsteg()
  40.  
  41. def holzsteg():
  42. print("Holzsteg")
  43. if "Rostiger Schlüssel" in inventar:
  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 kannst zurück zum Flussufer gehen.")
  45. wahl = eingabe("Was willst du tun? (f=zum Flussufer gehen, i=Inventar) ", ["f", "i"])
  46. if wahl == "f":
  47. flussufer()
  48. else:
  49. 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.")
  50. wahl = eingabe("Was willst du tun? (f=zum Flussufer gehen, s=Schlüssel nehmen, i=Inventar) ", ["f", "s", "i"])
  51. if wahl == "f":
  52. flussufer()
  53. elif wahl == "s":
  54. inventar.append("Rostiger Schlüssel")
  55. holzsteg()
  56.  
  57. def verlasseneHuette():
  58. print("Verlassene Hütte")
  59. 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.")
  60. wahl = eingabe("Was willst du tun? (w=nach Westen gehen, t=die Tür öffnen, i=Inventar) ", ["w", "t", "i"])
  61. if wahl == "w":
  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. verlasseneHuette()
  69.  
  70. waldlichtung()
textadventure/eingabe20.txt · Zuletzt geändert: von celandir