> 文档中心 > 【python面向对象】技能系统

【python面向对象】技能系统


针对之前面向对象的知识,设计了一个技能系统

文章目录

  • 技能系统设计思想
  • 技能系统代码实现
  • 技能系统项目总结

技能系统设计思想

【python面向对象】技能系统
【python面向对象】技能系统

技能系统代码实现

"""    技能系统"""class SkillImpactEffect:    """ 技能影响效果    """    def impact(self): raise NotImplementedError()class DamageEffect(SkillImpactEffect):    """ 伤害生命效果    """    def __init__(self,value): self.value = value    def impact(self): print("扣你%d血"%self.value)class LowerDeffenseEffect(SkillImpactEffect):    """ 降低防御力    """    def __init__(self,value,time): self.value = value self.time = time    def impact(self): print("降低%d防御力,持续%d秒"%(self.value,self.time))class DizzinessEffect(SkillImpactEffect):    """ 眩晕    """    def __init__(self,time): self.time = time    def impact(self): print("眩晕%d秒"%(self.time))class SkillDeployer:    """ 技能释放器    """    #生成技能(执行效果)    def __init__(self,name): self.name = name # 加载配置文件{技能名称:[效果1,效果2..],...} self.__dict__skill_config = self.__load_config_file() # 创建效果对象 self.__effect_objects = self.__create_effect_objects()    def __load_config_file(self): # 加载文件 return{     "降龙十八掌":["DamageEffect(200)","LowerDeffenseEffect(-10,5)","DizzinessEffect(6)"],     "六脉神剑":["DamageEffect(100)","DizzinessEffect(6)"] }    def __create_effect_objects(self): #根据name创建相应的技能对象 # 降龙十八掌->["技能1","技能2"] List_effect_name = self.__dict__skill_config[self.name] List_effect_object = [] for item in List_effect_name:     # "技能1" --> 技能1的对象     #对象 = eval("DamageEffect(200)")     effect_object = eval(item)     List_effect_object.append(effect_object) return List_effect_object    def generate_skill(self): print(self.name,"技能释放啦") for item in self.__effect_objects: #调用父类,执行子类     item.impact()xlsbz = SkillDeployer("降龙十八掌")xlsbz.generate_skill()# 降龙十八掌 技能释放啦# 扣你200血# 降低-10防御力,持续5秒# 眩晕6秒lmsj = SkillDeployer("六脉神剑")lmsj.generate_skill()# 六脉神剑 技能释放啦# 扣你100血# 眩晕6

技能系统项目总结

技能系统三大特征

  1. 封装:将每种影响效果单独做成类。
  2. 继承:将各种影响效果抽象为SkillImpactEffect,隔离技能释放器与各种影响效果的变化。
  3. 多态:各种影响效果在重写SkillImpactEffect类 中impact(),多态是方法,释放器调用SkillImpactEffect执行各种效果。

技能系统六大原则

  1. 开闭:增加新(技能/影响效果)·不修改释放器代码。
  2. 单一职责:SkillImpactEffect负责隔离变化,DamageEffect…负责定义具体的效果,SkillDeployer负责释放技能。
  3. 依赖倒置:(1)释放器没有调用具体影响效果,而是调用SkillImpactEffect。(2)抽象不依赖具体的。具体做法:释放器通过“依赖注入”(读取配置文件,创建影响效果对象),使释放器不依赖具体影响效果。
  4. 组合复用:释放器与影响效果是组合关系,可以灵活的选择各种影响效果。
  5. 里氏替换:父类出现的地方可以被子类替换。释放器存储影响效果列表,实际可以将各种子类存入进来。
  6. 迪米特法则:低耦合,所有类之间耦合度都很低。