我用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()
答案 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列表时实例化同一个对象。
希望它有所帮助。