2016-10-15 5 views
-1

OOPスタイルを使用してPythonで単純なゲームを作成しようとしています。 親クラスが設定され、主人公とorkの2つのサブクラスがあります。Pythonでオブジェクトのプロパティを更新するOOP

基本的に、主人公がorkを攻撃した場合(またはその逆の場合)、私はその被害に基づいて状態を更新したいと考えています(被害は攻撃するキャラクターの能力です)。現在、ループするたびに、元の状態に戻ります。

OOPを使用してこれを行う最良の方法は何ですか?手続き的で面倒なやり方でそれをどうやって行うのかを理解することができますが、どうすればいいのか見てみたいと思います。

class Character: 
    '''Blueprint for game characters''' 
    def __init__(self): 
     #default values 
     self.character = "" 
     self.speed = 0 
     self.power = 0 
     self.health = 100 

    def attack(self, attackObj): 
     self.attacker = self.character 
     self.attackerPower = self.power 
     self.victim = attackObj.character 
     self.victimHealth = attackObj.health 
     self.newHealth = self.victimHealth - self.attackerPower 
     print(self.character, "you have chosen to attack", self.victim) 
     print(self.victim, "you have suffered", self.attackerPower, "damage and  your health is now", self.newHealth) 


class Hero(Character): 
    '''Inherits from character to create hero''' 
    def __init__(self): 
     Character.__init__(self) 
     self.character = "Hero" 
     self.speed = 8 
     self.power = 9 
     print(self.character, "you have",self.speed, "speed,", self.power, "power and", self.health, "health.") 


class Ork(Character): 
    '''Inherits from character to create ork''' 
    def __init__(self): 
     Character.__init__(self) 
     self.character = "Ork" 
     self.speed = 2 
     self.power = 8 
     print(self.character, "you have",self.speed, "speed,", self.power,  "power and", self.health, "health.") 

def main(): 
    charclass = Character() 
    hero = Hero() 
    ork = Ork() 

    endLoop = False 
    while endLoop == False: 
     print("Please choose your character by typing the corresponding key: ") 
     print("H for hero") 
     print("O for ork") 
     charChoice = input() 
     if charChoice in ("H", "h", "hero", "Hero"): 
      charChoice = hero 
      enemy = ork 
      hero = Hero() 

     elif charChoice in ("O", "o", "ork", "Ork"): 
      charChoice = ork 
      enemy = hero 

     print("Please choose an action by typing the corresponding key: ") 
     print("A to attack") 
     actionChoice = input() 
     if actionChoice in ("A", "a"): 
      charChoice.attack(enemy) 
     else: 
      print("Nothing chosen!") 

     finishedYN = input("Have you finished? Y/N ") 
     if finishedYN in ("Y", "y", "Yes", "yes", "YES"): 
      print("You have chosen to end the game...") 
      endloop = True 
      break 
     else: 
      pass 

if __name__ == "__main__": 
    main() 
+0

私はあなたのコードを実行していませんが、ループの繰り返しごとに新しい 'Hero'オブジェクトを作成しているようです:' hero = Hero() '。 –

+0

また、なぜあなたはこれをしますか? 'self.victimHealth = attackObj.health'?あなたはあなたのクラスのすべてに '自己 'を加えていますか? –

+0

私はその行を削除しました(以前の遺物だったはずです)が、プログラムの残りの部分には影響しません。まだ元の状態に戻ります。攻撃者のパワープロパティを被害者に送信し、これを健康から除外し、次の反復でそれを覚えておくための何らかの方法が必要です。私が言ったように、私は面倒で手続き的なやり方でそれを行うことができましたが、誰かが私に正しいOOP方法を教えてくれるようにしたいと思います。 –

答えて

0

コードをすばやく修正しました。これらの不要な属性をすべて削除します。 self.attacker(それはちょうどselfです)、self.attackPower(これはちょうどself.powerです)。 self.victim = attackObj.characterは、オブジェクトに新しい属性を与えます。この属性は、文字列が同じ文字列(attackObj.character)と同じです。同様に、この:self.newHealth = self.victimHealth - self.attackerPowerはちょうど新しい属性に常に 100になるメソッドが呼び出されるたびに作成されます -

def attack(self, attackObj): 
    attackObj.health -= self.power 
    print(self.character, "you have chosen to attack", attackObj.character) 
    print(attackObj.character, "you have suffered", self.power, "damage and  your health is now", attackObj.health) 

self.attack本当に、より良い方法は、あなたのオブジェクトを変異させる方法を追加することですが、それは次のようになりますあなたのオブジェクトが他のオブジェクトとどのようにやり取りするかのインターフェースとして使用されます。たとえば、次のようになります。

class Character: 
    '''Blueprint for game characters''' 
    def __init__(self): 
     #default values 
     self.character = "" 
     self.speed = 0 
     self.power = 0 
     self.health = 100 

    def attack(self, victim): 
     victim.receive_damage(self.power) 

    def receive_damage(raw_damage): 
     self.health -= raw_damage 

これにより、コードの拡張性が向上します。 "buffs"システムをより簡単に実装したり、コードをattackに変更しなくても、ダメージを受ける方法に影響を与える "armor"要素を追加することができます。サブクラスでこれらのメソッドをオーバーライドすることができます。だから、おそらくあなたは、すべてのorksは "thickskin"、およびOrkに持ちたい:

self.thickskin_modifierOrkクラス __init__に設定された
def receive_damage(raw_damage): 
     self.health -= raw_damage*self.thickskin_modifier 

。それは0.9のようなものかもしれません。

+0

OK、私は見て、周りに遊んで、最終的な作業コード(うまくいけば)で少し返信します。 –

+0

ねえ、それは動作します!ありがとうございました。私はOOPを初めて勉強しているので、私が助けにいかに感謝しているかを伝えることはできません。 –

関連する問題