题目描述
在前面实验的基础上,根据题目要求进行修改,实现打斗过程。
- 怪兽分为四种类型(定义四个类):
普通型怪兽(NMonster):攻击力是等级2倍,生命是10倍,金钱经验是10倍
攻击型怪兽(AMonster):攻击力是等级4倍,生命是5倍,金钱经验是10倍
防御型怪兽(DMonster):攻击力是等级1倍,生命是20倍,金钱经验是10倍
肉鸡型怪兽(SMonster):攻击力是等级1倍,生命是10倍,金钱经验是20倍
定义一个守护神类(Angel),该类定义怪兽或奥特曼的守护神,为怪兽或奥特曼提供帮助。守护神等级为所守护对象的等级(例如守护神a1守护等级为3的攻击型怪兽am1,则a1的等级也为3),攻击是等级的一半,无生命。怪兽的守护神金钱和经验都为等级的5倍。奥特曼的守护神金钱和经验为0,等级随守护对象升级而升级。
为四个怪兽类和奥特曼类添加守护神对象成员,使它们都成为复合类。
当奥特曼战胜怪兽后,将获得怪兽及其守护神的经验金钱。
修改奥特曼类和怪兽类相关成员函数,实现守护神类与它们的关系,具体如下:
奥特曼,守护神为它攻击攻击型怪兽时,加1点攻击力,而在它攻击防御型怪兽时,加2点攻击力,在获得肉鸡型怪兽的金钱和经验时,翻倍(获得怪兽的经验和金钱翻倍)。
普通型怪兽和肉鸡型怪兽,无守护神。
攻击型怪兽,守护神为它在攻击奥特曼时,也打一次,使奥特曼除了受到怪兽攻击,还将将受到守护神攻击力的伤害。
防御型怪兽,守护神为它受到奥特曼攻击时,将生命损失减半。
outman(奥特曼类对象)这个热血骚年总是叫嚷“一个打十个”,叫的老天爷都不耐烦了。这次outman傻眼了,是一个打4个。现在让我们来为outman欢呼吧,围观吧(记得带上板凳瓜子和鸡蛋,不好看的话就扔扔)。
请在main函数中实现如下架构
while (t--) //每个实例就是奥特曼与个怪兽的战斗{//输入奥特曼等级值,利用等级值,声明一个奥特曼对象并初始化。//输出奥特曼状态,调用display方法,每行输出一个//输入个怪兽的等级,依次为普通型怪兽、肉鸡型怪兽、防御型怪兽、攻击型怪兽,保存在数组mgrad[4]中//创建种类型怪兽对象并利用等级值mgrad初始化。//输出每个怪兽的状态,调用display方法,每行输出一个//设置战斗标志flag为true,与每个怪兽的战斗结果winflag1=0,winflag2=0,winflag3=0,winflag4=0。//启动战斗循环,具体如下:while(flag) //4个怪兽群殴奥特曼{ //奥特曼攻击每个怪兽1次if (如果怪兽i没死) //如果怪兽i没死,怪兽i攻击奥特曼,注意:只要没死的怪兽,都攻击奥特曼次。{ //怪兽i反击1次if (奥特曼不逃跑) //如果奥特曼不逃跑,用奥特曼生命来判断//奥特曼回血,在方法中判断是否需要加血else{ //奥特曼逃跑,设置逃跑标志eflag为true,并输出"lose"并回车//输出奥特曼状态,调用display方法 //设置flag为false,停止战斗}}else if(怪兽是这一轮死的)//如果怪兽这一轮死了{ //奥特曼胜利,并输出"win"并回车//奥特曼升级//输出奥特曼状态,调用display方法//设置打赢标记winflagi为true}if(所有怪兽都死了){//所有怪兽都死了,用个打赢标记判断//结束战斗,设置flag为false,并输出“win all”}}//end of while flag
输入
第1行输入t表示有t个测试实例对于每个测试实例,首行先输入奥特曼等级
接着4行依次输入普通型、肉鸡型、防御型、攻击型怪兽的等级
输出
输出奥特曼和每个怪兽的战斗结果,具体要求参考程序框架样例输入
2 5 3 3 3 3 5 10 10 10 10
样例输出
rank=5 hp=50 damage=15 exp=0 money=50
rank=3 hp=30 damage=6 exp=30 money=30
rank=3 hp=30 damage=3 exp=60 money=60
rank=3 hp=60 damage=3 exp=30 money=30
rank=3 hp=15 damage=12 exp=30 money=30
win
rank=5 hp=45 damage=15 exp=45 money=95
win
rank=6 hp=60 damage=18 exp=25 money=125
win
rank=8 hp=80 damage=24 exp=15 money=245
win
rank=8 hp=76 damage=24 exp=60 money=290
win all
rank=5 hp=50 damage=15 exp=0 money=50
rank=10 hp=100 damage=20 exp=100 money=100
rank=10 hp=100 damage=10 exp=200 money=200
rank=10 hp=200 damage=10 exp=100 money=100
rank=10 hp=50 damage=40 exp=100 money=100
lose
rank=5 hp=8 damage=15 exp=0 money=0
#include<iostream>
#include <cstring>
using namespace std;
class Angel {private:int rank; // 等级int damage; //攻击力int exp; //经验int money; //钱public:Angel(int,int,int);
};
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(); //升级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:void attacked(int); //被攻击int get_rank();int get_hp();int get_damage();int get_exp();int get_money();void display();
};
class NMonster:public Monster {public:NMonster(int);};
class AMonster:public Monster {private:Angel A_Angel;public:AMonster(int);
};
class DMonster:public Monster {private:Angel D_Angel;public:DMonster(int);
};
class SMonster:public Monster {public:SMonster(int);
};
Angel::Angel(int a,int m=0,int e=0) {rank=a;damage=a/2;exp=e;money=m;
}
NMonster::NMonster(int a) {rank=a;damage=2*a;hp=a*10;exp=a*10;money=10*a;
}
AMonster::AMonster(int a):A_Angel(a,a*5,a*5) {rank=a;damage=4*a;hp=a*5;exp=a*10;money=10*a;
}
DMonster::DMonster(int a):D_Angel(a,a*5,a*5) {rank=a;damage=1*a;hp=a*20;exp=a*10;money=10*a;
}
SMonster::SMonster(int a) {rank=a;damage=1*a;hp=a*10;exp=a*20;money=20*a;
}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) {cout<<"win"<<endl;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;
}
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;
}
void Monster::display() {cout<<"rank="<<rank;cout<<" hp="<<hp;cout<<" damage="<<damage;cout<<" exp="<<exp;cout<<" money="<<money<<endl;
}
int main() {int lev,t,mgrad[4];bool flag,winflag1,winflag2,winflag3,winflag4;int i=0,j=0,k=0,l=0; //判断怪兽是否本回合死亡cin>>t;while(t--) {cin>>lev;Ultraman Tiga(lev);Tiga.display();for(int x=0; x<4; x++) {cin>>mgrad[x];}NMonster n1(mgrad[0]);SMonster rookie(mgrad[1]);DMonster d1(mgrad[2]);AMonster a1(mgrad[3]);n1.display();rookie.display();d1.display();a1.display();flag=1;winflag1=0;winflag2=0;winflag3=0;winflag4=0;while(flag) {n1.attacked(Tiga.get_damage());rookie.attacked(Tiga.get_damage());d1.attacked((Tiga.get_damage()+2)/2); //守护神为它攻击攻击型怪兽时,加1点攻击力a1.attacked(Tiga.get_damage()+1); //攻击防御型怪兽时,加2点攻击力,但防御型怪兽,守护神为它受到奥特曼攻击时,将生命损失减半。if(n1.get_hp()>0) { //与普通怪兽的战斗 Tiga.attacked(n1.get_damage());if(Tiga.get_hp()>10) {if(Tiga.get_hp()<Tiga.get_rank()*5) {Tiga.restore();}} else {Tiga.escape();Tiga.display();flag=false;}} else if(i==0) {Tiga.win(n1.get_exp(),n1.get_money()); Tiga.display();i=1; //让下一次循环不会重复获得这只怪兽的经验和金币winflag1=1;}if(rookie.get_hp()>0) { //与肉鸡怪兽战斗 Tiga.attacked(rookie.get_damage());if(Tiga.get_hp()>10) {if(Tiga.get_hp()<Tiga.get_rank()*5) {Tiga.restore();}} else {Tiga.escape();Tiga.display();flag=false;}} else if(j==0) {Tiga.win(rookie.get_exp()*2,rookie.get_money()*2); //双倍金币经验 Tiga.display();j=1; //让下一次循环不会重复获得这只怪兽的经验和金币winflag2=1;}if(d1.get_hp()>0) { //与防御怪兽战斗 Tiga.attacked(d1.get_damage());if(Tiga.get_hp()>10) {if(Tiga.get_hp()<Tiga.get_rank()*5) {Tiga.restore();}} else {Tiga.escape();Tiga.display();flag=false;}} else if(k==0) {Tiga.win(d1.get_exp()+d1.get_rank()*5,d1.get_money()+d1.get_rank()*5);//奥特曼还会获得怪兽守护神的exp和money Tiga.display();k=1; //让下一次循环不会重复获得这只怪兽的经验和金币winflag3=1;}if(a1.get_hp()>0) { //与攻击怪兽战斗 Tiga.attacked((a1.get_damage()+a1.get_rank()/2)); // 奥特曼除了受到怪兽攻击,还将将受到攻击性怪兽的守护神攻击力的伤害。if(Tiga.get_hp()>10) {if(Tiga.get_hp()<Tiga.get_rank()*5) {Tiga.restore();}} else {Tiga.escape();Tiga.display();flag=false;}} else if(l==0) {Tiga.win(a1.get_exp()+a1.get_rank()*5,a1.get_money()+a1.get_rank()*5); //奥特曼还会获得怪兽守护神的exp和money Tiga.display();l=1; //让下一次循环不会重复获得这只怪兽的经验和金币winflag4=1;}if(winflag1&&winflag2&&winflag3&&winflag4) {flag=false;cout<<"win all"<<endl;}}}
}
夹带私活
shout out to Rookie
把般配打在公屏上