2016-08-14 3 views
0

Я создаю «игру для домашних животных», чтобы обучать свои компьютерные навыки на питоне (это просто оправдание: это потому, что это весело).Как эффективно обновлять атрибуты объекта

Я решил сделать простую игру RPG. Для этого я определил класс героя:

class hero: 
    #Common class for the main character 
    def __init__(self, name, lvl, str, agi, vit, int, luk, prof): 
     self.name = name 
     self.lvl = lvl 
     self.str = str 
     self.agi = agi 
     self.vit = vit 
     self.int = int 
     self.luk = luk 
     self.prof = prof 
     self.exp = 0 
     if prof==1: 
      self.dmg=3*(self.str)+1*(self.agi) 
      self.skillList=['heavySlash01'] 
      self.strUp=3 
      self.agiUp=1 
      self.vitUp=2 
      self.intUp=1 
      self.lukUp=1 
     if prof==2: 
      self.dmg=1*(self.str)+3*(self.agi) 
      self.skillList=['doubleAttack02'] 
      self.strUp=1 
      self.agiUp=3 
      self.vitUp=1 
      self.intUp=1 
      self.lukUp=2 
     if prof==3: 
      self.dmg=4*(self.int) 
      self.skillList=['fireBall03'] 
      self.strUp=1 
      self.agiUp=1.5 
      self.vitUp=0.5 
      self.intUp=3.5 
      self.lukUp=1.5 
     self.hp=19*vit 

Однако я заметил, что всякий раз, когда герой выровнена, мне нужно, чтобы обновить все его статуса отдельно. Например, мне нужно было вручную обновить hero.dmg. Изменение agi, str и int не изменило автоматически dmg, как и следовало ожидать.

Мой вопрос заключается в следующем: есть ли способ сделать dmg автоматически обновлять себя, исходя из его формулы?

ответ

1

Сделайте dmg имущество вместо установки в функции __init__. __init__ запускается только при инициализации экземпляра, поэтому вещи не обновляются. Тем не менее, при создании свойства он запускает метод всякий раз, когда к нему обращаются свойства.

@property 
def dmg(self): 
    if prof==1: 
     return 3*(self.str)+1*(self.agi) 
    if prof==2: 
     ... 
+0

Все эти магические числа ... те действительно хотят жить в конфигурационном файле ИМХО. – Kevin

+0

Согласен, но я также не пытаюсь полностью переписать код, просто отвечая на вопрос, поэтому перезаписанный код не путает OP. – Karin

1

Это лучше использовать наследование в вашем случае:

class Hero(object): 
    def __init__(self, name, lvl, _str, agi, vit, _int, luk): 
     self.name = name 
     self.lvl = lvl 
     self._str = _str # Should not use "str" because of reserved keyword of the same name 
     self.agi = agi 
     self.vit = vit 
     self._int = _int # Should not use "int" because of reserved keyword of the same name 
     self.luk = luk 
     self.exp = 0 

    @property 
    def hp(self): 
     return 19 * self.vit 


class HeroProf_1(Hero): 
    skillList = ['heavySlash01'] 
    strUp = 3 
    agiUp = 1 
    vitUp = 2 
    intUp = 1 
    lukUp = 1 

    @property 
    def dmg(self): 
     return 3 * self._str + 1 * self.agi 


class HeroProf_2(Hero): 
    skillList = ['doubleAttack02'] 
    strUp = 1 
    agiUp = 3 
    vitUp = 1 
    intUp = 1 
    lukUp = 2 

    @property 
    def dmg(self): 
     return 1 * self._str + 3 * self.agi 


class HeroProf_3(Hero): 
    skillList = ['fireBall03'] 
    strUp = 1 
    agiUp = 1.5 
    vitUp = 0.5 
    intUp = 3.5 
    lukUp = 1.5 

    @property 
    def dmg(self): 
     return 4 * self._int 
Смежные вопросы