2016-12-20 18 views
2

私は古典的なDnDダンジョンのクロールと比較できるゲーム用のコードを作っています。私は、文字の統計とインベントリを含むいくつかの辞書を定義しました。彼らは、次のようになります。 Pythonの別の関数で既に定義されている変数を関数で使用するにはどうすればよいですか?

enemy_mid = {'hp': 100, 
     'ag': 50, 
     'sp': 60, 
     'st': 70, 
     'wep': sword, 
     'arm': leather, 
     'sld': buckler} 

は、現在プレイヤーが直面することができ、敵の異なる難しさのレベルのために一人のプレイヤーのための辞書、および3があります。さて、戦闘が開始されると、プレイヤーが直面する敵を決定するために、関数assign_attacker()が呼び出されます。関数は次のようになります。

def assign_attacker(): 
attacker = character 
enemy_choice = input("Would you prefer your enemnt to be easy, medium or hard, in terms of difficulty? (easy/med/hard): ").lower() 
if enemy_choice == "easy": 
    defender = enemy_easy 
elif enemy_choice == "med": 
    defender = enemy_med 
elif enemy_choice == "hard": 
    defender = enemy_hard 
else: 
    print("invalid") 

この関数が呼び出された後、プログラムは誰が主導権を保持しているかを決定する必要があります。

def initiative(): 
if attacker['sp'] > defender['sp']: 
    init = "att" 
elif attacker['sp'] == defender['sp']: 
    init = "null" 
else: 
    init = "def" 
print(init) 

ただし、この関数を呼び出すと、「攻撃者」が定義されていないというエラーが表示されます。私は、「攻撃者」はローカル変数であり、他の関数の外部では呼び出すことができないことを理解していますが、この変数をどこでも呼び出せるようにする最良の方法はわかりません。私は、 'グローバル'を使用することは非常に悪い習慣であり、この変数は後ほど自分のコードで多く使用されると聞いて、この変数を定義する最良の方法が何であるかを知りたいと思っていました。もちろん、これは「防御側」変数にも当てはまります。

+0

'character'はあなたのスクリプトのグローバル変数です。あなたの 'initiative()'関数の先頭に 'attacker = character'を含めないのはなぜですか? – elethan

+0

申し訳ありませんが、私はこれについて言及していませんでしたが、それは 'defender'変数にも当てはまります。 – Alchrops

答えて

1

アタックアタッカーを変更して、(attacker,defender)というタプルを返し、それを引数としてイニシアチブ関数に渡すだけです。

#rest of your assign function 
else: 
    print("invalid") 
return (attacker,defender) 

そして、あなたのイニシアチブは

def initiative(players) : 
    attacker = players[0] 
    defender = players[1] 

players=assign_attacker()のようになります。

+0

どこにプレーヤー= assign_attacker()を入れますか – Alchrops

+0

あなたのコードを見ることなく、あなたはゲームを表すループを持っていると思いますので、assign_attackerを呼び出してイニシアティブの前にそのループを入れてください。 – themistoklik

0

私は自分のゲームにクラスを使用します(おそらく、defenderattackerなどのクラスも使用します)。ここでは、超簡単な例です:

class Game: 

    def test(self): 
     self.defender = 'hello' 
     self.attacker = 'world' 

    def test2(self): 
     print(self.defender + self.attacker) 

    def test3(self): 
     self.defender = 'goodbye' 

g = Game() 
g.test() # initial values set for self.defender and self.attacker 
g.test2() # prints 'helloworld' 
g.test3() # changes value of self.defender to 'goodbye' 
g.test2() # prints 'goodbyeworld' 

ここでのポイントは、すべてのメソッドがself.defenderself.attackerへのアクセス権を持っているということです、そしてあなたはこれらの変数を変更した場合は、この方法は、これらの変化に気付くであろう。ただし、このように使用されるその他の変数は、self.attackerself.defenderがアクセスされる前に初期化されていることを確認する必要があります。たとえば、上記のクラスでは、test()の前にtest2()またはtest3()が呼び出された場合、変数はまだ存在しないため、エラーが発生します。

def __init__(self): 
    self.defender = some_initial_value 
    ... 

か、初期値のためのオブジェクトに渡すことができます:あなたは、クラスの__init__()メソッド、またはstart_game()方法、例えば中にこれらの変数を初期化することができ

def __init__(self, defender): 
    self.defender = defender 
    ... 

__init__メソッドが呼び出されますクラスをインスタンス化するとき(すなわち、g = Game()を実行するとき、または初期値を渡すときにg = Game(defender_obj)を実行するとき

Pythonのクラスを初めて使う人は、hereは、件名に関するインタラクティブなチュートリアルです。the Official Python tutorial on themです。

関連する問題