多态的作用-游戏编程展示------新标准c++程序设计

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

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

不用多态:

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++程序设计

posted @ 2017-11-12 21:58  ff_d  阅读(607)  评论(0编辑  收藏  举报