2016-05-22 11 views
0

[はじめに、わかりやすく私のコードについては申し訳なく思っています。私は昨年Pythonを勉強し始めましたが、教師はほとんど理解できませんでした。]Python 3.5の複数のスクリプト間でPythonで 'global'を使用する

私はPython 3.5.1でテキストベースのゲームを作成しようとしています。メインゲーム、1は在庫システム、もう1つは他の機能、最後はキャラクター作成です。

グローバル変数と関数をどのように使用するのかと疑問に思っていましたが、グローバル変数は問題を解決するための悪い方法と見なされていましたが、私の検索に適した代替手段は見つかりませんでした。 How to make a save/load game for a text based python rpg?では、globalを使ってgame_stateを定義していますが、他には何もありませんが、同じコードを再利用しやすくするために関数で定義された数十の変数があります。例:

def expadd(amount): 
    global level, totalxp, exp, expbound, p1, p2, p3, p4, p5 
    print("\nYou gained",str(amount),"exp!") 
    exp = exp + amount 
    totalxp = exp 
    while exp >= expbound: 
     addpoints() 
     charchange() 
     thingymjig() 
     expbound = int(p4/p5 + 20) 
     exp = exp - expbound 
     level += 1 
     time.sleep(1) 
     print("\nLevel up! You are now level",str(level)+"!") 
    time.sleep(1) 
    expbound = int(p4/p5 + 20) 
    nextlevel = expbound - exp 
    print("\nYou are",str(nextlevel),"exp away from the next level!") 

これは機能についての良い方法ですか?私がここで持っているように、誰も実際には非常に多くのグローバルを使用していない他の場所から見たものから、プレイヤーがレベルアップしても、いつでもこのコードをすべて入力しなければならないとは思っていませんでした。 (これらはプレイヤーレベルとして再定義することができますので、P1-5の変数があまりにも彼らは、この関数にする必要があり、別の関数から来たの?)このセクションでは

def addpoints(): 
    global charpoints 
    charpoints = charpoints + int(level * 2)- int(level/2) - 1 

の後に追加され、charpoints(文字ポイント)プレーヤーレベルが上がり、必要なときにすべてのコードを入力するのではなく、使いやすさが求められます。私はコードの中で何度もこの種の関数を使用していますが、これは間違っていますか?さらに、複数のスクリプトにまたがって多くの関数やグローバル変数を使用するよりも、読みやすいコードを作成する簡単な方法がありますか?それは別のスクリプト内の関数からであるとして、それはグローバル化と私は考えてどのようにメインファイルにインポートですが、私は現在、プレイヤーの入力性別NameErrorを与えられています

が適切である:

from GAMEFUNCS import gender, charname, charpoints, charstrength, chardefence, charspeed 

私はそれをメインファイルにインポートする必要がありますので、保存するように設定することができます。また、次のコード(およびインポートされた関数)でグローバル化されていても、エラーは発生します。

def savewrite(): 
    global qr, check, gender, charname, title, money, exp, totalxp, level 
    global health, hp, lives, charpoints, charstrength, chardefence 
    global charspeed, charintel 
    with open("save.csv",'w',newline='')as s: 
     csv_s = csv.writer(s) 
     csv_s.writerow(["Quickrun"]+[qr]) 
     csv_s.writerow(["Checkpoint"]+[check]) 
     csv_s.writerow(["Gender"]+[gender]) 
+0

完全なスタックトレースを追加できますか? – syntonym

答えて

0

あなたが現在遭遇している理由から、グローバルは悪い考えです。以下の例を見てみましょう:

a.py:

a = "a" 

def print_a(): 
    print(a) 

b.py

from a import a, print_a 
a = "b" 
print_a() 

あなたがpython b.pyを実行した場合に何を印刷するのだろうか?変数aはbモジュールのコンテキストでのみ "b"に設定されているため、"a"を出力します。グローバルは、変数のアクセスとスコープを制御することを非常に困難にします。そのような状態をいくつかのデータ構造に入れ、それらを関数に渡す方が良いです。そうすれば、より汎用的で、さまざまなオブジェクトに関数を再利用することもできます。

例:あなたがグローバルを避けるだけでなく、あなたの関数は、他の文字のために動作します

def addpoints(character): 

    character.charpoints = character.charpoints + character.level * 2 - (character.level/2) - 1 

(これはcharacternamedtupleまたは適切な属性で何かのようなものであることを前提として)

その方法チームや敵の中に複数の人物を配置したい場合は、サイドキャラクターやチームメンバーのようなものです。

Stacktraceとそれを生成するコードがないと、なぜNameErrorが返されるのかが分かりません。私はまだ私の答えがあなたにグローバルが悪い考えであるかもしれない理由についていくつかの洞察を与えることを願っています。

+0

アドバイスをいただきありがとうございます。必要に応じてグローバルのみを使用します。 – Jack

関連する問題