kann mir jemand weiter helfen?

1 Antwort

Du müsstest dir parallel zur Zeichenfläche den Stand deines Spielfeldes merken. Eine zweidimensionale Liste (oder eine Liste an Tupeln) wäre hierfür nützlich.

board = [
  [ "-", "-", "-" ],
  [ "-", "-", "-" ],
  [ "-", "-", "-" ]
]

Jedes Element in diesen Listen steht für ein Feld. Der Bindestrich könnte unbesetzte Felder kennzeichnen, ansonsten gibt es den Status "X" oder "O".

Wenn der Spieler nun sein Symbol setzt, musst du (anhand der Mauskoordinaten) ermitteln, welches Feld gesetzt werden muss. Angenommen, er setzt ein X auf das erste Feld der zweiten Reihe, würde das Setzen so aussehen:

board[1][0] = "X"

Beachte, dass bei Listen die Indexzählung bei 0 beginnt. Daher hat die zweite Reihe den Index 1 und die erste Spalte den Index 0.

Nach jedem Zug könntest du nun das Spielfeld auf seinen Zustand prüfen. Entweder du prüfst immer pauschal das gesamte Feld oder du betrachtest explizit nur die Fälle, die betroffen sein können (bei obigem Fall wären beispielsweise nur die erste Spalte und die zweite Reihe von Interesse).

column = board[0][0] + board[1][0] + board[2][0]

if column == "XXX":
  # X is winner, end the game

row = board[1][0] + board[1][1] + board[1][2]

if row == "XXX":
  # X is winner, end the game

Sofern dir Funktionen bereits bekannt sind, könntest du den Code für die Prüfungen wesentlich verkürzen.

def has_won(column, row, symbol):
  expected_state = symbol.ljust(3, symbol)
  column = board[0][column] + board[1][column] + board[2][column]

  if column == expected_state:
    return true

  row = board[row][0] + board[row][1] + board[row][2]

  if row == expected_state:
    return true

  if (row == 1 or column == 1) and row != column:
    return false

  # otherwise check diagonal sequences here, too ...

  return false

# usage:
if has_won(1, 0, "X"):
  # X is winner, end the game