C++ 奥特曼打怪兽之类的继承(系列4)

题目描述
重新组织和修改前面“类的实现”的代码,利用继承实现以下内容。

奥特曼在与多个小怪兽过招的过程中,不断提升自己的等级。在一切就绪的时候,就可以挑战小怪兽的头Boss了。打败Boss就可以获得最终的胜利。

在怪兽类的基础上,定义和实现一个子类Boss类。如有必要,请对奥特曼和怪兽类做出相应的修改。

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

1.Boss属性的初始值与一般怪兽不同,等级为10,生命值为300,经验值是1000,攻击力是50,钱数是1001。

2.Boss有一个新的方法,即绝招(XP)。该方法将连续攻击奥特曼3次。

3.Boss的反击方法(fightback)也与一般怪兽不同,一般情况下受到奥特曼的攻击就会反击一次,但每当Boss受到奥特曼攻击的次数(count)累计5次,就会使用绝招(XP)。

Outman(奥特曼类对象)在打败所有的小怪兽后,将挑战怪兽之王。

请在main函数中实现如下架构

int main(){

//输入测试次数

while(t--){

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

//输入怪兽个数和等级

while(????)//只要奥特曼没死也没逃跑,就继续与n个怪兽的战斗

{

     利用怪兽等级值生成怪兽对象

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

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

     {  

         //奥特曼攻击1次

         if (????)  //怪兽没死

         {   //怪兽反击1次

              if (???)       //奥特曼没死也不逃跑

                  //奥特曼回血,在方法中判断是否需要加血

              else

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

                  //输出奥特曼状态,调用display方法

                  //设置flag为false,停止战斗

              }

         }

         else //怪兽死了

         {  

              //奥特曼胜利,并输出"win"并回车

              //奥特曼升级

              //设置flag为false,停止战斗

         }

     }

}

if(????)//如果打完n个小怪兽奥特曼还没死也没逃跑,就挑战Boss

{

     //输出奥特曼当前状态

     //生成Boss对象初始化

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

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

     {  

         //奥特曼攻击1次      

         if (????)  //Boss没死

         {   //Boss反击1次

             
              if (???)       //奥特曼没死也不逃跑

                  //奥特曼回血,在方法中判断是否需要加血

                 
              else

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


                  //输出奥特曼状态,调用display方法

                                       
                  //设置flag为false,停止战斗

                 
              }

         }

        
         else //怪兽死了

         {  

              //奥特曼胜利,并输出"win Boss"并回车
                              
              //奥特曼升级

              //输出奥特曼状态,调用display方法
             
              //设置flag为false,停止战斗

         }

     }

}

}
return 0;
}

输入
第1行输入t表示有t个测试实例

对于每个测试实例,首行先输入奥特曼等级

接着下一行输入n和k,表示怪兽数量和等级

输出
输出每个测试实例的战斗结果。

对于每一个实例的输出如下:

第一行奥特曼的状态

第二行~第n+1行依次输出奥特曼打每个怪兽的结果。

如果奥特曼把n个怪兽都打败了,

 第n+2行输出此时奥特曼的状态

 第n+3行输出奥特曼打怪兽首领的结果

 第n+4行输出奥特曼打怪兽首领后的状态

如果奥特曼被某个怪兽打败,则输出战斗结果,下一行输出战斗后奥特曼的状态,不再与怪兽首领进行战斗。

样例输入
2
5
5 5
20
5 10
样例输出
奥特曼状态(rank=5 hp=50 damage=15 exp=0 money=50)
win
win
win
win
win
奥特曼状态(rank=8 hp=60 damage=24 exp=70 money=150)
lose
奥特曼状态(rank=8 hp=0 damage=24 exp=70 money=0)
奥特曼状态(rank=20 hp=200 damage=60 exp=0 money=200)
win
win
win
win
win
奥特曼状态(rank=22 hp=220 damage=66 exp=90 money=700)
win Boss
奥特曼状态(rank=26 hp=260 damage=78 exp=150 money=1701)

