2013-06-17 2 views
0

Я работаю над текстовой игрой на python. И у меня возникла небольшая проблема. Один из методов моего класса сообщает программе, что делать, когда противник атакует. Вот кодЛокальная переменная, на которую ссылаются до ошибки присваивания

def attack(self, method): 
    user_health_old = user_health 
    self.method = method 
    probs = random.randrange(1,100) 
    if method == "Knife": 
     while user_health > 0: 
      if probs in range(1,70): 
       attackWin = True 
       break 
      else: 
       attackWin = False 
       pla = player() 
       pla.healthRem(7) 
      if user_health < 1: 
       death() 
    elif method == "Hands": 
     while plaHealth > 0: 
      if probs in range(1,40): 
       attackWin = True 
       break 
      else: 
       attackWin = False 
       pla.healthRem(7) 
      if user_health < 1: 
       death() 
    pla = player() 
    pla.attackStatus() 

игрок() является классом, и этот метод атаки() attackStatus() немного после того, как кусок, который скажет игроку, что произошло в бою, вот код, который

def attackStatus(self): 
    if attackWin == True: 
     print "You Win, this time" 
     time.sleep(2) 
    if user_health < user_health_old: 
     print "But you're victory did come at a cost" 
     time.sleep(2) 
     print "You're new health value is: ",user_health 
     time.sleep(3) 

И еще пару строк кода, вместо выполнения всей программы, атм я просто его настроить, чтобы запустить этот модуль,

pla = player() 
pla.attack("Knife") 

проблема возникает, когда я запускаю прогу ОЗУ. Он открывает консоль, но сразу уходит. Он также не выводит никакой информации. Я не совсем уверен, что происходит, если кто-то может мне помочь, я бы очень его оценил.

+0

Опубликовать полный обзор. –

+0

Ваша переменная 'user_health' никогда не инициализируется в коде, который вы нам показали – karthikr

+0

И что с операциями' break', которые не находятся в цикле? – kindall

ответ

0

В блоке else вашей первой функции, когда вы используете pla.healthRem(7), вы ссылаетесь на pla, прежде чем ему будет присвоено значение. От взгляда на другой код, похоже, вы хотите добавить pla = player() чуть выше этой строки (или возможно поставить pla = player() в самом начале функции).

Edit: Осмотрев свой комментарий, это, безусловно, связано с вашим использованием pla в функции attack(). Если у вас есть присвоение имени в любом месте в функции, это локальная переменная везде в этой функции. Это означает, что вы никогда не сможете получить доступ к глобальному имени pla, если в теле функции есть pla = player(). Вы можете исправить это в одном из следующих способов:

  • Возьмите все pla = player() строку из вашей функции, это позволит любому поиску в pla найти глобальную переменную.
  • Положите global pla в самую верхнюю часть вашей функции, глобальный оператор вызовет каждое присвоение этому имени, чтобы изменить глобальную версию переменной вместо создания новой локальной переменной.
  • Остановите попытку использовать глобальный, когда вам нужен экземпляр вашего игрока, просто используйте pla = player() внутри функции.
+0

Странная часть состоит в том, что я определил pla = player() как глобальную переменную в самом начале программы. Я думаю, я определил его еще пару раз, но это было то же самое. – emufossum13

+0

См. Мое редактирование, вы не можете назначить имя переменной внутри своей функции и по-прежнему использовать глобальную переменную с тем же именем. –

+0

спасибо, я смог исправить это, просто удалив глобальную планку вместе, как вы сказали. – emufossum13

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