zoukankan      html  css  js  c++  java
  • 多态的作用-游戏编程展示------新标准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++程序设计

  • 相关阅读:
    利用世界杯,读懂 Python 装饰器
    利用python开发app实战
    Python协程(真才实学,想学的进来)
    Python 中的 10 个常见安全漏洞,以及如何避免(上)
    Python学到什么程度才可以去找工作?掌握这4点足够了!
    Hadoop Yarn调度器的选择和使用
    CSS 预处理器 Stylus分享
    我想写小说了怎么回事...
    新随笔-- from笔试
    我是不是有点胖了
  • 原文地址:https://www.cnblogs.com/l2017/p/7819968.html
Copyright © 2011-2022 走看看