2013-04-26 2 views
1

저는 처음 파이썬 프로그래머입니다. 그리고 방금 첫 번째 프로그램 인 Battle을 마쳤습니다. 하지만 문제가 있습니다. 내가 UnboundLocalError 어디서 최대한 멀리 볼 수있는, 모든 코드가 끝 부분 한 부분을 제외하고 잘 작동, 좀 걸릴 :왜 내 코드에서이 오류가 발생합니까?

Traceback (most recent call last): 
File "[Dir]\Programs\Battle.py", line 210, in <module> 
callUserCombat() 
File "[Dir]\Programs\Battle.py", line 26, in callUserCombat 
playerLeft = str(playerLeft) 
UnboundLocalError: local variable 'playerLeft' referenced before assignment 

을 그리고 이것은 유감이 (NO 소량 참조 무슨이다) : 여기

#Define callUserCombat(). 
def callUserCombat(): 
    print('Your turn.') 
    time.sleep(2) 
    print() 
    print('Choose a move:') 
    print('Attack 1 [2 - 3 Damage] (1)') 
    print('Attack 2 [0 - 5 Damage] (2)') 
    print('Heal [Heals 0 - 6] (3)') 
    playerLeft = str(playerLeft) 
    enemyLeft = str(enemyLeft) 
    print('Your HP: ' + playerLeft) 
    print('Enemy HP: ' + enemyLeft) 
    chosenAttack = input() 

    while chosenAttack != '0': 
     if chosenAttack == '1': 
      chosenAttackPower = random.randint(2,3) 
      enemyLeft = - chosenAttackPower 
      chosenAttackPower = str(chosenAttackPower) 
      print('You attacked!') 
      print('Enemy lost ' + chosenAttackPower + 'HP. ') 
      break 

     if chosenAttack == '2': 
      chosenAttackPower = random.randint(0,5) 
      enemyLeft = - chosenAttackPower 
      chosenAttackPower = str(ChosenAttackPower) 
      print('You attacked!') 
      print("Enemy lost " + chosenAttackPower + 'HP. ') 
      break 

     if chosenAttack == '3': 
      chosenAttackPower = random.randint(1,5) 
      playerLeft = + chosenAttackPower 
      chosenAttackPower = str(ChosenAttackPower) 
      print('You healed!') 
      print('Healed ' + chosenAttackPower + 'HP.') 
      break 

     else: 
      chosenAttack = '0' 
      print('Please enter a valid move code.') 
      print("Attack 1 (1)") 
      print("Attack 2 (2)") 
      print("Heal (3)") 
      print() 
      chosenAttack = input() 
     limitHealth() 

#Define callEnemyCombat(). 
def callEnemyCombat(): 
    print('Enemy\'s turn.') 
    time.sleep(2) 
    print() 
    enemyAttack = random.randint(1,6) 
    if enemyAttack == '1': 
     enemyAttackPower = random.randint(2,3) 
     playerLeft = - enemyAttackPower 
     enemyAttackPower = str(enemyAttackPower) 
     print('Don\'t bother taunting me, you\'ll die trying. And it\'s mean.') 
     print('Enemy attacked!') 
     print('You lost ' + enemyAttackPower + 'HP. ') 

    if enemyAttack == '2': 
     enemyAttackPower = random.randint(2,3) 
     playerLeft = - enemyAttackPower 
     enemyAttackPower = str(enemyAttackPower) 
     print('Where do you live? I only want to know so I can kill') 
     print('your family once I\'m finished with you.') 
     print('Enemy attacked!') 
     print('You lost ' + enemyAttackPower + 'HP. ') 

    if enemyAttack == '3': 
     enemyAttackPower = random.randint(2,3) 
     playerLeft = - enemyAttackPower 
     enemyAttackPower = str(enemyAttackPower) 
     print('I can take anything you can throw at me. Except Chocolate.') 
     print('I\'m allergic to Chocolate.') 
     print('Enemy attacked!') 
     print('You lost ' + enemyAttackPower + 'HP. ') 

    if enemyAttack == '4': 
     enemyAttackPower = random.randint(0,5) 
     playerLeft = - enemyAttackPower 
     enemyAttackPower = str(enemyAttackPower) 
     print('I WILL kill you, even if I have to hire the Men in Black to do it.') 
     print('Enemy attacked!') 
     print('You lost ' + enemyAttackPower + 'HP. ') 

    if enemyAttack == '5': 
     enemyAttackPower = random.randint(0,5) 
     playerLeft = - enemyAttackPower 
     enemyAttackPower = str(enemyAttackPower) 
     print('Have you heard of pong? We could play pong after I kill you,') 
     print('if you like.') 
     print('Enemy attacked!') 
     print('You lost ' + enemyAttackPower + 'HP. ') 

    if enemyAttack == '6': 
     enemyAttackPower = random.randint(1,5) 
     enemyLeft = + enemyAttackPower 
     enemyAttackPower = str(ChosenAttackPower) 
     print('Charging up with a cold glass of water, and a side of you.') 
     print('Enemy healed!') 
     print('Healed ' + chosenAttackPower + 'HP.') 
    limitHealth() 

