2016-09-21 7 views
1

現在、私はPythonを試していて、ちょっとしたテキストアドベンチャーをプログラミングしています。私のゲームでは、プレイヤーは魔法使い、攻撃ダメージ、アイテムの在庫スロットなどの特定のプロパティを持っています。 私のコードでこれらのプロパティをどこからでも呼び出せるようにしたいと思います。そのために私は三つの値を受け取る機能を作成しました:Pythonで値を保存して返す関数をプログラミングする

「編集」:変数が

「info_id」を編集する必要があるかどうかを指定するには:アクセスする必要のある変数を指定する

「値」:変数

これの新しい値は、それが私のコードで次のようになります。

def player_info(edit, info_id, value): 

    if edit == 1: 
    ##function wants to edit value 
     if info_id == 1: 
      player_hp = value 
      print ("Assigned hp to: ", player_hp) 
      ##the "prints" are just to check if the asignments work -> they do 
      return player_hp 

     elif info_id == 2: 
      player_attack = value 
      print ("Assigned attack to: ", player_attack) 
      return player_attack 
     elif info_id == 3: 
      item_1 = value 
      return item_1 
     elif info_id == 4: 
      item_2 = value 
      return item_2 
     elif info_id == 5: 
      item_3 = value 

    elif edit == 0: 
    ##function wants to retrieve value 
     if info_id == 1: 
      return player_hp 
     elif info_id == 2: 
      return player_attack 
     elif info_id == 3: 
      return item_1 
     elif info_id == 4: 
      return item_2 
     elif info_id == 5: 
      return item_3 

は(info_iまで行く10個のアイテムスロットが実際にあります。 d == 13)しかし、彼らはとにかく同じです。

私は私のコードの先頭にすべての変数を定義:定義作品

player_info(1,1,20) 
    player_info(1,2,5) 
    n=3 
    while n<=13: 
     player_info(1,n,0) 
     n=n+1 
##items are not fully implemented yet so I define the item slots as 0 

を、私はので、私はコードで実装制御「印刷」を伝えることができます。それでも変数を呼び出すとこのような健康:

player_info(0,1,0) 

私はエラーを取得する:

local variable 'player_hp' referenced before assignment 

機能が正しく変数を保存しませんか?それとも何が問題なの?

変数を保存するより良い方法はありますか?グローバル変数はこの場合に行く方法ですか?

ありがとうございました!

+1

コードをフォーマットしてください。インデントが混乱です –

+1

あなたの関数は 'player_hp'という名前のローカル変数を作成していますが、同じ名前のグローバル変数は変更されません。関数がグローバルを変更できるようにするには 'global'キーワードを使用することができますが、Playerクラスを作成し、そのクラスのインスタンスを使用してプレーヤー情報を格納する方がよいでしょう。 –

答えて

0

関連性の機能にそれを渡す必要があり、「機能をい変数を適切に保存しないでください。一般的には

Pythonの関数は、その状態を保存しないでください。例外はyieldステートメントを使用する関数です。あなたはこの

def save_data(data): 
    storage = data 

のような関数を記述し、この

ようにそれを呼び出した場合
save_data(10) 

あなたは後でstorageの値を取得できません。Pythonでは、データを保存して後で取得する必要がある場合は、通常classes

のPython classesは、あなたがこのようなことを行うのですか許可:

15 
['sword', 'shield'] 

class PlayerData(object): 
    def __init__(self, hp=0, damage=0): 
     self.hp = hp 
     self.damage = damage 
     self.inventory = list() 
     self.max_inventory = 10 

    def add_item(self, item): 
     if len(self.inventory) < self.max_inventory: 
      self.inventory.append(item) 

    def hit(self, damage): 
     self.hp -= damage 
     if self.hp < 0: 
      self.hp = 0 

    def attack(self, other): 
     other.hit(self.damage) 

if __name__ == '__main__': 
    player1 = PlayerData(20, 5) 
    player2 = PlayerData(20, 5) 
    player1.attack(player2) 
    print player2.hp 
    player1.add_item('sword') 
    player1.add_item('shield') 
    print player1.inventory 

出力は、これは本当に唯一のclassesを使用する方法の表面をなぞりました。より完全な実装では、Item基本クラスを持つことができます。次にを継承するSwordShieldクラスを作成することがあります。

+0

すばらしい例をありがとう!私はもっ​​とクラスを見るつもりです、彼らは素晴らしいです! –

1

まず、割り当てられていない変数が検索されたためにエラーが発生しました。これは機能しません。 player_hpを編集すると、どこにも保存されません。あなたはそれを呼び出した関数に返し、それを何にも割り当てません。それはちょうど失われます。

第2に、実際には4つのスペース(またはタブ)でインデントする必要があります.2つのスペースよりもはるかに読みやすいです。あなただけでなく、助けようとしている人のためにも。

そして、最後に、これについて適切な方法は、クラスについて学ぶことです。グローバル変数は、特別な場合にのみ、または学習中にはPythonでは使用しないでください。クラスにスキップしてください。

あなたが次にあなただけのプレーヤークラスのインスタンスを作成することができます

class Player: 

    def __init__(self): 
     self.hp = 20 # or another starting hp 
     self.attack = 3 # or another starting attack 
     self.inventory = [] 

のようなものを作成し、それはあなたが尋ねた

player1 = Player() 
print(player1.hp) # Prints out player's hp 
player1.hp -= 5 # Remove 5 hp from the player. Tip: Use method to do this so that it can check if it reaches 0 or max etc. 
player1.inventory.append("axe") 
print(player1.inventory[0]) # Prints out axe, learn about lists, or use dictionary, or another class if you want this not to be indexed like a list 
関連する問題