#include<iostream>
#include <cstring>
using namespace std;
class Ultraman {
	private:
		int rank; // 等级
		int hp;	 	//生命值
		int damage;	//攻击力
		int exp;	//经验
		int money;	//钱
	public:
		Ultraman(int);
		void display();	//展示实力
		void escape();	//逃跑
		void attacked(int);	//被攻击
		void restore();	//补血
		void win(int,int);		//胜利
		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);	//被攻击
		int get_rank();
		int get_hp();
		int get_exp();
		int get_money();
		int get_damage();
};
class Boss:public Monster {
	private:
		int count;
	public:
		Boss();
		void attacked(int);
		int get_count() {
			return count;
		}
};
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;
	cout<<"lose"<<endl;
}
void Ultraman::win(int _exp,int _money) {

	exp+=_exp;
	money+=_money;
	upgrade();
}
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::attacked(int ultraman_damage) {
	hp-=ultraman_damage;
}
Boss::Boss() {
	count=0;
	rank=10;
	hp=300;
	exp=1000;
	damage=50;
	money=1001;
}
void Boss::attacked(int ultraman_damage) {
	hp-=ultraman_damage;
	count++;
}
int main() {
	int lev,t,num,win_count;
	bool fight,flag;
	cin>>t;
	while(t--) {
		cin>>lev;
		Ultraman Tiga(lev);	//迪迦奥特曼
		Tiga.display();
		cin>>num>>lev;
		fight=true;
		win_count=0;
		while(fight) { 	//只要奥特曼没死也没逃跑,就继续与n个怪兽的战斗
			Monster  Viga(lev); //维迦怪兽
			flag=true;
			while(flag) {
				Viga.attacked(Tiga.get_damage());
				if(Viga.get_hp()>0) {
					Tiga.attacked(Viga.get_damage());
					if(Tiga.get_hp()>10) {
						if(Tiga.get_hp()<Tiga.get_rank()*5) {
							Tiga.restore();
						}
					} else if(Tiga.get_hp()>0&&Tiga.get_hp()<=10) {	//丝血就逃跑
						Tiga.escape();
						Tiga.display();
						flag=false;
						fight=false;
					} else {		//被怪兽起了,一枪秒了,就go die
						Tiga.die();
						Tiga.display();
						flag=false;
						fight=false;
					}
				} else {
					Tiga.win(Viga.get_exp(),Viga.get_money());
					cout<<"win"<<endl;
					flag=false;
					win_count++;
				}
			}
			if(Tiga.get_hp()>10&&win_count==num) { //如果打完n个小怪兽奥特曼还没死也没逃跑,就挑战Boss
				Tiga.display();
				Boss  Shao_wiga;  //最终boss,枭丶维迦
				flag=true;
				while(flag) {
					Shao_wiga.attacked(Tiga.get_damage());
					if(Shao_wiga.get_hp()>0) {
						if((Shao_wiga.get_count()%5)!=0) {	//如果被攻击次数不是5的倍数,攻击一次
							Tiga.attacked(Shao_wiga.get_damage());
						}
						if((Shao_wiga.get_count()%5)==0) {
							Tiga.attacked(Shao_wiga.get_damage()*3); //如果被攻击次数是5的倍数,发动大招"肉蛋葱鸡"
						}
						if(Tiga.get_hp()>10) {
							if(Tiga.get_hp()<Tiga.get_rank()*5) {
								Tiga.restore();
							}
						} else if(Tiga.get_hp()>0&&Tiga.get_hp()<=10) {	//丝血就逃跑
							Tiga.escape();
							Tiga.display();
							flag=false;
							fight=false;
						} else {		//被boss起了,一枪秒了,就go die
							Tiga.die();
							Tiga.display();
							flag=false;
							fight=false;
						}
					} else {
						Tiga.win(Shao_wiga.get_exp(),Shao_wiga.get_money());
						cout<<"win Boss"<<endl;
						Tiga.display();
						flag=false;
						fight=false;
					}
				}
			}
		}
	}
	return 0;
}

在这里插入图片描述

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值