2015-04-21 2 views
0

Я пытаюсь ввести два имени игрока и распознать программу, если в именах есть что-либо кроме алфавитных символов. Имена должны зацикливаться до тех пор, пока они не будут введены правильно; В настоящее время, я получаю ошибку local variable 'player1' referenced before assignment.Переменная 'player1', на которую ссылаются перед назначением

def player(): 

    while (player1.isalpha()): 
     player1 = input("What is the name of our first player? \n") 
     print("Welcome " + player1) 
     return 
    else: 
     print("Please enter a name without integers or spaces") 
     return False 


    while (player2.isalpha()): 
     player2 = input("What is the name of our first player? \n") 
     print("Welcome " + player2) 
     break 
    else: 
     print("Please enter a name without integers or spaces") 
     return True 
player() 

Я читаю о глобальной уступке и что плохо звучит в данном случае; любые другие предложения?

+0

Вы тестируете 'player1.isalpha()' ** перед ** 'player1 = input (...)' ... – jonrsharpe

+0

Возможный дубликат [Запросить пользователя для ввода до тех пор, пока он не даст действительный ответ] (http://stackoverflow.com/questions/23294658/asking-the-user-for-input-until-they-give-a-valid-response) – jonrsharpe

+0

Ну, 'player1' не определен или не назначен, прежде чем вы вызываете' isalpha() ', вызвав эту ошибку.Кстати, ваш код не делает то, что, по вашему мнению, он должен делать. – MasterAM

ответ

2

Необходимо определить игрока1 перед выполнением на нем метода.

player1="" 
player2="" 
while... 

его не глобальный, потому что его в функции

1
def player(x): 
    player='' 
    pass=0 
    while (not player.isalpha()): 
     if pass != 0: 
      print("Please enter a name without integers or spaces") 
     pass += 1 
     player = input("What is the name of our player No.{}?\n".format(x)) 
    print("Welcome {} No.{}".format(player,x)) 
    return player 

player1=player(1) 
player2=player(2) 
1

Вы получаете эту ошибку, потому что вы используете player1 и player2, прежде чем определить их. Это легко разрешить:

def player(): 
    player1 = '' 
    player2 = '' 

    # The rest of your code here... 

Есть и другие проблемы с вашим кодом. Например:

while (player1.isalpha()): 
    player1 = input("What is the name of our first player? \n") 
    print("Welcome " + player1) 
    return 
else: 
    print("Please enter a name without integers or spaces") 
    return False 

return Это в вашем while цикле выход из функции, как только вы приветствовали player1. Однако вы сказали, что хотите запросить второго игрока, поэтому он должен быть break. Затем, когда я делаю эти корректировки, а затем опустить функцию в интерпретатор, это то, что я получаю:

>>> def player(): 
...  player1 = '' 
...  player2 = '' 
...  while (player1.isalpha()): 
...   player1 = input("What is the name of our first player? \n") 
...   print("Welcome " + player1) 
...   break 
...  else: 
...   print("Please enter a name without integers or spaces") 
...   return False 
...  while (player2.isalpha()): 
...   player2 = input("What is the name of our first player? \n") 
...   print("Welcome " + player2) 
...   break 
...  else: 
...   print("Please enter a name without integers or spaces") 
...   return True 
... 
>>> player() 
Please enter a name without integers or spaces 
False 
>>> 

Ваш пустой player1 & player2 не возвращаются, как альфа, так что вы никогда не собираетесь получить приглашение для ввода. Смотрите следующее:

>>> player1 = '' 
>>> assert player1.isalpha() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AssertionError 
>>> 

Update

К тому времени, когда я думал об этом следующей части, кто-то другой также опубликовал аналогичный ответ. Я включу мое, чтобы взглянуть на другой способ сделать это.

Я бы на самом деле использовать что-то вроде следующего:

>>> def get_player(n=1): 
... player = input("What is the name of player %d? " % n) 
... if not player.isalpha(): # Ask again, if non-alpha characters. 
...  print("Please enter a name without integers or spaces!") 
...  player = get_player(n) 
... return player 
... 
>>> player1 = get_player(1) 
What is the name of player 1? Bob1 
Please enter a name without integers or spaces! 
What is the name of player 1? Bob 
>>> assert player1 == 'Bob' 
>>> 

Это позволит запросить произвольное количество игроков, таких как:

>>> players = [] 
>>> try: 
... num = int(input("How many players? ")) 
... except ValueError: 
... print("Number of players must be an integer!") 
... else: 
... for i in range(num): 
...  players.append(get_player(i + 1)) 
... 
How many players? 3 
What is the name of player 1? Frodo 
What is the name of player 2? Sam 
What is the name of player 3? Merry 
>>> assert players == ['Frodo', 'Sam', 'Merry',] 
>>> 

Таким образом, если ваша текущая игра tic-tac-toe (или что-то еще) когда-нибудь станет игрой гипер-tac-tac-toe в n-мерном игровом поле с n игроками, вам не нужно полностью переписывать и повторно отлаживать вашу функцию player(). Или вы готовы отбросить эту же функцию в свою следующую игру.

Смежные вопросы