Ich habe Python für die letzten paar Tage gelernt und in meinem Buch war die Herausforderung, ein Tic Tac Toe-Programm zu erstellen. Ich glaube, ich habe eine allgemeine Vorstellung davon, wie das Spiel zu tun, aber ich lief in ein Problem, bei dem Einblick hilfreich wäre,Local Scope Problem in Tic Tac Toe Spiel (Python)
Heres der relevante Teil meines Codes
board = []
for i in range(0,3):
board.append([" "," "," "]) # Fill the board
def print_board():
for i in range(0,3):
print "| ",
for k in range(0,3):
print board[i][k],
print "|\n"
print "The first player to start will be player one with X\n, the second player will be O\n"
player_one = "X"
player_two = "O"
current_player_name = "Player One"
current_player = player_one
filled_board = False
winner = False
def check_win_col(the_winner):
for i in range(0,3):
for j in range(0,3):
if board[0][i] == board[j][0] and board[0][i] != " ":
the_winner = current_player
return the_winner
while(filled_board == False):
get_row = int(raw_input("Please enter which row you would like to move to " + current_player))
get_col = int(raw_input("Please enter the col you want to move to" + current_player))
board[get_row][get_col] = current_player
print_board()
check_win_col()
if current_player == player_one:
current_player = player_two
else:
current_player = player_one
Der Fehler
**UnboundLocalError: local variable 'the_winner' referenced before assignment**
Anfangs habe ich nicht verstanden, warum die Linie the_winner = current_player
mir einen Fehler gab, dann nach ein paar SO Fragen wie Unbound Local Error lesen, ich meine Ausgabe realisiert.
Ich dachte an zwei Lösungen.
Mein Versuch
1.the_winner
global machen. Auf diese Weise hätte ich kein Problem damit, den Gewinner für die Gewinnspalte an den aktuellen Spieler zu setzen. Der Grund, warum ich das nicht machen möchte, ist, weil ich mich daran erinnere, dass Leute während meiner Nachforschungen über diesen Fehler gesagt haben, dass es sehr schlecht ist, das Schlüsselwort global
zu verwenden, und deshalb möchte ich es nicht wirklich benutzen.
. Innerhalb der Funktion fügen Sie einen Parameter für the_winner
hinzu. Aber das Problem mit dieser Idee ist, dass ich auf the_winner
außerhalb der Funktion zugreifen würde. Dies würde the_winner
innerhalb des lokalen Bereichs check_win_col()
erstellen, und ich wäre nicht in der Lage, dies außerhalb der Funktion zu manipulieren, wenn ich aus irgendeinem Grund benötigt würde. Außerdem scheint die Idee, einen Parameter zu einer Funktion hinzuzufügen, um den Spaltensieger zu überprüfen, merkwürdig. Es scheint, als wäre es eine dieser Funktionen, die nur parameterlos sein sollte, wenn Sie so wollen.
Gibt es eine bessere Lösung, die ich vermisse? Tut mir leid, wenn diese Frage trivial erscheint.
Wenn Sie außerhalb der Funktion auf "the_winner" zugreifen müssen, können Sie es einfach am Ende der Funktion zurückgeben und speichern, wenn Sie die Funktion aufrufen. – Tryph
Sieht so aus, als ob Sie das Wort 'return' nicht kennen. – polku
Wo sonst benutzen Sie den_Winner? Ihre Funktion heißt 'check_win_col' und macht noch zwei andere Dinge. Mutiert den Status außerhalb der Funktion und gibt den Gewinner aus. Ich würde vorschlagen, dass diese Funktion einfach den 'current_player' zurückgibt, der gewinnt, und benutze ihn dort, wo du die Funktion –