需要在每次调用时更改对象中的dicts值

时间:2017-05-22 03:33:52

标签: python pygame

我用python和pygame制作一个RPG。我有一个item类,它根据随机的项目编号返回一个带有各种项目属性的dict。我遇到的问题是,当我对该项目进行多次调用时,同一项目产生并且我想要生成不同的项目。

代码:

class Item(SpriteBase):
 def __init__(self, game, type, x, y):
    self.groups = game.allSprites, game.itemSprites
    pg.sprite.Sprite.__init__(self, self.groups)
    self.game = game
    self.image = pg.Surface((TILESIZE, TILESIZE))
    self.image.fill(LIGHT_GREY)
    self.rect = self.image.get_rect()
    self.x = x * TILESIZE
    self.y = y * TILESIZE
    self.item = {'item No.': '',
                 'name': '',
                 'rarity': '',
                 'durability': 0,
                 'damage': 0,
                 'type': '',
                 'splashText': '',
                 'image': ''
                 }

 def set_attributes(self):
    randomItemNumber = randint(0, 9)
    with open(path.join(itemFolder, 'itemList'), 'rt') as f:
        for line in f:
            no_new_lines = line.rstrip('\n')
            split_lines = no_new_lines.split('|')
            if int(split_lines[0]) == randomItemNumber:
                self.item['item No.'] = split_lines[0]
                self.item['name'] = split_lines[1]
                self.item['durability'] = int(split_lines[3])
                self.item['damage'] = int(split_lines[4])
                self.item['type'] = split_lines[5]
                self.item['splashText'] = split_lines[6]
                print(self.item)

 def add_to_inventory(self):
    if pg.sprite.spritecollide(self.game.player, self.game.itemSprites, True):
        self.game.player.inventory.append(self.item)
        print('player inventory: {}.'.format(self.game.player.inventory))

 def update(self):
    self.add_to_inventory()
    self.rect.x, self.rect.y = self.x, self.y

当它被召唤时:

    for row, tiles in enumerate(self.map.data):
        for col, tiles in enumerate(tiles):
             if tiles == '\'':
                Item(game=self, type='Weapon', x=col, y=row)
                for item in self.itemSprites:
                    item.set_attributes()

1 个答案:

答案 0 :(得分:0)

暂不公开评论,所以我写了一个答案。

这里有几条评论:

首先,在你的第二个代码块中,第二个for循环,不要再次调用你的变量tile,它会搞乱第一个for循环。而且我不理解为什么每次创建新项目时都会设置set_attributes。它应该更像是这样:

for row, tiles in enumerate(self.map.data):
    for col, current in enumerate(tiles):
         if current == '\'':
             Item(game=self, type='Weapon', x=col, y=row)
for item in self.itemSprites:
    item.set_attributes()

其次,您可以发布一些' itemList'以及您的' SpriteBase'类?

显然每个项目应该是不同的,因为每次设置属性时都要调用randint,所以很可能在你通过game.itemSprite列表时实例化同一个对象。

希望它有所帮助。