2016-08-14 7 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

__init__機能ではなく、dmgにプロパティを設定してください。 __init__は、インスタンスが初期化されたときにのみ実行されるため、更新されません。ただし、プロパティにアクセスするたびにメソッドを実行します。それはあなたのケースで継承を使用することをお勧めします

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

すべてのこれらのマジックナンバーは...これらは本当に、configファイルの私見に住みたいです。 – 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 
関連する問題