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

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.废话不多说,直接上代码:

  ```

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

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 LowerDeffence(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 Knockback(SkillImpactEffect):    """        效果:震退    """    def __init__(self, value):        self.value = value    def impact(self):        print(‘震退敌人到%d丈之外!‘)

class LowerSpeed(SkillImpactEffect):    """        效果:减速    """    def __init__(self, value, time):        self.value = value        self.time = time    def impact(self):        print(‘减速%d,持续时间%d‘ % (self.value, self.time))

class SkillDeployer:    """        技能释放器    """    # 生成技能(执行效果)    def __init__(self,name):        self.name = name        # 加载配置文件{技能:[效果1,效果2.。。]}        self.__dict_skill_config = self.load_config_file()        # 创建效果对象        self.__effect_object = self.create_effect_objects()    def load_config_file(self):        # 加载技能文件。        return sikll_file

    def create_effect_objects(self):        # 根据name创建相应的技能对象        list_effect_name = self.__dict_skill_config[self.name]        list_effect_object = []        for item in list_effect_name:            # 效果对象,加入技能列表            effect_object = eval(item)            list_effect_object.append(effect_object)        return list_effect_object

    def generate_skill(self):        print(‘%s释放‘%self.name)        for item in self.__effect_object:            item.impact()

xlsbz = SkillDeployer(‘降龙十八掌‘)xlsbz.generate_skill()lmsj = SkillDeployer(‘六脉神剑‘)lmsj.generate_skill()bmsg = SkillDeployer(‘北冥神功‘)bmsg.generate_skill()

  ```

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

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

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

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

原文地址:https://www.cnblogs.com/jeffrey04118110/p/11770555.html

时间: 2024-07-29 07:38:05

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

Day6 - Python基础6 面向对象编程

Python之路,Day6 - 面向对象学习 本节内容: 面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法. 引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏,你就思考呀,人狗作战,那至少需要2个角色,一个是人, 一个是狗,且人和狗都有不同的技能,比如人拿棍打狗, 狗可以咬人,怎么描述这种不同的角色和他们的功能呢? 你搜罗了自己掌握的所有技能,写出了下面的代码来描述这两个角色 1 2 3 4 5 6 7 8 9 10 11

Python基础09 面向对象的进一步拓展

Python基础09 面向对象的进一步拓展 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们熟悉了对象和类的基本概念.我们将进一步拓展,以便能实际运用对象和类. 调用类的其它信息 上一讲中提到,在定义方法时,必须有self这一参数.这个参数表示某个对象.对象拥有类的所有性质,那么我们可以通过self,调用类属性. class Human(object): laugh = 'hahahaha' def show_laugh(

Python基础-初始面向对象

面向对象vs面向过程 面向过程 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可. 缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身. 应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等. 面向对象 面向对象的程序设计的核心是对象(上帝式思维),要

Python基础之面向对象2(封装)

一.封装定义: 二.作用 三.私有成员: 1.基本概念及作用 2.__slots__手段私有成员: 3.@property属性手段私有成员: 四.基础示例代码 1.用方法封装变量 """ 练习:用方法封装变量 """ class Enemy: def __init__(self,name,atk,speed,hp): self.set_name(name) self.set_atk(atk) self.set_atk_speed(speed) s

python基础之面向对象编程

面向对象编程思想 面向对象是一门编程思想,编程思想仅仅是一门思想,与任何技术无关 核心是对象两字,对象可以理解为特征与技能的结合体 基于该编程思想编写程序,就好比创造世界,一种造物主的思维方式 优点:可扩张性强 缺点:编写程序的复杂难度比面向过程高 以上都是纯理论,理解下用自己的话能编出来就行,下面来说说核心对象 在现实世界中,通过一个个的对象,根据相同的特征和行为,再分门别类. 但是在程序中,必须先有类,再通过调用类,创建对象. 那么,咱们如何定义类,又如何创建对象呢?(暂时还是先说理论吧,不

Python基础08 面向对象的基本概念

Python基础 面向对象的基本概念 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 谢谢逆水寒龙,topmad和Liqing纠错 Python使用类(class)和对象(object),进行面向对象(object-oriented programming,简称OOP)的编程. 面向对象的最主要目的是提高程序的重复使用性.我们这么早切入面向对象编程的原因是,Python的整个概念是基于对象的.了解OOP是进一步学习Python

python基础之面向对象初识

一 面向对象初识 Python要么是面向过程要么是面向对象. 概念及优缺点: 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了程序的复杂度 缺点是:一套流水线或者流程就是用来解决一个问题,生产汽水的流水线无法生产汽车,即便是能,也得是大改,改一个组件,牵一发而动全身. 应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等. 面向对象的

Python基础入门-实现猜数字小游戏

今天呢,我们来通过前面学过的一些知识点来完成一个猜数字大小的游戏程序设计.那么呢,一般人写代码直接上来就干,没有分析,这样的做法是没有产出的,除非你是大牛,今天呢,我会把我学习编程的思路分享给大家,我的思路可能不是最好的,但是一定可以给你一点点的启发,来,让我们看一下这个写这个小程序该怎么去分析呢? 需求分析:用python实现一个猜数字的小游戏(场景可以自拟)这里我给出的需求是,我们还是先看一下流程图吧! 程序分析流程图: 分析思路: 1.如果设置默认值也就是结果数字,那么请输出"I"

游戏技能系统

技能系统A.技能的状态转换[前摇动作 | 吟唱]--[效果延迟+(持续效果 | 瞬时效果) | 持续引导]--[后摇动作]1.瞬发类技能:无吟唱.无效果延迟2.吟唱类技能:需要一段时间进行施法前的准备过程,可以被打断,打断施法失败3.引导类技能:需要持续进行施法,一旦停止施法,则停止伤害 B.技能的影响对象1.自已2.敌方3.队友4.任意单位 C.技能的释放对象1.自己2.单个敌方3.单个队友4.任意单个5.区域,以自己位置为参考,以选中单位坐标为释放参考,以施法参考圈为参考 D.技能的影响范围