如何用Python解决面向对象问题

img


如何解决以上英雄类的问题,以面向对象解决,属开放性问题,解决问题

试着写了一点,试试看:

class Equip():
    def __init__(self, name, hp, ad, ap, dd, dp):
        self.name = name
        self.hp = hp
        self.ad = ad
        self.ap = ap
        self.dd = dd
        self.dp = dp
    
class Skill():
    def __init__(self, name, basic, adp, app):
        self.name = name
        self.basic = basic
        self.adp = adp
        self.app = app
    
    def damage(self, ad, ap):
        if ad >= ap: 
            type = 'physical'
            damage = self.basic + (1+self.adp)*ad
        else:
            type = 'magical'
            damage = self.basic + (1+self.app)*ap
        return damage, type

class Hero():
    def __init__(self, name, hp, ad, ap, dd, dp):
        self.name = name
        self.hp = hp
        self.ad = ad
        self.ap = ap
        self.dd = dd
        self.dp = dp
        self.equipped = None
        self.skilled = None
    
    def fight(self, target):
        if self.ad < target.ad: self, target = target, self
        while self.hp > 0 and target.hp > 0:
            self.attack(target)
            self, target = target, self
        return max(self,target,key=lambda x:x.hp)

    def attack(self, target):
        if self.skilled:
            damage, type = self.skilled.damage(self.ad, self.ap)
            if type == 'physical':
                skill_damage = (damage*(1000-target.dd))/1000
            elif type == 'magical':
                skill_damage = (damage*(1000-target.dp))/1000
        else:
            skill_damage = 0
        target.hp -= self.ad*2 + skill_damage
    
    def learn_skill(self, skill):
        self.skilled = skill

    def wear_equip(self, equip):
        self.equipped = equip
        self.ad += equip.ad
        self.ap += equip.ap
        self.dd += equip.dd
        self.dp += equip.dp
    
    def drop_equip(self):
        if self.equipped:
            self.ad -= self.equipped.ad
            self.ap -= self.equipped.ap
            self.dd -= self.equipped.dd
            self.dp -= self.equipped.dp
            self.equipped = None