1. 许多程序员对面向对象的思想都很了解,并且也能说得头头是道,但是在工作运用中却用的并不顺手。

当然,我也是其中之一。

不过最近我听了我们老师的讲课,对于面向对象的思想有了更深的理解,今天决定用一个实例跟大家分享一下。

欢迎各位前辈评论指正。

2.面向对象的三大特征:封装、继承、多态

六大原则: 开闭原则,单一职责,依赖倒置,组合复用,里氏替换,迪米特法则

3. 可是这三大特征和六大原则具体如何运用,又从哪里才能体现出我应用到了呢?

下面我就以一个游戏技能项目的代码实例,来讨论一下。

4. 首先,抛出题目:

写一个技能系统,具体技能效果如下:

降龙十八掌:1.伤害:造成100点伤害,2.眩晕:使对方眩晕3秒,3.降低防御:降低对方30点防御力,持续时间3,秒

六脉神剑: 1.伤害:造成90点伤害,2.震退:震退对方3丈以外, 3.减速:减速30,持续2秒

北冥神功: 1.伤害:造成99点伤害, 2.降低防御:降低对方20点防御力,持续时间2秒, 3 减速:减速20,持续2秒

可能有些朋友会说,这很简单,按照每个技能创建一个类就行了,这就是面向对象的思想嘛。事实上却是很错误的。

明眼人都能看到,每个技能虽有不同,但其效果都大同小异,如果每个技能创建一个类,就会产生大量的重复代码,

比如伤害这个效果,上面三个技能都有。

还有,若是项目经理告诉你,眩晕这个效果不行,改成在眩晕的同时,降低10点防御力,

那岂不是每个包含眩晕效果的技能,都要改一遍?

5.事实上,以面向对象思想编写以上代码的话,我们完全可以把每个效果提取出来,单独做成一个类,而每个技能含有多少效果,

在技能类的下面直接调用效果类就可以了。

6.废话不多说,直接上代码:

1 sikll_file ={2 '降龙十八掌': ['DamageEffect(100)','DizzinessEffect(3)', 'LowerDeffence(30,3)'],3 '六脉神剑': ['DamageEffect(90)', 'Knockback(3)', 'LowerSpeed(30, 2)'],4 '北冥神功': ['DamageEffect(99)', 'LowerDeffence(20,2)', 'LowerSpeed(20,2)']5 }6

7 classSkillImpactEffect:8 """

9 效果父类10 作为父类,供技能调取,具体实现靠子类重写方法11 """

12 defimpact(self):13 raiseNotImplementedError()14

15 classDamageEffect(SkillImpactEffect):16 """

17 效果:伤害18 """

19 def __init__(self,value):20 self.value =value21 defimpact(self):22 print('减少血量%d点'%self.value)23

24 classLowerDeffence(SkillImpactEffect):25 """

26 效果:降低防御力27 """

28 def __init__(self, value, time):29 self.value =value30 self.time =time31 defimpact(self):32 print("降低%d防御力,持续%d秒"%(self.value, self.time))33

34 classDizzinessEffect(SkillImpactEffect):35 """

36 效果: 眩晕37 """

38 def __init__(self, time):39 self.time =time40 defimpact(self):41 print('眩晕%d秒'%self.time)42

43 classKnockback(SkillImpactEffect):44 """

45 效果:震退46 """

47 def __init__(self, value):48 self.value =value49 defimpact(self):50 print('震退敌人到%d丈之外!')51

52 classLowerSpeed(SkillImpactEffect):53 """

54 效果:减速55 """

56 def __init__(self, value, time):57 self.value =value58 self.time =time59 defimpact(self):60 print('减速%d,持续时间%d' %(self.value, self.time))61

62 classSkillDeployer:63 """

64 技能释放器65 """

66 #生成技能(执行效果)

67 def __init__(self,name):68 self.name =name69 #加载配置文件{技能:[效果1,效果2.。。]}

70 self.__dict_skill_config =self.load_config_file()71 #创建效果对象

72 self.__effect_object =self.create_effect_objects()73 defload_config_file(self):74 #加载技能文件。

75 returnsikll_file76

77 defcreate_effect_objects(self):78 #根据name创建相应的技能对象

79 list_effect_name = self.__dict_skill_config[self.name]80 list_effect_object =[]81 for item inlist_effect_name:82 #效果对象,加入技能列表

83 effect_object =eval(item)84 list_effect_object.append(effect_object)85 returnlist_effect_object86

87 defgenerate_skill(self):88 print('%s释放'%self.name)89 for item in self.__effect_object:90 item.impact()91

92

93 xlsbz = SkillDeployer('降龙十八掌')94 xlsbz.generate_skill()95 lmsj = SkillDeployer('六脉神剑')96 lmsj.generate_skill()97 bmsg = SkillDeployer('北冥神功')98 bmsg.generate_skill()

7.有了上面这种形式的代码,再也不怕项目经理随便改东西了,把skill_file作为一个静态文件,要添加技能的时候,只需在技能文件sikll_file里添加就可以了,完全不用改代码。

要修改增加效果,也只需把对应效果的类修改一下,操作十分简单。

8.接下来,分析一下以上代码的面向对象思想:

三大特征:

封装:将每种影响效果单独封装成类.

继承:将各种影响效果抽象为SkillImpactEffect

隔离技能释放器与各种影响效果的变化。

多态:各种影响效果在重写SkillImpactEffect类中impact方法.

释放器调用SkillImpactEffect执行各种效果。

六大原则:

开闭原则:增加新(技能/影响效果),不修改释放器代码.

单一职责:SkillImpactEffect 负责 隔离变化

DamageEffect.. 负责定义具体的效果

SkillDeployer 负责释放技能

