モンスタークラス2

なんだか、昨日の日記を間違えて消していたみたいです…。

それはともかく、モンスタークラスをさらに改造。
ダメージの受け渡しをオブジェクトに設定する。
Damageクラス。<damage.py>

class Damage:
    def __init__(self):
        self.kind = 0
        self.value = 0
        self.special = 0
    def setDamage(self, kind, value, special):
        self.kind = kind
        self.value = value
        self.special = special
    # define
    # kind
    ATTACK = 0
    MAGIC = 1
    DEFENSE = 2
    RECOVER = 3
    ESCAPE = 4
    # special
    NOMAL = 0
    POISON = 1
    PARALYSIS = 2

kindがダメージの種類。(攻撃・魔法・防御・回復・逃げる)
valueがダメージの量。
specialが特殊ダメージ。(毒・麻痺)

続いて、Monsterクラス。<monster.py>
メッセージや死亡判定など、共通化できるもののみ実装。

from damage import Damage

class Monster:
    def __init__(self, name, hp, power):
        self.name = name
        self.hp = hp
        self.power = power
    def attack(self):
        print self.name, "の攻撃"
    def magic(self, spell):
        print self.name, "は", spell, "を唱えた"
    def damage(self, damage):
        if(damage.kind == damage.ATTACK):
            print self.name, "は", damage.value, "のダメージを受けた"
            self.hp -= damage.value
        elif(damage.kind == damage.MAGIC):
            print self.name, "は", damage.value, "のダメージを受けた"
            self.hp -= damage.value
        ret = self.isDead()
        if(ret == False):
            if(damage.special == damage.POISON):
                print self.name, "は毒を受けた"
        return ret
    def isDead(self):
        if(self.hp < 1):
            print self.name, "は死んでしまった"
            return True
        return False
    def escape(self):
        print self.name, "は逃げ出した"

このモンスタークラスを継承して、
Slimeクラスを作成する。<slime.py>
特殊攻撃の逃げるを実装する。

from monster import Monster
from damage import Damage
import random

class Slime(Monster):
    def attack(self, damage):
        if(self.hp < 3 and random.randint(0, 3) == 0):
            Monster.escape(self)
            damage.kind = damage.ESCAPE
        else:
            Monster.attack(self)
            damage.setDamage(damage.ATTACK, self.power, damage.NOMAL)
        return damage

もう一つ、魔導師を実装。<magician.py>

from monster import Monster
from damage import Damage
import random

class Magician(Monster):
    def attack(self, damage):
        if(random.randint(0, 5) == 0):
            Monster.magic(self, "メラ")
            damage.setDamage(damage.MAGIC, 5, damage.NOMAL)
        else:
            Monster.attack(self)
            damage.setDamage(damage.ATTACK, self.power, damage.NOMAL)
        return damage

最後にドライバ。<main.py>

from slime import Slime
from magician import Magician
from damage import Damage

enemy1 = Slime("スライム", 10, 3)
enemy2 = Magician("魔導師", 20, 1)
damage = Damage()

print "-->", "戦闘開始"

while True:
    damage = enemy1.attack(damage)
    if(damage.kind == damage.ESCAPE):
        break
    if(enemy2.damage(damage)):
        break
    
    damage = enemy2.attack(damage)
    if(damage.kind == damage.ESCAPE):
        break
    if(enemy1.damage(damage)):
        break

print "-->", "戦闘終了"