#Define limitHealth(). 
def limitHealth(): 
    if playerLeft > playerHealth: 
     playerLeft = playerHealth 

    if enemyLeft > enemyHealth: 
     enemyLeft = enemyHealth 

그리고

그래서 모든 감각 만드는 코드입니다 : ( https://www.dropbox.com/s/9l4ifgmk5sx1pg1/Battle.py).

EDITED : 게시물에 대해 유감스럽게 생각합니다.

+3

를 방지해야 오류가 발생하는 위치 코드의 관련 부분을 추출하십시오 (+ - 5-7 라인)와 질문으로 포함되어 있습니다. – akluth

+0

_module_ 레벨에서 정의되었지만 함수에서 정의되지 않은 'playerLeft'가 있습니다 - 범위 지정 문제처럼 보입니까? ... – Basic

+0

@Basic 당신은 답을 쓸 수 있습니다. 나는 나의 것을 삭제했다. 당신의 신용을 포기하고 싶지 않아요. – CppLearner

답변

2

범위 변동 문제입니다. 당신은 같은 당신의 전역 변수를 입력해야합니다

enemyHealth = 1 
playerLeft = 2 
enemyLeft = 2 
... 

#Define callUserCombat(). 
def callUserCombat(): 
    global enemyHealth 
    global playerLeft 
    global enemyLeft 
    etc. 
+7

대답은 문제를 해결하지만,'global'을 사용하지 않고 코드를 다시 작성하는 것이 더 나은 선택이 될 것입니다. – Matthias

+0

나는 그것이 범위 문제라고 생각하지 않는다. 왜냐하면 나는'global'을 사용하지 않고 코드를 실행했기 때문입니다. http://pastie.org/7723221#2. 'global '을 사용하지 않고'SPROUT ='@ '을 사용했습니다. ' – Moj

+0

@Matthias : 방금 OP 질문에 "내 코드가이 오류를주는 이유는 무엇입니까?"라고 대답했습니다. 그러나 나는 당신과 동의합니다. 가변적 인 전역은 위험합니다. – lucasg

0

범위가 확실히 문제, 그리고 파이썬 (그것을 할당하려고 이름을 해결하는 더 구체적으로 방법을 즉 당신은 변수를 할당하려고 할 때 playerLeft). 여기에서 자세한 설명을 보려면 http://eli.thegreenplace.net/2011/05/15/understanding-unboundlocalerror-in-python/을 볼 수 있습니다.

글로벌 변수 playerLeft의 값을 단순히 인쇄하려고하는 것 같습니다. 간단하게 정확히 그렇게 :

playerLeft = 2 
enemyLeft = 2 
... 

#Define callUserCombat(). 
def callUserCombat(): 

    ... 
    print('Your HP: ', playerLeft) 
    print('Enemy HP: ', enemyLeft) 

    ... 

문제

관련 문제