Python Tic-Tac-Toe: Winner-Logik?
Hey,
Ich arbeite gerade an Tic-Tac-Toe. Muss man denn bei der Gewinner-Prüfung alle Kombinationen prüfen, sprich
def check():
if board[0] == 'X' and board[1] == 'X' and board[3] == 'X':
return 'X'
if board[4] == 'X' and board[5] == 'X' and board[6] == 'X':
return 'X'
#...
Oder gibt es da vielleicht eine übersichtlichere, kürzere Variante?
Danke im Vorraus!
5 Antworten
Ich weiß von keiner effizienteren Methode, allerdings kannst du (vielleicht hättest du es eh so gemacht) einen string definieren, der jede Runde entweder "X" oder "O" enthält (und sich jede Runde ändert) sodass du nur prüfen musst, ob die jeweiligen Felder (also Listeneinträge) gleich dieser Variable sind. Möglicherweise sparst du dir dadurch die Hälfte dieser Methode...
Du kannst alle Spalten und alle Reihen auf einmal machen.
1-2-3, 4-5-6, 7-8-9, das ist ja alles das selbe, nur um 3 verschoben.
Heisst du kannst eine Schleife machen die von 0-2 geht und dann in der Schleife die jeweilige Reihe (3*i+1, 3*i+2, 3*i+3) überprüfen.
Selbes für die Spalten, da kannste auch alle drei mithilfe einer Schleife machen.
Die Diagonalen musst du extra machen.
Ja, das geht deutlich einfacher, mit etwas Slicing und einem in Operator. Wir hatten das neulich doch erst ... Wenn ich die Frage finde, ergänze ich das hier, wenn DU selbst nicht weiter kommst.
Edit:
https://www.gutefrage.net/frage/tic-tac-toe-phyton-fehler#answer-393627414
Ursprünglich ging es in der Antwort um etwas anderes, im Verlauf ergab sich dann ein 'Schlagabtausch' mit Vereinfachungsmöglichkeiten, darunter auch Deine Frage, also eine Vereinfachung der Siegesabfrage.
ralphdieter hat am Ende nochmal eine sehr charmante Version nachgelegt.
Und hier nochmal entsprechend:
def wins(c):
if [c]*3 in (board[0:3], board[3:6], board[6:9],
board[0:9:3], board[1:9:3], board[2:9:3],
board[0:9:4], board[2:7:2]):
return True
od.
def wins(c):
return [c]*3 in (board[0:3], board[3:6], board[6:9],
board[0:9:3], board[1:9:3], board[2:9:3],
board[0:9:4], board[2:7:2])
Aufruf entsprechend mit wins('X') bzw. wins('O').
Das Feld lässt sich auch mit einer Binärzahl darstellen.
Wenn du bspw. diesen Zustand abbilden möchtest:
O|O|X
-----
O|X|X
-----
O|X|O
kannst du die einzelnen Zeilen stattdessen aneinanderhängen:
001 011 010
In Python:
board = int('001011010', 2)
Weiß nicht, zumindest kannst du dann beim O alles nur kopieren und abändern.
Tja, kommt man wohl nicht drumherum. Ich hatte das auch schon mal in LUA. glaube für über 190 Möglichkeiten programmiert^^
Also ich hab das jz optimiert, dass ich es nicht für X und O machen muss, ist aber immernoch recht unübersichtlich.