2016-03-26 3 views
-1

Я новичок в POO.Python, добавьте имена переменных в список/dict

Я на самом деле кодирую игру с pygame, и я хочу добавить имена переменных в список или dict.

У меня есть класс Hero с этим INIT

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] 

и у меня есть функция, чтобы показать спрайтов на экране:

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

Он работает, нет никаких проблем, я фактически используя это:

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

Но я хочу использовать это:

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

Не работает, потому что он принимает значения переменной, а не имена переменных.

Благодарим вас за помощь и сожаление, если мой английский был плохим.

+0

Что вы подразумеваете под * его не работает *? вы должны увеличивать 'i' внутри * while loop * или даже лучше использовать * forloop * следующим образом:' для героя в listhero: hero.show() ' – styvane

+0

просто добавьте следующую строку чуть выше определения определения в классе – Ankanna

ответ

1

Вы можете actualy использовать словарь:

dictheroes = {} 

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

Я плохо с диктофонами, но я пробую это, я приду через несколько минут. Спасибо. – helpPyProg

+0

Он отлично работает, спасибо! – helpPyProg

1

Вы не увеличиваете i, поэтому это приводит к бесконечному циклу.

Вы можете добавить

i += 1 

в конце вашего цикла.

Еще лучше, сделайте следующее:

for h in listhero: 
    h.show() 

Что касается вашего выбора структура данных, как и было отмечено в комментариях, используя словарь лучше, чем при использовании списка. Вы можете сделать что-то вроде этого:

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

Я просто не копирую эту строку из своего кода, но спасибо за ваш ответ. – helpPyProg

1

Ведение списка, вы можете также сделать

[h.show() for h in listhero] 

Вы можете использовать словарь, но порядок blit не будет порядком вставки в dict. Если вам нужно сохранить заказ blit, продолжайте список или используйте:

collections.OrderedDict 
Смежные вопросы