Zum Hauptinhalt springen

Staying DRY

Gut, dass unser Abenteurer im letzten Kapitel trocken geblieben ist. Damit sind auch wir als Programmiererinnen und Programmierer gut beraten. Don't repeat yourself (DRY) ist nämlich eine der wichtigsten Qualitätsregeln beim Programmieren. Doch was genau meinen wir damit?

Gehen Sie dazu am besten nochmal 👉 zurück zum vorherigen Kapitel und schauen Sie sich die Zeilen 10 und 24 genau an. Was fällt Ihnen auf?

Sie werden feststellen, dass die beiden Zeilen identisch sind. Wir wiederholen uns also. Die beiden Zeilen sind nicht nur genau gleich, sondern sie erfüllen auch genau den gleichen Zweck: Sie informieren den Spieler darüber, dass seine Angabe ungültig war, und dass das Spiel damit deshalb vorbei ist. Diese unnötige Wiederholung macht unseren Code nicht nur unübersichtlicher, sondern ist zudem auch eine Fehlerquelle. Was passiert zum Beispiel, wenn wir den Text für diesen Fall anpassen wollen? Wir müssen ihn mehreren Orten anpassen, und die Chance ist gross, dass wir es irgendwo vergessen.

In diesem Kapitel machen wir also nur eine einzige Anpassung: Wir verschieben die "Logik" für den Fall einer ungültigen Wahl in ihre eigene Funktion namens ungueltige_wahl().

def ungueltige_wahl():
print("Ungültige Wahl! Spiel vorbei!")

def fluss():
print("Du stösst auf einen Fluss. Du kannst schwimmen oder eine Brücke suchen.")
auswahl = input("Was möchtest du tun? (schwimmen/brücke): ")
if auswahl == "schwimmen":
print("Du wurdest von einem Krokodil angegriffen! Spiel vorbei!")
elif auswahl == "brücke":
print("Du hast eine versteckte Brücke gefunden und den Fluss sicher überquert.")
print("Du siehst eine Höhle vor dir.")
else:
ungueltige_wahl()

print("Willkommen beim Schatzsuche-Spiel!")
print("Du befindest dich in einem Wald. Du musst den versteckten Schatz finden.")
print("Du stehst an einer Wegkreuzung. Du kannst nach links, rechts oder geradeaus gehen.")

auswahl = input("In welche Richtung möchtest du gehen? (links/rechts/geradeaus): ")
if auswahl == "links":
fluss()
elif auswahl == "rechts":
print("Du begegnest einem Rudel Wölfe. Du kannst entweder rennen oder versuchen, sie zu zähmen.")
elif auswahl == "geradeaus":
print("Du gehst geradeaus und triffst auf eine Riesenspinne.")
else:
ungueltige_wahl()
Sprechender Code

Diese kleine Verbesserung hat noch einen weiteren hübschen Nebeneffekt: Der Code wird gleich viel "sprechender". Beispielsweise können wir die Zeilen 12-13 praktisch als Satzfragment lesen: "else ungueltige wahl", also, "andernfalls ist das eine ungültige Wahl".

Ungültige Eingaben besser behandeln

Das ist noch keine besonders sinnvolle Handhabung falscher Benutzereingaben. Als Benutzer:in werde ich zwar über die falsche Eingabe informiert, habe aber keine Möglichkeit, sie noch zu korrigieren. Das sollten Sie in Ihrem eigenen Text Adventure unbedingt besser machen!

Für Ihr Spiel ist deshalb eine solche Lösung besser geeignet:

def ungueltige_wahl():
print("Ungültige Wahl! Versuche es erneut.")

def fluss():
print("Du stösst auf einen Fluss. Du kannst schwimmen oder eine Brücke suchen.")
auswahl = input("Was möchtest du tun? (schwimmen/brücke): ")
if auswahl == "schwimmen":
print("Du wurdest von einem Krokodil angegriffen! Spiel vorbei!")
elif auswahl == "brücke":
print("Du hast eine versteckte Brücke gefunden und den Fluss sicher überquert.")
print("Du siehst eine Höhle vor dir.")
else:
ungueltige_wahl()
fluss()

Die Benutzerin wird immer noch über die falsche Eingabe informiert. Die fluss()-Funktion ruft sich danach aber einfach nochmal selbst auf. Die «Fluss-Szene» wird also einfach nochmal wiederholt.

An dieser Lösung ist noch etwas unschön, dass der Info-Text Du stösst auf einen Fluss. Du kannst schwimmen oder eine Brücke suchen. ebenfalls erneut ausgegeben wird. Das können wir mit folgendem Trick beheben:

def ungueltige_wahl():
print("Ungültige Wahl! Versuche es erneut.")

def fluss(is_wiederholung = False):
if not is_wiederholung:
print("Du stösst auf einen Fluss. Du kannst schwimmen oder eine Brücke suchen.")
auswahl = input("Was möchtest du tun? (schwimmen/brücke): ")
if auswahl == "schwimmen":
print("Du wurdest von einem Krokodil angegriffen! Spiel vorbei!")
elif auswahl == "brücke":
print("Du hast eine versteckte Brücke gefunden und den Fluss sicher überquert.")
print("Du siehst eine Höhle vor dir.")
else:
ungueltige_wahl()
fluss(is_wiederholung = True)

Wenn Sie diese Lösung in Ihrem Text Adventure umsetzen möchten, lassen Sie sich die technischen Details am besten von der Lehrperson genauer erklären.