C++ 奥特曼打怪兽之多态(系列5)

题目描述

重新组织和修改前面“类的继承”的代码,利用多态实现以下内容,使得下面的main函数能正确执行并输出相关信息。

对怪兽类进行了扩充和修改:

Monster类:

1.添加lose方法,当被奥特曼打败后,输出:Boss!Help!

2.修改display方法,以以下格式输出怪兽状态(??代表具体数值):

怪兽状态(rank=?? hp=?? damage=?? exp=?? money=??)

Boss类:

1.修改绝招(XP)方法,在原来的基础上添加代码,使得每次调用此方法时,输出:

XP*****

2.添加lose方法,当被奥特曼打败后,输出:

I’ll be back!

3.修改display方法,以以下格式输出怪兽状态(??代表具体数值):

Boss怪兽状态(rank=?? hp=?? damage=?? exp=?? money=??)

请自行将部分函数设置成虚函数,以实现多态。


谁也不知道迎接奥特曼的下一个怪兽是小怪兽还是Boss。边打边看,且打且珍惜吧。

int main(){

//输入奥特曼的等级值,利用等级值,声明一个奥特曼对象并显示奥特曼对象初始状态。

int ograd;   cin>>ograd;

Ultraman uobj(ograd);

int t;   cin>>t;//输入要打的怪兽个数数

while(t--&&uobj.getHp()>10){//只要奥特曼没死也没逃跑,就继续与怪兽的战斗

     uobj.display();  

     Monster* p; 

     char c=0;

     while(1){

         cin>>c;

         if(c=='B') {p=new Boss();break;}

         else if(c=='M') {int r;cin>>r;p=new Monster(r);break;}  

         else cout<<"请重新输入怪兽类型"<<endl;

     }

     p->display();        

     //设置战斗标志flag为true,启动战斗循环,具体如下:

     int flag=1;

     while(flag) //当战斗未结束就继续

     {   uobj.attack(*p);//奥特曼攻击1次            

         if (p->getHp()>0)  //怪兽没死

         {   p->fightback(uobj);//怪兽反击1次

              if (uobj.getHp()>10)      //奥特曼生命值大于点,不逃跑

                  uobj.restore();//奥特曼回血,在方法中判断是否需要加血

              else {   //奥特曼逃跑,并输出"lose"并回车

                  uobj.escape();

                  cout<<"lose"<<endl;                   

                  uobj.display();//输出奥特曼状态       

                  flag=0;//停止战斗                 

              }

         }

         else //怪兽死了

         {   uobj.win(*p);     //奥特曼胜利,并输出"win"并回车

              cout<<"win"<<endl;

              uobj.upgrade();//奥特曼升级

p->lose();//输出怪兽战败信息

              flag=0;//停止战斗

         }

     }

}

return 0;

 }

输入
第1行输入奥特曼等级

第2行输入怪兽个数

对于每个怪兽,首先输入怪兽类别(‘M’或‘B’)

如果是小怪兽,接着下一行输入怪兽等级

输出
输出战斗过程。具体参考Sample Output

样例输入
30 3 M 5 M 5 B
样例输出
奥特曼状态(rank=30 hp=300 damage=90 exp=0 money=300)
怪兽状态(rank=5 hp=100 damage=10 exp=50 money=50)
win
Boss!Help!
奥特曼状态(rank=30 hp=295 damage=90 exp=50 money=350)
怪兽状态(rank=5 hp=100 damage=10 exp=50 money=50)
win
Boss!Help!
奥特曼状态(rank=30 hp=290 damage=90 exp=100 money=400)
Boss怪兽状态(rank=10 hp=300 damage=50 exp=1000 money=1001)
win
I’ll be back!

