2013-11-01 4 views
-1

Я пытаюсь написать простую программу, которая определяет двух воображаемых бойцов с только именем и количеством здоровья.Простой 1 против 1 Моделирование боя

Прямо сейчас это то, что я написал:

import random 

def main(): 
    pass 

if __name__ == '__main__': 
    main() 

hpRed = 20 
hpBlu = 20 

def attack(): 
    damage = random.randrange(1,3) 

    return hpRed - damage 
    return hpBlue - damage 

def fighterRed(name, hpRed): 
    print(str(name) + " has " + str(hpRed) + " health left.") 

def fighterBlue(name, hpBlu): 
    print(str(name) + " has " + str(hpBlu) + " health left.") 

def battle(): 
    fighterRed("Branden",hpRed) 
    fighterBlue("Alex",hpBlu) 

    while ((hpRed > 0) and (hpBlu > 0) is True): 
     attack() 

    else: 
     print("The battle is over!") 

     if (hpRed > 0): 
      return "Red Player is victorious!" 
     else: 
      return "Blue Player is victorious!" 

battle() 

До сих пор я постоянно получаю ошибку «hpRed обращаться до присвоения». Что я могу изменить, чтобы заставить его правильно передать значение hpRed и hpBlu?

+2

Хотя код, который вы опубликовали, имеет ряд проблем, он не будет вызывать исключение UnboundLocal, которое вы упомянули. В следующий раз опубликуйте свой _actual_-код и полную трассировку сообщения об ошибке. – l4mpi

ответ

3

Существовали несколько ошибок:

  • Вы использовали два разных названия: hpBlue и hpBlu

  • Вы возвращались два значения вместо изменения значений переменных, которые вы определили.

  • Ваши функции печати выполнялись только один раз. (Добавлено внутри while так печатает каждую итерацию)

Код:

import random 

hpRed = 20 
hpBlu = 20 

def attack(): 
    global hpRed, hpBlu 
    damage = random.randrange(1,3) 
    hpRed = hpRed - damage 
    hpBlu = hpBlu - damage 

def fighterRed(name, hpRed): 
    print(str(name) + " has " + str(hpRed) + " health left.") 

def fighterBlue(name, hpBlu): 
    print(str(name) + " has " + str(hpBlu) + " health left.") 

def battle(): 

    while (((hpRed > 0) and (hpBlu > 0)) is True): 
     fighterRed("Branden",hpRed) 
     fighterBlue("Alex",hpBlu) 
     attack() 

    else: 
     print("The battle is over!") 

     if (hpRed > 0): 
      return "Red Player is victorious!" 
     else: 
      return "Blue Player is victorious!" 

battle() 
0

hpRed и hpBlue (который опечатка, по крайней мере в одном месте, кстати) переменные определены в модуль («глобальный») уровень. Имена внутри функций являются функционально-локальными именами, которые не могут видеть глобальные переменные, если они явно не назначены глобальным. Это будет выглядеть следующим образом:

def attack(): 
    global hpRed, hpBlue 
    # rest of your function 

В то время как вы могли сделать это просто с глобалов, это не очень хорошая практика. Я рекомендую передать значение в любые необходимые ему функции или поместить его в класс, чтобы на нем могли работать методы класса.

def attack(hpr, hpb): 
    # calculate damage, then... 
    return (hpr - damage, hpb - damage) 

Вы можете заметить, что я изменил ваше заявление return. То, что вы написали, не будет работать так, как вы этого хотели: после того, как вы вышли return, вы снова не можете вернуть return из того же вызова метода (это поведение будет больше похоже на generator). Если вы хотите вернуть как новый красный HP, так и новый синий HP, верните кортеж, содержащий их оба.

У этого кода есть и другие проблемы: вы никогда не изменяете глобальные переменные, и вы сбережете себе головную боль, если вы поместите вызов print в циферблат while, чтобы вы могли видеть, как hp изменяется.

1

Вы не вносите никаких изменений в hp игрока; посмотрите на свою функцию attack() и начните проверку своих переменных.

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