2017-04-05 12 views
0

私は楽しいために小さなテキストゲームを作っています。私はfunctionaと呼ばれる関数ファイルにある関数を使いたいと思います。割り当て前に参照されるバインドされていないエラー、ローカル変数

問題になっている機能、attack()、エラーで動作し、プログラムがクラッシュしていませんが:

Traceback (most recent call last): 
    File "C:\Users\seanm\Desktop\Programming\The mists of Alandria\Mists_of_alandria.py", line 22, in <module> 
    functionala2.attack() 
    File "C:\Users\seanm\Desktop\Programming\The mists of Alandria\functionala2.py", line 27, in attack 
    variablestamina += 2 
UnboundLocalError: local variable 'variablestamina' referenced before assignment 

functionalaファイルの新しい改良バージョンが問題を引き起こしているように見えるものです:

variablestamina = 20 
variablehealth = 40 
variablemonsterhealth = 30 
variableattacktype1 = ("Lightattack") 
variableattacktype2 = ("Mediumattack") 
variableattacktype3 = ("Heavyattack") 

def attack(): 
    variableattackquery = input("You can execute three types of attacks. Lightattack does 2 damage and takes no stamina. Mediumattack does 4 damage and takes 2 stamina. Heavyattack does 7 damage and takes 5 stamina. You can only do one per turn: ") 
    if variableattackquery == variableattacktype1: 
     variablemonsterhealth -= 2 
     variablestamina -= 2 
    if variableattackquery == variableattacktype2: 
     variablemonsterhealth -= 4 
     variablestamina -= 4 
    if variableattackquery == variableattacktype3: 
     variablemonsterhealth -= 7 
     variablestamina -= 7 
    variablestamina += 2 
    variablestamina = min(20, variablestamina) 
    print ("The "+monster+" has "+str(variablemonsterhealth)+" health left") 
    print ("You have "+str(variablestamina)+" stamina left") 
    monsterattack = random.randrange(4,6) 
    variablehealth -= monsterattack 
    print ("The "+monster+" attacks you for "+str(monsterattack)) 
    print ("You have "+str(variablehealth)+" health left") 
    print() 
+0

この質問に示されているインデントは、コードと同じですか?あなたの最初のスニペットは、最初の行のインデントが過度で、1つのprintステートメントではあまりにも少なすぎます。 2番目のスニペットはすべての行を超過しています。インデントはPythonでは重要です! –

+4

2つのファイルがあり、それぞれのファイルが別のファイルをインポートしますか?これはPythonでは厳密に禁止されていませんが、混乱しているエラーメッセージや驚くべき動作につながることがあります。循環インポートが発生しないようにコードを再設計してください。 – Kevin

+0

@Rory Daultonいいえ、私のインデントはこれで間違っていて、ファイル内で同じではありません。申し訳ありませんが、元の形式でコードをインポートする方法を見つけることができませんでした –

答えて

0

これは、すべてを1つのファイルにまとめた、よりクリーンな方法です。クラスを使用して見たい場合があります。

コンソールからは、ゲームを開始するにはgame()を呼び出します。それだけです。

from random import randrange 

def game(): 
    stamina = 20 
    health = 40 
    monsterhealth = 30 
    monster = 'orc' 
    attacks = {'light':(-2,0),'medium':(-4,-2),'heavy':(-7,-4)} 
    while True: 
     a = input('you can execute 3 types of attacks, light, medium or heavy... pick one.') 
     a = a.lower().strip() 
     if a in attacks: 
      stamina, health, monsterhealth = attack(stamina, health, monsterhealth, monster, attacks[a]) 
      if stamina <= 0: 
       print 'you have died...' 
       break 
      elif monsterhealth <= 0: 
       print 'the {} has died...'.format(monster) 
       break 
     else: 
      break 

def attack(stamina, health, monsterhealth, monster, att): 
    monsterhealth += att[0] 
    stamina += att[1] 
    stamina = min(20, stamina) 
    print('the {} has {} health remaining'.format(monster,monsterhealth)) 
    print('you have {} stamina remaining'.format(stamina)) 
    ma = randrange(4,6) 
    health -= ma 
    print('the {} attacks you for {}'.format(monster,ma)) 
    print('you have {} health left'.format(health)) 
    return stamina, health, monsterhealth 

NB:でも、単一のファイルでこれをやって、あなたがスコープに必要な「メイン」の手順に変数モンスターかのどちらかが、健康< = 0

コードを持っているとき、ゲームは終了します(game)、それをattack関数に渡します。それ以外の場合は、これらの名前を参照すると、同じエラーが発生します、そして、あなたはそうのように、これを再現することができます。

m = 1 
def foo(): 
    m += 1 '## m doesn't exist within scope of foo, so it will raise the same error 

しかし、これは混乱することができ、以下はないは、エラーが発生します:

m = 1 
def foo(): 
    print m 

もなりますこの:

m = 1 
def foo(): 
    a = m 
    print a 

しかし、これらの両方のように見える種類のyハック、それがCにメインプロシージャから値を渡す方が良いでしょうalled関数/メソッド/ etcを呼び出し、適切な値を呼び出し側に返します。

関連する問題