Python Tic-Tac-Toe: Winner-Logik?

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...

Woher ich das weiß:Hobby – Programmiere seit eineinhalb Jahren

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.

Woher ich das weiß:Hobby – Programmieren ist mein Hobby & Beruf

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.

ItachiUchihaLX 
Fragesteller
 19.04.2021, 15:10

Also ich hab das jz optimiert, dass ich es nicht für X und O machen muss, ist aber immernoch recht unübersichtlich.

2
FrozenArmy  19.04.2021, 15:12
@ItachiUchihaLX

Tja, kommt man wohl nicht drumherum. Ich hatte das auch schon mal in LUA. glaube für über 190 Möglichkeiten programmiert^^

1