2016-12-06 7 views
2

私はゲームから短いバトルを作ることに取り組んでいます。私はm_hp(モンスターの健康状態)のような、シーケンスを通して変化する必要があるいくつかの変数を持っています。ここで私が持っているコードは(私が間違ってフォーマットした場合、これは、このウェブサイトを使用して、私の最初の時間である私を許して)です:Python:名前を変えずに別の関数から変数を使用する

def battle(p_lvl): 
    print("A goblin engages you in battle!") 
    p_hp = p_lvl * 25 + 25 
    p_dmg = p_lvl * 7 + 5 
    print("Player Stats (Level: " + str(p_lvl) + " Health: " + str(p_hp) + " ATK: " + str(p_dmg) + ")") 
    m_lvl = p_lvl - 1 
    m_hp = m_lvl * 20 + 15 
    m_dmg = m_lvl * 6 + 3 
    scr_dmg = m_hp/4 
    dus_eft = p_hp/5 
print("Goblin Stats (Level: " + str(m_lvl) + " Health: " + str(m_hp) + " ATK: " + str(m_dmg) + ")") 
act() 

def act(): 
    menu = 'Attack','Block','Use Item' 
    print("What will you do?") 
    print(menu) 
    action = input() 
    if action == ‘Attack': 
     m_hp = m_hp - p_dmg 
     print("You dealt " + str(p_dmg) + "damage to the goblin!") 
     p_hp = p_hp - m_dmg 
     print("The goblin struck back with " + str(m_dmg) + " damage!”) 
     act() 

私は行為()を開始した後に問題を取得します。私は、入力()のための「攻撃」を入力した場合、私はこのエラーを取得:私はm_hp戦い()下に置かれているが、行為が()、それに到達することはできませんので、私の理解へ

UnboundLocalError: local variable 'm_hp' referenced before assignment 

を、これがあります。私はact()に書き込まずにm_hpを変更できるようにしたい。私はそうすれば、m_hpはact()が開始するたびにリセットされ、m_hpは落とすことができません。私はここで質問を探しましたが、私が見たケースはうまくいかないようです。また、私は認知されていることは明らかですが、私はいくつかの解決策を理解できませんでした。

Tl; dr私は、関数に入れないで別の関数の変数を使用する方法について、簡単な解決策を探しています。

答えて

0

'm_hp'変数が 'battle'関数のスコープにローカルなので、エラーメッセージが表示されます。関数内で生成され、その関数が終了した後も存在しなくなります。

戦闘が実際にどこでも呼び出されるようには見えません。 定義する前にact()関数を呼び出すようにも見えます。

エラーが修正された場合でもコードが実行されない理由は他にもいくつかあります。

複数の関数内の変数に渡すことなく変数にアクセスできる場所は、多分グローバル変数です。一般に、グローバル変数は、合理的に避けることができるところでは、強く推奨されません。

私はあなたのコードを少し修正しましたので、あなたは混乱するような何かを持っています。私はクラスを使って関連するものをグループ化しようとしました。

すべてのプレイヤーのステータスとすべてのモンスターのステータスを含む 'モンスター'オブジェクトを持つ 'Player'オブジェクトがあります。

以下のコードを実行して、増分変更を行い、実行を継続するかどうかを確認してください。

class Player(object): 

    def __init__(self, level): 
     self.level = level 
     self.stats_for_level() 

    def stats_for_level(self): 
     self.attack_damage = (self.level * 7) + 5 
     self.hitpoints = (self.level * 25) + 25 

    def take_damage(self, damage): 
     self.hitpoints -= damage 

    def print_stats(self): 
     print("Player Stats (Level: " + str(self.level) + 
       " Health: " + str(self.hitpoints) + 
       " ATK: " + str(self.hitpoints) + ")") 


class Monster(object): 
    def __init__(self, level, name="Goblin"): 
     self.level = level 
     self.name = name 
     self.stats_for_level() 

    def stats_for_level(self): 
     self.attack_damage = (self.level * 6) + 3 
     self.hitpoints = (self.level * 20) + 15 

    def take_damage(self, damage): 
     self.hitpoints -= damage 

    def print_stats(self): 
     print(self.name + " Stats (Level: " + str(self.level) + 
       " Health: " + str(self.hitpoints) + 
       " ATK: " + str(self.hitpoints) + ")") 


class Game(object): 

    def __init__(self, starting_level=1): 
     self.player = Player(starting_level) 

     # create monster 
     self.monster = Monster(level=self.player.level - 1, name='Goblin') 

    def battle(self, player, monster): 
     print("A {} engages you in battle!".format(monster.name)) 
     monster.take_damage(player.attack_damage) 
     print("You dealt " + str(player.attack_damage) + " damage to the goblin!") 
     self.player.take_damage(monster.attack_damage) 
     print("The goblin struck back with " + str(monster.attack_damage) + " damage!") 


    def act(self): 
     # print stats 
     self.player.print_stats() 
     self.monster.print_stats() 

     # show menu 
     menu = 'Attack', 'Block', 'Use Item' 
     print(menu) 
     print("\nWhat will you do?: ") 
     action = input() 

     # take an action 
     if action == 'Attack': 
      self.battle(self.player, self.monster) 



def main(): 
    game = Game(starting_level=3) 
    while(True): 
     game.act() 

if __name__ == '__main__': 
    main() 
+0

私はエラーを理解し、act()を作成した後でbattle()にact()を追加しました。私はあなたのコードをコピー/ペーストし、main()をタイプしてそれがうまくいったかどうかを調べました。その後、「NameError:name 'Game'が定義されていません」というメッセージが表示されます。私が理解していることから、これはGameが存在しないことを意味します(?)また、Python 3.5.2を使用しているため、問題が発生する可能性があります。 –

+0

Python 3.5(以前はPython 2.7と書かれていました)で動作するようにコードを更新しました。新しいドラフトに試してみる価値はあるのだろうか?エラーから、私はコピーして貼り付けに間違いをしたかのように見えます。私が貼り付けた新しいものはうまくいけば正しかった。 (FYI、Gameは "class Game(object):"と書かれた行に定義され、定義された後には1つの場所でしか使用されません) –

+0

もう一度やってみましたが、今回は2つ。 (例:間違ってATKとしてヒットポイントを印刷しましたが、それでも問題ありません。)助けてくれてありがとう!私は現在Pythonを学ぶためにCodecademyを使っていますが、まだPythonのクラスを学んでいないので、コードを完全に理解することはできません。私がしたら、私は(うまくいけば)調整をして、それを回転させることができるでしょう! –

関連する問題