依赖倒置:(1)释放器没有调用具体影响效果,而是调用SkillImpactEffect。

(2)抽象的不依赖于具体的。

具体做法:

释放器通过"依赖注入"(读取配置文件,

创建影响效果对象),使释放器不依赖具体影响效果.

组合复用:释放器与影响效果是组合关系.

可以灵活的选择各种影响效果。

里氏替换:(1)父类出现的地方可以被子类替换

释放器存储影响效果列表,实际可以将各种子类存入进来.

迪米特法则:所有类之间的耦合度都很低.

python游戏对象_python基础----以面向对象的思想编写游戏技能系统相关推荐

  1. python回合制游戏教程_Python基础之面向对象(回合制游戏)

    需求: 回合制游戏: 大话西游.梦幻西游.魔塔... 角色: Hero: 属性: 名字.生命值.伤害值(浮动随机值) 方法: 攻击方法 Boss: 属性: 名字.生命值.伤害值(浮动) 方法: 攻击方 ...

  2. python @修饰符_Python基础(面向对象之类成员与修饰符)

    本篇将介绍Python 类的成员.类成员修饰符.类的特殊成员. 类的成员可以分为三大类:字段.方法.属性 1.字段: 也可理解为变量,分为: 普通字段:保存在对象中,访问时通过"对象.字段名 ...

  3. python基本对象_python基础教程:运算对象、运算符、表达式和语句

    编程的本质就是数据和运算,数据由基本数据类型.数据结构来表示,运算就是对这些数据的各种操作,基本的加减乘除.是非判断.流程控制等等.这些操作就是今天我们要讲的运算符.表达式和语句. 前面我们学习Pyt ...

  4. 第二章(1):Python入门:语法基础、面向对象编程和常用库介绍

    第二章(1):Python入门:语法基础.面向对象编程和常用库介绍 目录 第二章(1):Python入门:语法基础.面向对象编程和常用库介绍 1. Python 简介 1.1 Python 是什么? ...

  5. Python学习教程(Python学习路线_Python基础学习教程_Python视频教程):初学者新手怎样快速入门Python

    Python学习教程(Python学习路线_Python基础学习教程_Python视频教程):初学者新手怎样快速入门Python? 人生苦短,我用Python!!!短短几个字,现在在各大学习类平台随处 ...

  6. 用面向对象的思想探讨游戏“魔兽争霸”(1)

    [文章标题]用面向对象的思想探讨游戏"魔兽争霸"(1) [文章作者]曾健生 [作者邮箱]zengjiansheng1@126.com [作者QQ]190678908 [作者博客]h ...

  7. java编写计算类加减乘除_老师要求张浩使用面向对象的思想编写一个计算器类(Calculator),可以实现两个整数的加减乘除的运算.java...

    导航:网站首页 > 老师要求张浩使用面向对象的思想编写一个计算器类(Calculator),可以实现两个整数的加减乘除的运算.java 时间:2019-4-10 老师要求张浩使用面向对象的思想编 ...

  8. python登录面向对象_python基础之面向对象

    面向对象编程 面向过程编程:根据业务逻辑从上到下写代码,主要突出在流程上 函数式编程:将某些功能封装在函数里,日后不用重复编写,仅调用函数即可 面向对象编程:对函数进行分类和封装,让开发"更 ...

  9. python 对象_Python小课堂面向对象

    Python3 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触 ...

  10. python拍7游戏代码_Python基础语法-7(小游戏)

    代码太长?内容太复杂? 不用担心!往下看↓ 知道为什么python简洁,省力么? 就是因为python有很多写好的工具箱可以直接调用,我们只要开头给一个命令,在我们的代码 就可以直接使用它的功能了,这 ...

最新文章

  1. 安装sql 2005 闪退 连接到服务器失败。错误:0x80070424
  2. 2019 快过去了,自动驾驶发展得怎么样了?
  3. async [ə'zɪŋk] 函数
  4. Activiti 6.x【6】StartEvent(上)
  5. ASP.NET XML读取、增加、修改和删除操作
  6. pdf复制乱码_一键解决PDF转换问题,这个网站好用到爆!
  7. web前端入门学习(纯干货)
  8. c/c++教程 - 1.4 数据类型 sizeof
  9. 算法-第四版-练习1.2.3解答
  10. 如何使用Excel的数据去查询数据库?
  11. 第九届“泰迪杯”数据挖掘挑战赛C题-建模思路参考
  12. mysql如何找回误删除数据_mysql如何找回误删除数据
  13. android 休眠任务不执行_Android休眠机制
  14. Linux常用命令:系统信息、关机重启、文件和目录操作、文件搜索、文件权限、挂载、磁盘空间、用户及群组、解压缩、备份等操作。
  15. Python实现基于负熵最大判据的FastICA胎心信号分离
  16. 百度前端技术体系——百度EFE(Excellent FrontEnd)技术体系
  17. 一个程序员的奋斗txt
  18. HTC Vive 手柄
  19. 用js进行日期的加减
  20. github在线修改文章

热门文章

  1. docker端口映射后连不上的问题
  2. 一位10年Java工作经验的架构师聊Java和工作经验
  3. 如何看懂常用原理图符号、如何阅读原理图
  4. 【集合论】集合概念与关系 ( 集族 | 集族示例 | 多重集 )
  5. java实现机器人行走
  6. python运行内存不足_Python内存不足(使用后缀树)
  7. Elasticsearch 特定场景下使用
  8. 坚果pro2刷回官方_坚果Pro2刷机教程刷TWRP面具详细步骤_软件开发_IT综合服务
  9. mysql 删除数据后myd_关于mysql 删除数据后(.MYD,MYI)物理空间未释放
  10. Craps赌博游戏-python3