Bisher läuft unser Spiel genau eine Runde. Das ist nicht wirklich ein amüsantes Spiel – und das Wort kurzweilig trifft es auch nicht wirklich. Wir wollen, dass unser Spiel so lange läuft, bis entweder ein Spieler gewonnen hat, es unentschieden steht oder das Spiel vorzeitig durch Spieler bewusst beendet wurde.
Bevor wir in unser Spiel eine Schleife einbauen, damit es nicht nach 1 Runde bereits automatisch beendet wird, bauen wir als Erstes die Möglichkeit ein, dass ein Spieler gezielt selber das Spiel beenden kann. Diese Funktion benötigen wir auf jeden Fall - und sobald unser Spiel unendlich lang läuft, ist man froh über die Abbruchmöglichkeit
Spiel beenden über q
Wir wollen die Möglichkeit schaffen, dass der Spieler das Spiel vorzeitig durch die Taste q beenden kann. Gibt der Spieler also anstelle einer Zahl von 1 bis 9 den Buchstaben „q“ ein, soll das Spiel beendet werden. Dazu erweitern wir die Funktion spieler_eingabe()
um eine entsprechende if
-Abfrage.
# Spieleingabe und Kontrolle der Eingabe
def spieler_eingabe():
while True:
spielzug = input("Bitte Feld eingeben: ")
# vorzeitiges Spielende durch Spieler
if spielzug == 'q':
return
try:
spielzug = int(spielzug)
except ValueError:
print("Bitte Zahl von 1 bis 9 eingeben")
else:
if spielzug >= 1 and spielzug <= 9:
return spielzug
else:
print("Zahl muss zwischen 1 und 9 liegen")
Allerdings passt da nicht viel, da unser Spiel bisher sowieso nach einer Eingabe beendet wird. Wir benötigen also eine Schleife, die entweder am Spielende oder durch den Spieler beendet wird.
Hauptroutine notwendig
Diese Schleife ist eigentlich das Hauptprogramm und umfasst später alle Aktion wie
- Spielfeld ausgeben
- Spielereingabe aktivieren
- Kontrolle, ob eine Partei die Partie gewonnen hat
- Kontrolle, ob ein Unentschieden vorliegt
- Wechsel des aktuellen Spielers
- Kontrolle, ob das Spiel vorzeitig beendet werden soll
Unsere bisherigen 2 Funktionsaufrufe für „Spielfeld zeichnen“ und „Spielerzug abfragen“ packen wir in diese Schleife:
while spiel_aktiv:
# aktuelles Spielfeld ausgeben
spielfeld_ausgeben()
# Eingabe des aktiven Spielers
spielzug = spieler_eingabe()
print("Spielzug: " + str(spielzug))
Das Spiel läuft so lange, solange die Variable spiel_aktiv
den Wert True
enthält.
Starten wir das Spiel nun, erhalten wir eine Fehlermeldung mit der Ausgabe „NameError: name spiel_aktiv“ ist nicht definiert.
Für den guten Stil aktivieren wir alle benötigen Variablen am Anfang von unserem Programm als ersten Schritt:
# Spiel Tic-Tac-Toe
print("Tic-Tac-Toe Python Tutorial")
spiel_aktiv = True
Und die am Anfang gesetzte Variable spiel_aktiv
setzen wir auf False
, wenn der Spieler das Spiel vorzeitig durch q beendet. Wichtig ist, dass wir am Anfang der Funktion die verwendete Variable spiel_aktiv
auf global
setzen.
# Spielereingabe und Kontrolle der Eingabe
def spieler_eingabe():
global spiel_aktiv
while True:
spielzug = input("Bitte Feld eingeben: ")
# vorzeitiges Spielende durch Spieler
if spielzug == 'q':
spiel_aktiv = False
return