2017-07-09 2 views
0

Ich versuche ein Programm zu machen, das es zwei Leuten erlaubt, Tic Tac Toe zu spielen. Sie sollten eine Zeile und dann eine Spalte auswählen, dann sollte das Token an diesem Ort platziert werden. Ich bin neu in multidimensionalen Listen und ich kämpfe ein bisschen. Das ist, was ich habe, so weit:Warum erhalte ich einen Fehler, der nicht definiert ist?

def showBoard(): 
    board = [[0,0,0,], 
      [0,0,0], 
      [0,0,0]]  

    print("-------------") 
    print('|',board[0][0], '|',board[0][1], '|',board[0][2],'|') 
    print("|---+---+---|") 
    print ('|',board[1][0], '|',board[1][1], '|',board[1][2],'|') 
    print("|---+---+---|") 
    print ('|',board[2][0], '|',board[2][1], '|',board[2][2],'|') 
    print("-------------") 


def playerX(): 

    row = input("Enter a row (0, 1, or 2) for player X: ") 
    column = input("Enter a column (0 , 1, or 2) for player X: ") 
    board[row][column] = "X" 


def main(): 

    showBoard() 
    playerX() 



main() 

Aber dann wirft sie immer den Fehler builtins.NameError: Name ‚Board‘ ist nicht definiert. Kann ich einen ähnlichen Code verwenden wie ich? Oder muss ich irgendwie append() benutzen?

+0

Bitte formatieren Sie Ihren Code richtig. Dies ist fast definitiv ein Problem mit dem Umfang, aber das ist schwer zu diagnostizieren, wenn Sie das Scoping in Ihrem Code verschleiert haben. – Carcigenicate

+0

Aus dem Aussehen davon, sieht es so aus, als ob Sie 'board' innerhalb von' showBoard' definiert haben, was bedeutet, dass es nur von innerhalb von 'showBoard' zugänglich ist. – Carcigenicate

+0

@carcigenicate Ich habe versucht, alles in main zu setzen und jetzt bekomme ich builtins.TypeError: Liste Indizes müssen ganze Zahlen oder Slices sein, nicht str Fehler. Dies scheint sehr frustrierend zu sein. – PyPunk

Antwort

2

Ihr Problem ist, dass Sie board innerhalb drawBoard definieren und dann versuchen, es in playerX zu verwenden. Innerhalb eines Bereichs definierte Variablen (wie eine Funktion) können nicht außerhalb dieses Bereichs verwendet werden. Wenn Sie die Variable an anderer Stelle verwenden müssen, definieren weltweit zu verbreiten, oder besser noch, übergeben Sie es als Argument:

def newBoard(): 
    # Create a new board, then return it 
    # so it can be used elsewhere. 
    return [[0,0,0], 
      [0,0,0], 
      [0,0,0]] 

def showBoard(board): 
    print("-------------") 
    print('|',board[0][0], '|',board[0][1], '|',board[0][2],'|') 
    print("|---+---+---|") 
    print ('|',board[1][0], '|',board[1][1], '|',board[1][2],'|') 
    print("|---+---+---|") 
    print ('|',board[2][0], '|',board[2][1], '|',board[2][2],'|') 
    print("-------------") 

def playerX(board): 
    row = int(input("Enter a row (0, 1, or 2) for player X: ")) 
    column = int(input("Enter a column (0 , 1, or 2) for player X: ")) 

    board[row][column] = "X" 

def main(): 
    board = newBoard() 

    showBoard(board) 
    playerX(board) 

main() 

Was ich geändert:

  • Ich habe eine newBoard-Funktion, die eine schafft Neue Tafel. Ich habe es dann in main verwendet, um eine Platine zu erstellen.

  • Ich machte drawBoard und playerX akzeptieren die Platine als Argumente. Ich habe dann das Board, das ich in main erstellt habe, in jedem bestanden.

  • Ich habe es so gemacht, dass Eingaben in Zahlen umgewandelt werden, bevor sie für die Indexierung verwendet werden.

Verwandte Themen