Python Tutorial
- jetzt Python programmieren lernen

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 solange 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 eh 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 solange, solange die Variable „spiel_aktiv“ den Wert „True“ enthält.

Starten wir das Spiel nun, erhalten wir eine Fehlermeldung mit „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