【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秒
技能系统项目总结
技能系统三大特征
- 封装:将每种影响效果单独做成类。
- 继承:将各种影响效果抽象为SkillImpactEffect,隔离技能释放器与各种影响效果的变化。
- 多态:各种影响效果在重写SkillImpactEffect类 中impact(),多态是方法,释放器调用SkillImpactEffect执行各种效果。
技能系统六大原则
- 开闭:增加新(技能/影响效果)·不修改释放器代码。
- 单一职责:SkillImpactEffect负责隔离变化,DamageEffect…负责定义具体的效果,SkillDeployer负责释放技能。
- 依赖倒置:(1)释放器没有调用具体影响效果,而是调用SkillImpactEffect。(2)抽象不依赖具体的。具体做法:释放器通过“依赖注入”(读取配置文件,创建影响效果对象),使释放器不依赖具体影响效果。
- 组合复用:释放器与影响效果是组合关系,可以灵活的选择各种影响效果。
- 里氏替换:父类出现的地方可以被子类替换。释放器存储影响效果列表,实际可以将各种子类存入进来。
- 迪米特法则:低耦合,所有类之间耦合度都很低。