| Nächste Überarbeitung | Vorherige Überarbeitung |
| textadventure:eingabe20 [2026/05/29 10:30] – angelegt celandir | textadventure:eingabe20 [2026/05/29 11:26] (aktuell) – celandir |
|---|
| 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. | 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. |
| |
| Eine naheliegende Möglichkeit ist der Code zum Anzeigen des Inventars. 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: | 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: |
| |
| <code python[enable_line_numbers="true"]> | <code python> |
| inventar = ["Fackel", "Seil", "Proviant", "Wasserflasche"] | inventar = ["Fackel", "Seil", "Proviant", "Wasserflasche"] |
| |
| </code> | </code> |
| |
| | Dort, wo du diese Anweisungen bisher in deinem Code stehen hattest, kannst du nun "einfach" die Funktion ''inventar_anzeigen()'' aufrufen: |
| | |
| | <code python> |
| | wahl = input("Wohin soll es gehen? (n=Norden, o=Osten, i=Inventar) ") |
| | if wahl == "i": |
| | inventar_anzeigen() |
| | </code> |
| | |
| | <div todo> |
| | Baue jetzt eine solche Funktion in dein eigenes Adventure ein. Denke daran, überall dort den Funktionsaufruf einzubauen, wo du bisher das Inventar direkt ausgibst. |
| | </div> |
| | |
| | ---- |
| | |
| | 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. |
| | |
| | <file python eingabe20a.py[enable_line_numbers="true"]> |
| | inventar = ["Fackel", "Seil", "Proviant", "Wasserflasche"] |
| | |
| | def inventar_anzeigen(): |
| | print("Inventar:") |
| | for ding in inventar: |
| | print(ding) |
| | |
| | def eingabe(text, moeglichkeiten): |
| | gute_antwort = False |
| | while not gute_antwort: |
| | wahl = input(text) |
| | if wahl in moeglichkeiten: |
| | gute_antwort = True |
| | return wahl |
| | else: |
| | gute_antwort = False |
| | print("Das ist hier leider nicht möglich.") |
| | |
| | def waldlichtung(): |
| | print("Waldlichtung") |
| | 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.") |
| | wahl = eingabe("Wohin soll es gehen? (n=Norden, o=Osten, i=Inventar) ", ["n","o","i"]) |
| | if wahl == "i": |
| | inventar_anzeigen() |
| | waldlichtung() |
| | elif wahl == "n": |
| | flussufer() |
| | elif wahl == "o": |
| | verlasseneHuette() |
| | |
| | def flussufer(): |
| | print("Flussufer") |
| | 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.") |
| | wahl = eingabe("Wohin soll es gehen? (s=Süden, h=Holzsteg, i=Inventar) ", ["s", "h", "i"]) |
| | if wahl == "i": |
| | inventar_anzeigen() |
| | flussufer() |
| | elif wahl == "s": |
| | waldlichtung() |
| | elif wahl == "h": |
| | holzsteg() |
| | |
| | def holzsteg(): |
| | print("Holzsteg") |
| | if "Rostiger Schlüssel" in inventar: |
| | 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.") |
| | wahl = eingabe("Was willst du tun? (f=zum Flussufer gehen, i=Inventar) ", ["f", "i"]) |
| | if wahl == "i": |
| | inventar_anzeigen() |
| | holzsteg() |
| | elif wahl == "f": |
| | flussufer() |
| | else: |
| | 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.") |
| | wahl = eingabe("Was willst du tun? (f=zum Flussufer gehen, s=Schlüssel nehmen, i=Inventar) ", ["f", "s", "i"]) |
| | if wahl == "i": |
| | inventar_anzeigen() |
| | holzsteg() |
| | elif wahl == "f": |
| | flussufer() |
| | elif wahl == "s": |
| | inventar.append("Rostiger Schlüssel") |
| | holzsteg() |
| | |
| | def verlasseneHuette(): |
| | print("Verlassene Hütte") |
| | 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.") |
| | wahl = eingabe("Was willst du tun? (w=nach Westen gehen, t=die Tür öffnen, i=Inventar) ", ["w", "t", "i"]) |
| | if wahl == "i": |
| | inventar_anzeigen() |
| | verlasseneHuette() |
| | elif wahl == "w": |
| | waldlichtung() |
| | elif wahl == "t": |
| | if "Rostiger Schlüssel" in inventar: |
| | 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.") |
| | else: |
| | print("Die Tür ist verschlossen und du kannst sie nicht öffnen.") |
| | verlasseneHuette() |
| | |
| | waldlichtung() |
| | </file> |
| | |
| | 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: |
| | |
| | <file python eingabe20b.py[enable_line_numbers="true"]> |
| | inventar = ["Fackel", "Seil", "Proviant", "Wasserflasche"] |
| | |
| | def inventar_anzeigen(): |
| | print("Inventar:") |
| | for ding in inventar: |
| | print(ding) |
| | |
| | def eingabe(text, moeglichkeiten): |
| | gute_antwort = False |
| | while not gute_antwort: |
| | wahl = input(text) |
| | if wahl in moeglichkeiten: |
| | if wahl == "i": |
| | gute_antwort = False |
| | inventar_anzeigen() |
| | else: |
| | gute_antwort = True |
| | return wahl |
| | else: |
| | gute_antwort = False |
| | print("Das ist hier leider nicht möglich.") |
| | |
| | def waldlichtung(): |
| | print("Waldlichtung") |
| | 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.") |
| | wahl = eingabe("Wohin soll es gehen? (n=Norden, o=Osten, i=Inventar) ", ["n","o","i"]) |
| | if wahl == "n": |
| | flussufer() |
| | elif wahl == "o": |
| | verlasseneHuette() |
| | |
| | def flussufer(): |
| | print("Flussufer") |
| | 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.") |
| | wahl = eingabe("Wohin soll es gehen? (s=Süden, h=Holzsteg, i=Inventar) ", ["s", "h", "i"]) |
| | if wahl == "s": |
| | waldlichtung() |
| | elif wahl == "h": |
| | holzsteg() |
| | |
| | def holzsteg(): |
| | print("Holzsteg") |
| | if "Rostiger Schlüssel" in inventar: |
| | 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.") |
| | wahl = eingabe("Was willst du tun? (f=zum Flussufer gehen, i=Inventar) ", ["f", "i"]) |
| | if wahl == "f": |
| | flussufer() |
| | else: |
| | 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.") |
| | wahl = eingabe("Was willst du tun? (f=zum Flussufer gehen, s=Schlüssel nehmen, i=Inventar) ", ["f", "s", "i"]) |
| | if wahl == "f": |
| | flussufer() |
| | elif wahl == "s": |
| | inventar.append("Rostiger Schlüssel") |
| | holzsteg() |
| | |
| | def verlasseneHuette(): |
| | print("Verlassene Hütte") |
| | 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.") |
| | wahl = eingabe("Was willst du tun? (w=nach Westen gehen, t=die Tür öffnen, i=Inventar) ", ["w", "t", "i"]) |
| | if wahl == "w": |
| | waldlichtung() |
| | elif wahl == "t": |
| | if "Rostiger Schlüssel" in inventar: |
| | 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.") |
| | else: |
| | print("Die Tür ist verschlossen und du kannst sie nicht öffnen.") |
| | verlasseneHuette() |
| | |
| | waldlichtung() |
| | </file> |
| |
| |
| Wenn Code nur ähnlich ist, dann kann man die **Parameter** einer Funktion verwenden, um sie etwas flexibler zu gestalten. Wir schauen uns das wieder an einem Beispiel an. Der folgende Code stammt aus einer | |