Dein Ziel ist, dass zwei menschliche Spieler gegeneinander Tic Tac Toe spielen können, in dem sie ihr gewünschtes Feld eingeben und dann das neue Spielfeld angezeigt wird. In dem folgenden Code ist das Spiel für zwei menschliche Spieler implementiert:
# Wir erstellen das Spielfeld.
def init_spielfeld():
spielfeld = [" ",
"1","2","3",
"4","5","6",
"7","8","9"]
return spielfeld
# Da die Indizierung bei 0 beginnt, das aber zu Verwirrung führen kann, bleibt das erste Feld leer.
Anmerkung:
Das Spielfeld besteht aus einem 3x3 Feld. Das Spielfeld soll so dargestellt werden, dass die Zahlen 1 bis 9 darauf sichtbar sind. Beachte, dass wir die Zahlen in der Liste 'spielfeld' als Strings darstellen. Im Spiel kann man dann die Zahl (als Integer) eingeben, auf deren Feld man setzen möchte. Damit die Zahlen auf dem Spielfeld mit der eingegebenen Zahl übereinstimmen, lassen wir in der Liste 'spielfeld' die erste Position leer. In Python beginnt die Indizierung bei Listen bei 0.
# Das Spielfeld wird als 3x3 Feld ausgegeben
def spielfeld_ausgeben(spielfeld):
print(spielfeld[1] + "|" + spielfeld[2] + "|" + spielfeld[3])
print(spielfeld[4] + "|" + spielfeld[5] + "|" + spielfeld[6])
print(spielfeld[7] + "|" + spielfeld[8] + "|" + spielfeld[9])
# Alternative Darstellung des Spielfelds:
# def spielfeld_ausgeben(spielfeld):
# for i in range(1, 10, 3):
# print('-------------')
# print(f'| {spielfeld[i]} | {spielfeld[i+1]} | {spielfeld[i+2]} |')
# print('-------------')
spielfeld = init_spielfeld()
spielfeld_ausgeben(spielfeld)
Wir überprüfen, ob eine Zahl eingegeben wurde. Es ist zum Beispiel nicht möglich, einen Buchstaben in einen Integer mit int() zu verwandeln. Das Programm würde in diesem Fall einen Fehler werfen und abbrechen. Wir nutzen eine Ausnahmebehandlung, die Fehler auffängt.
# Spieler gibt gewünschtes Feld (1-9) oder Abbruch (0) ein
def eingabe():
while True:
try:
# input() nimmt Eingaben über die Tastatur auf
feld = input("Auf welches Feld möchtest du setzen (1-9)? 0 beendet das Spiel.")
feld = int(feld)
break
# Falls keine Zahl eingegeben wurde, Eingabe wiederholen
except ValueError:
print("Bitte eine Zahl eingeben.")
return feld
# Korrekte Eingabe überprüfen
# Die Funktion bekommt das gewünschte Feld und das Spielfeld übergeben. Wenn das Feld eine Zahl zwischen 1 und 9 ist
# und dieses Feld noch frei ist, soll die Funktion "True" zurück geben, ansonsten "False".
def korrekt(feld, spielfeld):
if feld >= 1 and feld <= 9 and spielfeld[feld] != 'X' and spielfeld[feld] != 'O':
print("Das Feld ist frei!")
return True
else:
print("Belegt!")
return False
# Spieler 1 beginnt
spieler = 1
# Es kann 9 mal ein Feld belegt werden
counter = 0
# Spielfeld initialisieren
spielfeld = init_spielfeld()
while True:
# Eingabe des Zuges
print("Es ist Spieler ", spieler, " am Zug.")
feld = eingabe()
if feld == 0:
print("Das Spiel wurde beendet.")
break
# auf korrekte Eingabe überprüfen und Spielzug ausführen
if korrekt(feld, spielfeld):
if spieler == 1:
spielfeld[feld] = 'X'
naechster_spieler = 2
else:
spielfeld[feld] = 'O'
naechster_spieler = 1
else:
print("Bitte ein korrektes Feld eingeben.")
continue
spielfeld_ausgeben(spielfeld)
if gewonnen(spielfeld):
print("Spieler {} gewinnt das Spiel!".format(spieler))
break
else:
spieler = naechster_spieler
# sind alle Felder belegt?
counter += 1
if counter == 9:
print("Das Spiel ist zu Ende.")
break
Super! Jetzt kannst du Tic Tac Toe gegen einen menschlichen Mitspieler spielen!
Schreibe eine Funktion, die erkennt, ob ein Spieler gewonnen hat!
# Funktion, die überprüft, ob ein Spieler gewonnen hat
def gewonnen(spielfeld):
# Horizontalen (Zeilen) überprüfen
for i in range(1,10,3):
if spielfeld[i] == spielfeld[i+1] == spielfeld[i+2]:
return True
# Vertikalen (Spalten) überprüfen
for i in range(1,4):
if spielfeld[i] == spielfeld[i+3] == spielfeld[i+6]:
return True
# Diagonalen überprüfen
if spielfeld[1] == spielfeld[5] == spielfeld[9]:
return True
elif spielfeld[7] == spielfeld[5] == spielfeld[3]:
return True
else:
return False
Wenn ihr Fragen oder Anregungen zu der Aufgabe (oder Lösung) habt, dann tauscht euch gerne im Chat darüber aus oder schreibt uns eine E-Mail (an info@bw-ki.de).
Wir freuen uns auch immer über Feedback (auch unter info@bw-ki.de):