2016-08-14 40 views
0

我正在創建一個「寵物遊戲」,以訓練我在python中的計算技能(這只是一個藉口:這是因爲它很有趣)。如何有效地更新對象的屬性

我決定做一個簡單的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。如我所料,更改agistrint並不會自動更改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