遇到麻烦找出如何在我的python游戏中提出库存系统

时间:2015-06-26 03:23:59

标签: python pygame

我在python和pygame中制作了一个简单的生存游戏,我在制作库存系统时遇到了麻烦。我一直试图找出它,没有任何帮助来挑战自己,但是时间寻求帮助。 我一直在玩这个代码

项目类

class item():
   def __init__(self,name,amount):
      self.name = name
      self.amount = amount

资源类

class wood(pygame.sprite.Sprite):
   def __init__(self):
    self.x = 700
    self.y = 100
    self.cut = False
    self.frame = 0
   def draw(self,display):
    self.rect = pygame.Rect((self.x + 38,self.y + 10,20,80))
    display.blit(Art_lists.trees_list[self.frame], (self.x,self.y))
    if pygame.sprite.collide_rect(self,Global.lion):
        if (pygame.key.get_pressed() [pygame.K_SPACE] != 0):
            if self.cut == False:
                if Global.wood not in Global.inventory:
                    Global.inventory.append(Global.wood)
                    Global.oinventory.append('wood')
                Global.wood.amount += 1
                self.frame = 1
                self.cut = True
            if self.cut == True:
                Global.wood.amount += 0

所以当你按空格时你碰撞节点例如一棵树你就会砍掉树,它会把一个items类的对象添加到一个名为inventory的列表中,然后将一个字符串添加到列表oinventory然后oinventory然后得到打印到屏幕但我不能得到一个int用字符串blit因为它不会接受它。我真的不认为这是制作库存的最佳方式。我希望库存只是在屏幕上的文本中以其旁边的数量显示其项目。就像你曾经玩过沉降一样。很抱歉,如果我的代码看起来很糟糕,或者我的问题在新手程序员中是不可理解的。

2 个答案:

答案 0 :(得分:0)

我会将库存设置为数组。数组的每个值都是一个对象变量,它将根据用户在其库存中的含量而变化。

答案 1 :(得分:0)

您需要将问题分解为多个部分。一部分定义了世界的行为方式(树木可以被切碎,产生x木),另一部分定义了玩家在任何特定时间持有的内容,而最后一部分获取该信息并将库存呈现给屏幕。

通过这种方式,您可以执行以下其他操作:拥有可以砍伐木材/拥有自己的库存等的NPC,而不会在整个地方散布重复的定义。除此之外,您还可以减少每个游戏需要保存的数据量,因为木材的定义不会改变,而玩家携带的木材数量会有多少。

所以你的GlobalItems将是一个包含类似......的字典

{Global.wood: {"Name": "Lumber",
               "Icon": Art_lists.xxx,
               "MaxStack": 20,
               "Portable": True}
 Global.tree: {"Name": "Ash tree"
               "Chop": {Global.wood: 50},
               "Portable": False}
}

您的广告资源将成为列表/数组:

[{"Type": Global.wood, "Count": 10},
 {"Type": Global.leather, "Count": 5}]

如果要处理堆栈/保留项目位置,可以有多个库存条目:

[{"Type": Global.wood, "Count": 20},
 None, # Blank space
 {"Type": Global.wood, "Count": 15}
]

然后,您绘制广告资源的代码可以遍历广告资源列表,计算每个项目的当前图块位置,然后在Type中查找GobalItems以确定图标和其他有用信息。

关注点分离有多重好处:

  • 它允许不同的人在系统的不同部分工作
  • 在做出更改时,使整个事情变得不那么脆弱 - 你要么改变一个项目是什么,有多少人或者它是如何被绘制的。
  • 明确说明需要将哪些信息写入磁盘以进行保存
  • 使更新变得更清洁(如果您认为木材应该在25个而不是20个堆叠中会发生什么?现在您只需要在一个地方更换它)

请注意,这可能是分离可以从世界上的事物中获取的东西的论据,但这取决于您的游戏的工作方式。使用上述方法,您可以在世界中创建一个对象并将其标记为Global.tree。为了避免错误,我已经添加了" Portable"标记,以确保您永远不会在您的库存中结束树,因为您错误标记了某些内容,您将收到错误。

如果玩家不能将任意物品丢入世界并在以后捡起它们,那么便携式/非便携式物品就没有理由在同一个列表中混淆。你可能会更好地了解最终可能存在于玩家库存中的事物列表,以及可以出现在游戏世界中的事物列表。