题目描述
重新组织和修改前面“类的实现”的代码,利用继承实现以下内容。奥特曼在与多个小怪兽过招的过程中,不断提升自己的等级。在一切就绪的时候,就可以挑战小怪兽的头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;
}