#include<iostream>
#include <cstring>
using namespace std;
class Monster;		//前置声明Monster类,因为Ultraman类中用到了 
class Boss;			//同理 
class Ultraman {
	private:
		int rank; // 等级
		int hp;	 	//生命值
		int damage;	//攻击力
		int exp;	//经验
		int money;	//钱
	public:
		Ultraman(int);
		void display();	//展示实力
		void escape();	//逃跑
		void attacked(int);	//被攻击		
		void attack(Monster&);	//攻击
		void restore();	//补血
		void win(Monster);		//胜利
		void upgrade();	 //升级
		void die();
		int get_rank();
		int get_hp();
		int get_damage();
		int get_exp();
		int get_money();
};
class Monster {
	protected:
		int rank; // 等级
		int hp;	 	//生命值
		int damage;	//攻击力
		int exp;	//经验
		int money;	//钱
	public:
		Monster(int);
		Monster() {	};
		void attacked(int);	//被攻击
		void fightback(Ultraman&);	//攻击	
		int get_rank();
		int get_hp();
		int get_exp();
		int get_money();
		int get_damage();
		virtual	void lose();
		virtual void display();
};
class Boss:public Monster {
	private:
		int count;  //大招怒气,即被打次数 
	public:
		Boss();
		void fightback(Ultraman&);
		void attacked(int);
		int get_count() {
			return count;
		}
		virtual void lose();
		void XP(Ultraman&); 
		virtual void display();
};
Ultraman::Ultraman(int a) {
	rank=a;
	hp=10*a;
	exp=0;
	damage=3*a;
	money=10*a;
}
int Ultraman::get_rank() {
	return rank;
}
int Ultraman::get_hp() {
	return hp;
}
int Ultraman::get_damage() {
	return damage;
}
int Ultraman::get_exp() {
	return	exp;
}
int Ultraman::get_money() {
	return money;
}
//当生命不超过10点时,奥特曼将逃跑,逃跑将损失所有金钱
void Ultraman::escape() {
	money=0;
}
void Ultraman::win(Monster Viga) {
	exp+=Viga.get_exp();
	money+=Viga.get_money();
}
void Ultraman::attack(Monster& Viga) {		//奥特曼攻击相当于怪兽被攻击,经典《相对论》
	Viga.attacked(damage);
}
void Ultraman::attacked(int monster_damage) {		//被打就要扣血 
	hp-=monster_damage/2;
}
void Ultraman::upgrade() {
	while(exp>=10*rank) {
		exp-=10*rank;
		rank++;
		hp=rank*10;
		damage=rank*3;
	}
}
void Ultraman::restore() {
	while(hp<5*rank&&money>=10) {
		hp++;
		money-=10;
	}
}
void Ultraman::display() {
	cout<<"奥特曼状态(rank="<<rank;
	cout<<" hp="<<hp;
	cout<<" damage="<<damage;
	cout<<" exp="<<exp;
	cout<<" money="<<money<<")"<<endl;
}
void Ultraman::die() {
	money=0;
	cout<<"lose"<<endl;
}
Monster::Monster(int a) {
	rank=a;
	hp=20*a;
	damage=a*2;
	money=10*a;
	exp=a*10;
}
int Monster::get_rank() {
	return rank;
}
int Monster::get_hp() {
	return hp;
}
int Monster::get_damage() {
	return damage;
}
int Monster::get_exp() {
	return	exp;
}
int Monster::get_money() {
	return money;
}
void Monster::fightback(Ultraman &Tiga) { 	 	//怪兽攻击相当于奥特曼被攻击,经典《相对论》 
	Tiga.attacked(damage);
}
void Monster::attacked(int ultraman_damage) {	//被攻击就扣血 
	hp-=ultraman_damage;
}
void  Monster::lose(){
	cout<<"Boss!Help!"<<endl;
}
void Monster::display(){
	cout<<"怪兽状态(rank="<<rank;
	cout<<" hp="<<hp;
	cout<<" damage="<<damage;
	cout<<" exp="<<exp;
	cout<<" money="<<money<<")"<<endl;
}
Boss::Boss() {
	count=0;
	rank=10;
	hp=300;
	exp=1000;
	damage=50;
	money=1001;
}
void Boss::attacked(int ultraman_damage) {	//被攻击就扣血 
	hp-=ultraman_damage;
	count++;   //攒大招怒气 
}
void Boss::fightback(Ultraman &Tiga){
	if(count%5!=0)		//攒满五次怒气开大 
		Tiga.attacked(damage);
	else{
		XP(Tiga);
	}
		
}
void Boss::display(){
	cout<<"Boss怪兽状态(rank="<<rank;
	cout<<" hp="<<hp;
	cout<<" damage="<<damage;
	cout<<" exp="<<exp;
	cout<<" money="<<money<<")"<<endl;
}
void Boss::lose(){
	cout<<"I'll be back!"<<endl;
}
void Boss::XP(Ultraman &Viga){
	for(int i=0;i<3;i++)
	Viga.attacked(damage);  //大招攻击三次 
	cout<<"XP*****"<<endl; //用大招名字要念出来 
}
int main(){
    //输入奥特曼的等级值,利用等级值,声明一个奥特曼对象并显示奥特曼对象初始状态。
    int ograd;   
	cin>>ograd;
    Ultraman uobj(ograd);
    int t;   
	cin>>t;//输入要打的怪兽个数数
    while(t--&&uobj.get_hp()>10){//只要奥特曼没死也没逃跑,就继续与怪兽的战斗
         uobj.display();  
         Monster* p; 
         char c=0;
         while(1){
             cin>>c;
             if(c=='B') {p=new Boss();break;}
             else if(c=='M') {int r;cin>>r;p=new Monster(r);break;}  
             else cout<<"请重新输入怪兽类型"<<endl;
         }
         p->display();        
         //设置战斗标志flag为true,启动战斗循环,具体如下:
         int flag=1;
         while(flag) //当战斗未结束就继续
         {   uobj.attack(*p);//奥特曼攻击1次            
             if (p->get_hp()>0)  //怪兽没死
             {   p->fightback(uobj);//怪兽反击1次
                  if (uobj.get_hp()>10)      //奥特曼生命值大于点,不逃跑
                      uobj.restore();//奥特曼回血,在方法中判断是否需要加血
                  else {   //奥特曼逃跑,并输出"lose"并回车
                      uobj.escape();
                      cout<<"lose"<<endl;                   
                      uobj.display();//输出奥特曼状态       
                      flag=0;//停止战斗                 
                  }
             }
             else //怪兽死了
             {   uobj.win(*p);     //奥特曼胜利,并输出"win"并回车
                  cout<<"win"<<endl;
                  uobj.upgrade();//奥特曼升级
				  p->lose();//输出怪兽战败信息
                  flag=0;//停止战斗
             }
         }
    }
    return 0;
}

在这里插入图片描述

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值