2017-05-06 4 views
0

J'ai essayé de placer les turn = 0 dans la fonction play j'ai lu plusieurs questions similaires sur Stackoverflow, et a tenté de mettre global turn à l'intérieur et à l'extérieur de ma fonction. Ceux-ci n'ont pas jeté d'erreurs, mais n'ont pas non plus abouti à une limite de virage. Pourquoi? Des idées pour résoudre le problème?Iterated variable globale ne peut pas déclencher == état

Mon instinct dit que parce que je me suis fixé la variable turn à global je vais garder le référencement turn=0 pour sa valeur parce que c'est situé à l'extérieur de la fonction, mais comme il se déroulera le nombre d'itération que vous prenez tour à tour, je Je me trompe.

Voici mon code:

from random import randint 

board = [] 

for x in range(5): 
    board.append(["O"] * 5) 

def print_board(board): 
    for row in board: 
     print " ".join(row) 

print "Incredibly Simple Battleship!" 
print_board(board) 

def random_row(board): 
    return randint(0, len(board) - 1) 

def random_col(board): 
    return randint(0, len(board[0]) - 1) 

ship_row = random_row(board) 
ship_col = random_col(board) 
print ship_row #erase after testing 
print ship_col 

global turn 

def play(guess_row,guess_col): 
    global turn 
    if guess_row == ship_row and guess_col == ship_col: 
    print "Congratulations! You sunk my battleship!" 
    else: 
    if turn == 4: 
     print "Game Over" 
    if guess_row not in range(5) or guess_col not in range(5): 
     print "Oops, that's not even in the ocean." 
    elif(board[guess_row][guess_col] == "X"): 
     print "You guessed that one already." 
    else: 
     print "You missed my battleship!" 
     board[guess_row][guess_col] = "X" 
     print_board(board) 
     print "Guess again:" 
    print "Turn ",turn,":" 
    guess_row = int(raw_input("Guess Row:")) 
    guess_col = int(raw_input("Guess Col:")) 
    turn += 1 
    play(guess_row,guess_col) 


turn=0 
guess_row = int(raw_input("Guess Row:")) 
guess_col = int(raw_input("Guess Col:"))  
play(guess_row,guess_col) 

Voici l'erreur d'origine quand je n'ai pas utilisé mondiale:

Traceback (most recent call last): 
File "python", line 51, in <module> 
File "python", line 30, in play 
UnboundLocalError: local variable 'turn' referenced before assignment 

NB Je veux prendre les conseils de ne pas utiliser global mais n'ont pas compris une alternative encore.

Répondre

1

Voici une version qui garde trace d'une variable supplémentaire sur la fonction récursive play(). Note J'ai également ajouté un retour pour que le jeu puisse se terminer sur un Game Over. :)

from random import randint 

board = [] 

for x in range(5): 
    board.append(["O"] * 5) 

def print_board(board): 
    for row in board: 
     print " ".join(row) 

print "Incredibly Simple Battleship!" 
print_board(board) 

def random_row(board): 
    return randint(0, len(board) - 1) 

def random_col(board): 
    return randint(0, len(board[0]) - 1) 

ship_row = random_row(board) 
ship_col = random_col(board) 
print ship_row #erase after testing 
print ship_col 


def play(guess_row,guess_col, turn): 
    if guess_row == ship_row and guess_col == ship_col: 
    print "Congratulations! You sunk my battleship!" 
    else: 
    if turn == 4: 
     print "Game Over" 
     return 
    if guess_row not in range(5) or guess_col not in range(5): 
     print "Oops, that's not even in the ocean." 
    elif(board[guess_row][guess_col] == "X"): 
     print "You guessed that one already." 
    else: 
     print "You missed my battleship!" 
     board[guess_row][guess_col] = "X" 
     print_board(board) 
     print "Guess again:" 
    print "Turn ",turn,":" 
    guess_row = int(raw_input("Guess Row:")) 
    guess_col = int(raw_input("Guess Col:")) 
    play(guess_row,guess_col, turn + 1) 


guess_row = int(raw_input("Guess Row:")) 
guess_col = int(raw_input("Guess Col:")) 
play(guess_row,guess_col, 0) 
+0

Vous pouvez donc transmettre une variable via l'appel de fonction et l'itérer en lui passant +1 IN dans la fonction (re) appel? Brillant! – toonarmycaptain

+0

Pourquoi était ce que j'essayais de ne pas travailler cependant? – toonarmycaptain

+0

Doux, pas de problème. Votre méthode peut également fonctionner, mais vous définissez le tour global deux fois. Enlevez le premier «tour global» dans votre code et vous devriez être bon à aller (n'oubliez pas d'ajouter cette déclaration de retour après le jeu terminé). –