2016-03-26 3 views
-1

Je suis débutant en POO.Python, ajouter les noms de variables à une liste/dict

Je suis en train de coder un jeu avec pygame et je veux ajouter des noms de variables à une liste ou un dict.

j'ai un héros de la classe avec cette initialisation

class Hero: 
    def __init__(self, posx, posy, image) : 
     self.name = "Hero" 

     self.posx = posx 
     self.posy = posy 

     self.image = pygame.image.load(image).convert_alpha() 

     self.width = self.image.get_rect()[2] 
     self.height = self.image.get_rect()[3] 

et j'ai une fonction pour afficher l'image-objet sur l'écran:

def show(self) : 
    display.blit(self.image, (self.posx, self.posy)) 

Il fonctionne, il n'y a pas de problème, je suis en fait en utilisant ceci:

captainamerica = Hero(100,400, "sprites/captainamerica/base.png") 
captainamerica.show() 
ironman = Hero(100,400, "sprites/ironman/base.png") 
ironman.show() 

Mais je veux utiliser ceci:

listhero = [] 
listhero.append(captainamerica) 
listhero.append(ironman) 
i = 0 
while i < len(listhero): 
    listhero[i].show() 

Cela ne fonctionne pas car il prend les valeurs de la variable et non les noms des variables.

Merci pour votre aide et désolé si mon anglais était mauvais.

+0

que voulez-vous dire par * cela ne fonctionne pas *? vous devriez incrémenter 'i' dans la boucle * while ou mieux encore utiliser un * forloop * comme ceci:' pour hero dans listhero: hero.show() ' – styvane

+0

ajoutez simplement la ligne suivante juste au-dessus de la définition de show dans la classe – Ankanna

Répondre

1

Vous pouvez actuellement utiliser le dictionnaire:

dictheroes = {} 

dictheroes['ironman'] = Hero(100,400, "sprites/ironman/base.png") 
+0

Je suis mauvais avec les dicts mais j'essaie ça, je viendrai dans quelques minutes. Je vous remercie. – helpPyProg

+0

Cela fonctionne parfaitement, merci! – helpPyProg

1

Vous n'incrémentez pas i, donc cela entraîne une boucle infinie.

Vous pouvez ajouter

i += 1 

à la fin de la boucle.

Mieux encore, faites ceci:

for h in listhero: 
    h.show() 

En ce qui concerne votre choix de structure de données, comme cela a été souligné dans les commentaires, en utilisant un dictionnaire est mieux que d'utiliser une liste. Vous pouvez faire quelque chose comme ceci:

heroes = {} 
heroes['Captain America'] = Hero(100, 400, 'sprites/captainamerica/base.png') 
+0

Je ne copie pas cette ligne de mon code, mais je vous remercie pour votre réponse. – helpPyProg

1

Garder la liste, vous pouvez également faire

[h.show() for h in listhero] 

Vous pouvez utiliser le dictionnaire, mais le l'ordre du blit ne sera pas l'ordre d'insertion dans le dict. Si vous devez conserver l'ordre de blit, continuez avec la liste ou utilisez un:

collections.OrderedDict