




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【文章标题】用面向对象的思想探讨游戏“魔兽争霸”(2)-继承和多态的应用(修改版)【文章作者】曾健生【作者邮箱】【作者QQ】190678908【作者博客】/newjueqi/【编程环境】JDK 1.6.0_01【作者声明】欢迎转载文章,但转载请保留文章的完整性以及注明文章的出处。*在上一篇文章用面向对象的思想探讨游戏“魔兽争霸”(1)(详见本人博客/newjueqi, /),文中用面向对象的一个特性封装,初步实现了代码,正如在上文末尾讨论的一样,代码有相当多可改进的地方,本文将使用面向对象中另外两个特性继承和多态改进代码。仔细比较上篇文章中的弓箭手类Bower和食尸鬼类Ghost,可发现除了构造函数,移动的方法moveTo,受到攻击时的方法getHunt外,其他的方法都是一样的。这时可把两个类中的相同的部分提炼出来写成一个父类Fighter,把弓箭手类Bower和食尸鬼类Ghost继承于父类Fighter,根据子类和父类的关系:子类自动继承父类公有的属性和方法,并且子类可以在父类的基础上增加方法、覆盖方法,以增强、改进父类。所以就能很方便地实现代码的复用。另外我们观察食尸鬼类Ghost受到攻击时的方法getHunt的定义:public void getHunt( Bower bo )函数的传入参数为弓箭手类的对象,这样就会产生一个问题,如果食尸鬼类Ghost不是被弓箭手攻击而是被女猎手攻击呢?难道要为每种情况单独写一个方法处理吗?现在可以利用面向对象中的多态的特性,用一个父类的引用指向一个子类的对象,就可以用父类调用子类的方法,这样做最大的好处就是遮避了不同的子类类型,只要子类是继承父类,调用各个子类的方法都可以用父类的方法调用代替。我们可以仔细比较上文用面向对象的思想探讨游戏“魔兽争霸”(1)中的弓箭手类Bower和食尸鬼类Ghost可发现,除了移动方法moveTo和受到攻击的方法getHunt外,其他方法的实现都是相同的。我们可把相同的属性和方法设计成一个抽象类Fighter,代码如下:/战士类,所有的士兵都继承于这个类abstract class Fighterprivate int posX; /战士在地图上X的坐标private int posY; /战士在地图上Y的坐标private int id; /战士在地图上Y的坐标private int lifeNum; /战士的生命值private int attackNum; /战士的攻击力private int untenNum; /战士的防御力public Fighter(int posX, int posY, int id, int lifeNum, int attackNum,int untenNum) this.posX = posX;this.posY = posY;this.id = id;this.lifeNum = lifeNum;this.attackNum = attackNum;this.untenNum = untenNum;/*一般来说,生命值,攻击力,防御力等都属于对象的核心数据,对它们的访问必须要严格控制,所以设计出getLifeNum(),getAttackNum(),getUntenNum()这三个方法*/获取战士的剩余生命值public int getLifeNum()return lifeNum;/设置战士的生命值public void setLifeNum( int num )lifeNum=num;/获取战士的攻击力public int getAttackNum()return attackNum;/获取战士的防御力public int getUntenNum()return untenNum;/获取战士的ID号public int getId()return id;/获取战士的X坐标public int getPosX() return posX;public void setPosX(int posX) this.posX = posX;/获取战士的Y坐标public int getPosY() return posY;public void setPosY(int posY) this.posY = posY;/用战士攻击别人的方法,传入的参数为攻击的对象/附:本人感觉这个攻击行为抽象的设计非常差,如果有好的方法,/敬请指教public void attack( Fighter fighter )fighter.getHunt( this );/战士的移动行为,就是一般情况下用点击了/一个战士后命令战士移动到某个位置所用的方法/传入参数为要移动到的对象abstract public void moveTo( Fighter fighter );/受到攻击时调用这个方法计算伤害值abstract public void getHunt( Fighter fighter );把弓箭手类Bower继承战士类Fighter,实现不同的移动方法moveTo和受到攻击的方法getHunt,代码如下:/这是一个弓箭手类class Bower extends Fighter/构造函数,生产一个弓箭手,传入参数为在地图中的坐标public Bower( int posX,int posY, int id,int lifeNum,int attackNum,int untenNum )super( posX, posY, id, lifeNum, attackNum, untenNum );System.out.println(弓箭手 +id+生产完毕了);/弓箭手移动的行为,就是一般情况下用点击了/一个战士后命令战士移动到某个位置所用的方法/传入参数为要移动到的对象public void moveTo( Fighter fighter )setPosX( fighter.getPosX() );setPosY( fighter.getPosY() );System.out.println( 弓箭手+getId()+移动到地点 +getPosX()+,+getPosY() );/受到攻击时调用这个方法计算伤害值public void getHunt( Fighter fighter )/只有在食尸鬼和弓箭手都没死亡的前提下会攻击if( fighter.getLifeNum()0 & getLifeNum()0 )/如果受到的攻击值大于自身的生命值表示对象死亡if( (fighter.getAttackNum()-getUntenNum()=getLifeNum() )setLifeNum( 0 );System.out.print(弓箭手+getId()+受到食尸鬼+fighter.getId();System.out.print(的攻击力+fighter.getAttackNum();System.out.println(,弓箭手+getId()+死亡);else /用生命值减去受到的伤害值setLifeNum( getLifeNum()-(fighter.getAttackNum()-getUntenNum() );System.out.print(弓箭手+getId()+受到食尸鬼+fighter.getId();System.out.print(的攻击力+fighter.getAttackNum();System.out.println(,剩余生命值为+getLifeNum(); 我们简单分析一下其中一个多态的例子public void moveTo( Fighter fighter )setPosX( fighter.getPosX() );setPosY( fighter.getPosY() );System.out.println( 弓箭手+getId()+移动到地点 +getPosX()+,+getPosY() );通常我们是这样调用这个方法的:bo1.moveTo( gs ); /bo1为弓箭手的实例,gs为食尸鬼的实例由于食尸鬼类Ghost继承于战士类Fighter,根据多态的特点,在函数moveTo()中的语句fighter. getPosX ()实际上执行的是食尸鬼类Ghost中的moveTo方法。本文全部多态都是用这个方法实现的,所以下面的代码如果用到同样的方法就不多解释了。把食尸鬼类Ghost继承战士类Fighter,实现不同的移动方法moveTo和受到攻击的方法getHunt,代码如下:/这是一个食尸鬼类class Ghost extends Fighter/构造函数,生产一个食尸鬼,传入参数为在地图中的坐标public Ghost( int posX,int posY, int id,int lifeNum,int attackNum,int untenNum )super( posX, posY, id, lifeNum, attackNum, untenNum );System.out.println(食尸鬼 +id+生产完毕了);/食尸鬼移动的行为,就是一般情况下用点击了/一个战士后命令战士移动到某个位置所用的方法/传入参数为要移动到的对象public void moveTo( Fighter fighter )setPosX( fighter.getPosX();setPosY( fighter.getPosY();System.out.println( 食尸鬼+getId()+移动到地点 +getPosX()+,+getPosX() );/受到攻击时调用这个方法计算伤害值public void getHunt( Fighter fighter )/只有在食尸鬼和弓箭手都没死亡的前提下会攻击if( fighter.getLifeNum()0 & getLifeNum()0 )/如果受到的攻击值大于自身的生命值表示对象死亡if( ( fighter.getAttackNum()-getUntenNum()=getLifeNum() )setLifeNum( 0 );System.out.print(食尸鬼+getId()+受到弓箭手+fighter.getId();System.out.print(的攻击力+fighter.getAttackNum();System.out.println(,食尸鬼+getId()+死亡);else /用生命值减去受到的伤害值setLifeNum( getLifeNum() -(fighter.getAttackNum()-getUntenNum() );System.out.print(食尸鬼+getId()+受到弓箭手+fighter.getId();System.out.print(的攻击力+fighter.getAttackNum();System.out.println(,剩余生命值为+getLifeNum() );测试的代码和上文用面向对象的思想探讨
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年铅及铅合金材项目发展计划
- 安全培训效果评估记录课件
- Glyoxal-d2-生命科学试剂-MCE
- 2025年威海市立医院公开招聘高层次急需紧缺专业技术人才(33人)考前自测高频考点模拟试题及答案详解(典优)
- 2025广东广州市中山大学孙逸仙纪念医院肿瘤科放疗专科科研助理招聘1人考前自测高频考点模拟试题附答案详解(考试直接用)
- 小学假期安全培训记录课件
- 小学保安安全演练培训课件
- 农村电商行业农产品网络销售渠道拓展
- 安全培训效果好的词语课件
- 2025年离合器:离合器从动盘合作协议书
- 幼儿园绘本故事:《排队喽》 课件
- 林彪 军事演讲课件
- 颈脊髓损伤患者护理查房PPT
- 增员及邀约话术2-2课件
- 会计凭证考试试题
- 《冷冲压工艺与模具设计》完整版ppt课件全套教程
- 高中英语 选必B1 Unit2 Onwards and upwards 第4课时-Developing ideas 课件
- 重量法测定矿物质原始记录
- 自采商品管理流程
- 第2章 计算机中数的表示方法
- 有机化学 第十三章 有机含氮化合物
评论
0/150
提交评论