2016-09-21 36 views
1

我目前正在试验Python并编写一个小文本冒险。在我的游戏中,玩家拥有某些属性,如HP,攻击伤害和物品库存插槽。 我希望能够在我的代码中随处调用这些属性。对于我创建的接收三个值的函数:编程一个函数,在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 

实际上有10个插槽(上升到info_i 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

请格式化您的代码。缩进是一团糟 – 2016-09-21 11:16:21

+1

您的函数正在创建名为'player_hp'的局部变量等,它不会修改相同名称的全局变量。您可以使用'global'关键字来使该函数修改全局变量,但创建Player类会更好,并使用该类的实例来存储玩家信息。 –

回答

0

你问的功能,“是否功能不正确保存变量?

一般来说,Python函数不保存其状态,唯一的例外是,使用yield语句的功能。如果你这样写

def save_data(data): 
    storage = data 

一个函数并调用它像这样

save_data(10) 

以后您将无法获得storage的值在Python中,如果您需要保存数据并稍后检索数据,则通常使用classes

的Python classes允许你做这样的事情:

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 

输出

15 
['sword', 'shield'] 

这真的只是触及了如何使用classes表面。在更完整的实现中,您可能有一个基类Item。然后,您可以创建从Item继承的SwordShield类。

+0

感谢您的好例子!我会更多地关注课程,他们很棒! –

1

首先,您的错误是由于检索一个未分配的变量而导致的,这只是不起作用。当您编辑player_hp时,它不会存储在任何地方。你将它返回给调用它的函数,而不是将它分配给任何东西。它只是迷路了。

其次,你应该缩进4个空格(或制表符) - 它比2个空格更可读。不仅对你,而且对于任何想要帮助的人。

最后,正确的做法是了解类。全局变量不应该在python中使用,只有在特殊情况下,或者当你正在学习时,才会跳到类中。

你应该创造这样

class Player: 

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

然后,你可以创建Player类的实例,并把它传递到它的相关

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 
相关问题