Seite 1 von 1

Tic Tac Toe Spiel

Verfasst: Mittwoch 1. Juli 2020, 19:21
von Schokiii1993
Hallo zusammen,

ich möchte gerade mein eigenes Tic Tac Toe Spiel entwickeln (das ist mein erstes Projekt). Ich weiß, dazu gibt es unzählige Beispiele im Internet, jedoch möchte ich meine eigene Lösung entwickeln und möglichst viel "Hirnschmalz" hineinstecken. Nun stecke ich jedoch seit einiger Zeit an einer Stelle fest und brauche dringend Rat.

Folgenden Code für ein 3x3 Raster habe ich bereits angelegt:

Code: Alles auswählen

print("+-------" * 3 + "+", sep="") #Erste Zeile
for row in range(3): #Insgesamt 3 Zeilen
	print("|       " * 4)
	for col in range(3):
		print("|   " + "x" + "   ", end="")
	print("|")
	print("|       " * 4)
	print("+-------" * 3,"+",sep="")
So sieht das Board aus:
Bild

Nun geht es um folgendes: anstelle von x (siehe oben) sollen nun die Zahlen von 1-9 in das Raster geschrieben werden. Oben links steht die 1, während unten rechts die 9 steht. Auf dieses Raster möchte ich anschließend zugreifen können. Mein Gedanke ging bisher dahingehend, dass das Board folgenden Aufbau haben könnte:

Code: Alles auswählen

board = [[1, 2, 3], [1, 2, 3]]
row = board[0]
col = board[1]
Mithilfe einer Schleife kann ich auf das Board zugreifen:

Code: Alles auswählen

eingabe = False
while eingabe == False:
	reihe = int(input("Reihe: "))
	spalte = int(input("Spalte: "))
	if reihe in row and spalte in col:
		print("Reihe:", reihe, "Spalte:", spalte)
		eingabe == True
	else:
		continue
In diesem Fall wird einfach nur ausgegeben, welche Zahlen aus dem Raster der Nutzer eingegeben hat. Gibt man Zahlen ein, die sich nicht im Board befinden, läuft die Schleife einfach weiter (das habe ich nur für mich gemacht, um zu sehen, ob das überhaupt funktioniert :lol: das ist natürlich keine endgültige Lösung).

Ich stehe derzeit komplett auf dem Schlauch und habe keine Idee, wie ich in das Raster die Zahlen von 1-9 schreiben und anschließend auch auf diese zugreifen kann.

Ich bedanke mich im Voraus :mrgreen:

Grüße

Schokiii

Re: Tic Tac Toe Spiel

Verfasst: Freitag 3. Juli 2020, 21:59
von Caskuda
Hallo Schokiii,

du müsstest erstmal dafür sorgen, dass dein "Board" auch genug Platz für die 9 Felder hat.
Momentan hast du nur 2 Listen mit je 3 Elementen darin.

Mit z.B.:

Code: Alles auswählen

board = [['0' for _ in range(3)] for __ in range(3)]
board[1][2] = '6'
print(board)


print("+-------" * 3 + "+", sep="") #Erste Zeile
for row in range(3): #Insgesamt 3 Zeilen
	print("|       " * 4)
	for col in range(3):
		print("|   " + board[row][col] + "   ", end="")
	print("|")
	print("|       " * 4)
	print("+-------" * 3,"+",sep="")




spielfeld = {0,1,2}
spieler = 0
eingabe = False
while eingabe == False:
	print(f'Spieler {spieler + 1} ist am Zug.')
	reihe = int(input("Reihe: ")) -1 # 1-> 0, 2--> 1, 3-->2  für das ansprechen der Indizes
	spalte = int(input("Spalte: ")) -1
	if reihe in spielfeld and spalte in spielfeld:
		print("Reihe:", reihe, "Spalte:", spalte)
		if spieler == 1:
			board[reihe][spalte] = 'O' #
		else:
			board[reihe][spalte] = 'X'
		spieler = (spieler +1) % 2 # im nächsten Durchlauf ist Spieler == 0.
		eingabe = True
	else:
		print('Bitte Reihe und Spalte zwischen 1 und 3 eingeben.')

print("+-------" * 3 + "+", sep="") #Erste Zeile
for row in range(3): #Insgesamt 3 Zeilen
	print("|       " * 4)
	for col in range(3):
		print("|   " + board[row][col] + "   ", end="")
	print("|")
	print("|       " * 4)
	print("+-------" * 3,"+",sep="")

hättest du eine zweidimensionale Liste. Und kannst dann mit board[<zeilenindex>][<spaltenindex>] die einzelnen Felder deines Spielbrettes ansteuern.
Beachte, dass die Listen in Python mit dem Index 0 beginnen. Du müsstest deine Bedingung entsprechend anpassen.

Wie du siehst, habe ich hier zweimal den Code für die Ausgabe deines Spielfeldes geschrieben. Das lässt sich mit Funktionen vereinfachen.

Versuch mal die Eingabe der Spieler und die Bildschirmausgabe deines Boards jeweils in einer Funktion zusammenzufassen.

Für den Spielverlauf musst du dir noch Bedingungen überlegen, wann das Spiel mit einem Sieg endet (3 in einer Reihe, Spalte, Diagonale)
oder nach wieviel Zügen es unentschieden ausgehen wird.

Das ganze Spiel kannst du dann in einer Schleife (while True:) laufen lassen, bis eine der Bedingungen die Schleife abbricht.

Re: Tic Tac Toe Spiel

Verfasst: Freitag 3. Juli 2020, 23:19
von Sirius3
@Caskuda: _ steht für eine Variable, die nicht verwendet wird, statt __ kannst Du also nochmals _ benutzen. Eingerückt wird immer mit 4 Leerzeichen pro Ebene, keine Tabs.
Über einen Index zu iterieren ist ein Anti-Pattern, da man direkt über das board iterieren könnte.

Code: Alles auswählen

board = [['0' for _ in range(3)] for _ in range(3)]
board[1][2] = '6'

print("-------".join('++++'))
for row in board:
    print("       ".join('||||'))
    print("|{}|".format("|".join(f"{field:^7}" for field in row)))
    print("       ".join('||||'))
    print("-------".join('++++'))
Wenn Du prüfen willst, ob eine Zahl in einem Bereich ist, dann geht das mit 0 <= row < len(board) oder row in range(len(board)), dafür braucht man kein Set.
Die while-Schleife wäre eine while True-Schleife, die an der passenden Stelle per break verlassen wird, dann braucht man kein Flag.

Code: Alles auswählen

spieler = "X"
while True:
    print(f'Spieler {spieler} ist am Zug.')
    reihe = int(input("Reihe: ")) - 1
    spalte = int(input("Spalte: ")) - 1
    if 0 <= reihe < len(board) and 0 <= spalte < len(board[0]):
        break
    print('Bitte Reihe und Spalte zwischen 1 und 3 eingeben.')

print("Reihe:", reihe, "Spalte:", spalte)
board[reihe][spalte] = spieler
spieler = "O" if spieler == "X" else "X"
Eigentlich müßte man noch den Fehler abfangen, falls keine Zahl eingegeben wird.