2016-09-05 2 views
0

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.

+0

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

+1

Sieht so aus, als ob Sie das Wort 'return' nicht kennen. – polku

+0

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 –

Antwort

0

Wie wäre es mit der Rücksendung des Gewinners? Etwas nach dem Vorbild dieser:

player_one = "X" 
player_two = "O" 
current_player_name = "Player One" 
current_player = player_one 
filled_board = False 
winner = False 

def check_win_col(): 
    for i in range(0,3): 
     for j in range(0,3): 
      if board[0][i] == board[j][0] and board[0][i] != " ": 
       return current_player # Current player wins, so return it. 

the_winner = check_win_col() 
print the_winner 
1

Das Problem mit Ihrer Funktion ist nicht auf der Linie, die Sie sagen, gibt einen Fehler, sondern auf der Linie, wo Sie print oder return die Variable the_winner. Diese Variable wurde möglicherweise nicht in der Schleife festgelegt, da die (fehlerhafte!) Bedingung, die Sie überprüfen, nicht immer wahr ist.

Es gibt einige Möglichkeiten, wie Sie mit dieser Möglichkeit umgehen können. Eine Möglichkeit könnte darin bestehen, die lokale Variable the_winner vor dem Start der Schleife in der Funktion zu initialisieren. None ist oft ein vernünftiger Standardwert für eine Variable, die geändert werden kann oder nicht.

def check_win_col(): 
    the_winner = None # set a default value for the variable unconditionally 
    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 # this *may* modify it, if the condition was met 
    return the_winner # this will work always, not only if the loop modified the variable 

Inbetriebnahme der return Anweisung in der Schleife (wie von Skirrebattie vorgeschlagen) fast genau das gleiche wie das, da None der Standardrückgabewert für Funktionen in Python ist. Wenn die Bedingung in dem Code in der anderen Antwort nie erfüllt wird, gibt die Funktion None zurück, nachdem es das Ende seines Codes erreicht.

Eine letzte Notiz über den Zustand, den Sie überprüfen. Es macht keinen Sinn!Derzeit überprüfen Sie, ob ein Wert in der ersten Spalte mit einem Wert in der ersten Zeile übereinstimmt und kein Leerzeichen ist. Das ist keine sehr relevante Bedingung, um Tic-Tac-Toe zu gewinnen. Sie wollen wahrscheinlich etwas anderes (obwohl ich nicht genau weiß was).

+0

Das ist perfekt! Vielen Dank, ich habe mir den Kopf gestoßen, was ich tun soll! – bill

+0

Yeah lol mein Zustand macht keinen Sinn, ich denke ich weiß was ich von hier zu tun habe obwohl ich einige Ideen habe :) – bill