多态的作用-游戏编程展示------新标准c++程序设计
发布日期:2022-04-04 06:36:21 浏览次数:2 分类:博客文章

本文共 2423 字,大约阅读时间需要 8 分钟。

  游戏软件的开发最能体现面向对象设计方法的优势。游戏中的人物、道具、建筑物、场景等都是很直观的对象,游戏运行的过程就是这些对象相互作用的过程。每个对象都有自己的属性和方法,不同对象也可能有共同的属性和方法,特别适合使用继承、多态等面向对象的机制。下面就以“魔法门”游戏为例来说明多态在增加程序可扩展性方面的作用。

  “魔法门”游戏中有各种各样的怪物,如骑士、天使、狼、鬼,等等。每个怪物都有生命力、攻击力这两种属性。怪物能够相互攻击。一个怪物攻击另一个怪物时,被攻击者会受伤;同时被攻击者会反击,使得攻击者也受伤。但是反击只有其自身攻击力的一半。而且还有各自的攻击、反击动作(省略)

不用多态:

class C_dragon{  //龙 
private:
int power;
//攻击力
 int life_value;
//生命值
 public:
 
void Attack(C_wolf* p);
//攻击 狼 的成员函数
void Attack(C_ghost* p);
//攻击 鬼 的成员函数
//......其他Attack重载函数 
//表现受伤的成员函数 
void Hurted(int n_power);
//被攻击,生命值降低的成员函数 
void Fight_back(C_wolf* p);
//反击 狼 的成员函数 
void Fight_back(C_ghost* p);
//反击 鬼 的成员函数 
//......其他Fight_back重载函数 };void C_dragon::Attack(C_wolf* p){
p->Hurted(power);
p->Fight_back(this);}void C_dragon::Attack(C_ghost* p){
p->Hurted(power);
p->Fight_back(this);}void C_dragon::Hurted(int n_power){
life_value-=n_power;}void C_dragon::Fight_back(C_wolf* p){
p->Hurted(power/2);}void C_dragon::Fight_back(C_ghost* p){
p->Hurted(power/2);}

实际上,如果游戏中有n种怪物,C_dragon类中就会有n个Attack成员函数,n个Fight_back成员函数。对于其他类,如C_wolf类等,也是这样。
  以上为非多态的实现方法。在增加怪物种类多的时候,工作量会比较大。例如增加怪物“雷鸟”,除了编写一个C_bird类外,所以的类都需要增加一下两个成员函数,用以对“雷鸟”实施攻击,以及被“雷鸟”攻击时的反击:

void Attack(C_bird* p){
p->Attack(power);
p->Fight_back(this);
};void Fight_back(C_bird* p){
p->Hurted(power/2)
};

  实际上,在非多态的实现中,使代码更精简的做法是将C_dragon、C_wolf等类的共同特点抽取出来,形成一个C_creature类,然后再从C_creature类派生出C_dragon、C_wolf等类,但是由于每种怪物的表现动作不同,这些类还要实现各自的Hurted、Attack、Fight_back成员函数。因此,如果没有利用多态机制,那么即便引入基类C_creature,对程序的可扩充性也没有太大帮助。

使用多态:

  设置一个基类C_creature,概括所有怪物的共同科殿。所以具体的怪物类,如C_dragon、C_wolf、C_ghost等,均从C_creature类派生而来。

C_creature:

class C_creature{
//“怪物”类
protected:
int life_value,power;
public:
virtual void Attack(C_creature* p){};
virtual void Hurted(int n_power){};
virtual void Fight_back(C_creature* p){};};

  可以看到,基类C_creature中只有一个Attack成员函数,也只有一个Fight_back成员函数。

  实际上,所以C_creature类的派生类也都只有一个Attack成员函数和一个Fight_back成员函数。例如 C_dragon类:

class C_dragon::public C_creature{
public:
virtual void Attack(C_creature* p){
p->Attack(power);
p->Fight_back(this);
};
virtual void Hurted(int n_power){
life_value-=n_power;
};
virtual void Fight_back(C_creature* p){
p->Hurted(power/2)
};};

C_dragon类的成员函数中省略了表现动作的那部分代码。其他类的写法和C_dragon类类似,只是实现动作的代码不同。

  在上述多态的写法中,当需要增加新怪物“雷鸟”时,只需要编写新类C_bird即可。不需要在已有的类中专门为新怪物增加:

void Attack(C_bird* p){
p->Attack(power);
p->Fight_back(this);
};void Fight_back(C_bird* p){
p->Hurted(power/2)
}; 

这两个成员函数,也就是说,其他类根本不用修改。这样一来跟前面的非多态方法相比,程序的可扩充性大大提高了。

 

 新标准c++程序设计

转载地址:https://www.cnblogs.com/l2017/p/7819968.html 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:类与类之间的两种关系------新标准c++程序设计
下一篇:多态实现的原理------新标准c++程序设计

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.249.68.18]2022年05月22日 15时33分22秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

最新文章

webdriver学习笔记-类方法属性||四(2)下拉框(select类)的三种处理用法 2022-03-03
webdriver学习笔记||三、浏览器的属性-方法 2022-03-03
webdriver学习笔记-类方法属性||四(3)下拉框(没有select)处理方法 2022-03-03
webdriver学习笔记||三(2)浏览器(js的)上移和下滑 2022-03-03
Perhaps JAVA_HOME does not point to the JDK. It is currently set to "C:\Program Files\Java\jre7" 2019-12-29 10:43:45
chrome 离线安装包下载 2019-12-29 10:43:45
Apache Ant编写build.XML的自动提示 ANT DTD 2019-12-29 10:43:45
Maven项目如何将自定义文件添加到META-INF目录下 2019-12-29 10:43:46
欢迎使用CSDN-markdown编辑器 2019-12-29 10:43:46
禁止浏览器自动填充密码 2019-12-29 10:43:43
Python序列化和反序列化JSON的方法整理 2019-12-29 10:43:43
selenium(python)定位(查找)元素的方法小结 2019-12-29 10:43:44
flex布局入门案例(学习笔记20171022001) 2019-12-29 10:43:44
一个MySQL的批量修改表字段(列)类型的自定义存储过程 2019-12-29 10:43:44
Java实现一些排序算法和数据结构(练习) 2019-12-29 10:43:44
Ubuntu root 密码忘记-恢复 2019-12-29 10:43:45
处理 bootstrap datetimepicker 误点击事件 2019-12-29 10:43:42
selenium.common.exceptions.WebDriverException: Message: Missing 'type' parameter 2019-12-29 10:43:42
oracle按照2个字段分区 over(partition by A,B order by C) 2019-12-29 10:43:42
selenium以及selenium driver对应各主流浏览器版本小结(计划持续更新) 2019-12-29 10:43:43