C++ 奥特曼打怪兽之运算符重载(系列6)
题目描述
在奥特曼打怪兽的过程中,会有各种魔法袋,奥特曼可以捡起这些魔法袋,对自己施加不同的魔法。魔法袋的种类和功能描述如下:
1. “好事成双”魔法袋(重载+
+):使自己的等级翻倍,生命值恢复满血,为翻倍后等级的10倍,攻击力提升为翻倍后等级的3倍,经验和钱财翻倍。2. “祸不单行”魔法袋(重载– –):使自己的生命值、攻击力、经验和钱财缩减为原来的一半。
3. “吸星大法”魔法袋(重载 <):所当前所打怪兽等级小于奥特曼,则奥特曼的生命值、攻击力、经验和钱财将增加怪兽相应属性的一半。
4. “有缘相会”魔法袋(重载 ==):所当前所打怪兽等级等于奥特曼,则奥特曼的生命值、攻击力、经验和钱财将增加怪兽相应属性的取值。
以成员函数方式为奥特曼重载以上方法。
另外以友元方式为奥特曼重载运算符<<,使它能够支持与普通类型数据一样的输出方式。
重新组织和修改前面实验的代码,利用运算符重载实现以下内容,使得下面的main函数能正确执行并输出相关信息。
int main(){int ograd; cin>>ograd;//输入奥特曼的等级值,利用等级值,声明一个奥特曼对象。Ultraman uobj(ograd);cout<>t;//输入测试次数while(t--){ char c=0;while(1){cin>>c;//输入要使用的魔法袋,G代表好事成双,B代表祸不单行,X代表吸星大法,Y代表有缘相会if(c=='G') {cout<<"****好事成双****"< >r;//输入怪兽的等级值,利用等级值,声明一个怪兽对象并显示对象初始状态。Monster mobj(r); mobj.display();cout<<"****吸星大法****"< >r;//输入怪兽的等级值,利用等级值,声明一个怪兽对象并显示对象初始状态。Monster mobj(r); mobj.display();cout<<"****有缘相会****"< 输入
第1行输入奥特曼等级第2行输入测试次数
对于每次测试,输入魔法袋类别(G代表好事成双,B代表祸不单行,X代表吸星大法,Y代表有缘相会)
如果是后两种魔法袋,接着下一行输入怪兽等级
输出 参考Sample Output
样例输入
10 4 G B X 5 Y 20
样例输出
奥特曼状态(rank=10 hp=100 damage=30 exp=0 money=100)
好事成双
成功翻倍
奥特曼状态(rank=20 hp=200 damage=60 exp=0 money=200)
祸不单行
不幸减半
奥特曼状态(rank=20 hp=100 damage=30 exp=0 money=100)
怪兽状态(rank=5 hp=100 damage=10 exp=50 money=50)
吸星大法
大功告成 奥特曼状态(rank=20 hp=150 damage=35 exp=25 money=125)
怪兽状态(rank=20 hp=400 damage=40 exp=200 money=200)
有缘相会
有缘有分
奥特曼状态(rank=20 hp=550 damage=75 exp=225 money=325)
#include
#include
using namespace std;
class Monster;
class Ultraman {private:int rank; // 等级int hp; //生命值int damage; //攻击力int exp; //经验int money; //钱public:Ultraman(int);Ultraman& operator++(void);Ultraman& operator--(void);bool operator<(Monster&);bool operator==(Monster&);friend ostream & operator<<( ostream & os,const Ultraman & Tiga);
};
class Monster {protected:int rank; // 等级int hp; //生命值int damage; //攻击力int exp; //经验int money; //钱public:Monster(int);int get_rank();int get_hp();int get_exp();int get_money();int get_damage();void display();};
Ultraman::Ultraman(int a) {rank=a;hp=10*a;exp=0;damage=3*a;money=10*a;
}
Ultraman &Ultraman::operator++(void){rank=rank*2;hp=10*rank;damage=3*rank;exp=exp*2;money=money*2;return *this;
}
Ultraman &Ultraman::operator--(void){hp=hp/2;damage=damage/2;exp=exp/2;money=money/2;return *this;
}
bool Ultraman::operator<(Monster& Viga){if(Viga.get_rank()<rank){hp+=(Viga.get_hp()/2);damage+=(Viga.get_damage()/2);exp+=(Viga.get_exp()/2);money+=(Viga.get_money()/2);return 1;}elsereturn 0;
}
bool Ultraman::operator==(Monster& Viga){if(Viga.get_rank()==rank){hp+=Viga.get_hp();damage+=Viga.get_damage();exp+=Viga.get_exp();money+=Viga.get_money();return 1;}elsereturn 0;
}
ostream &operator<<(ostream & os,const Ultraman &Tiga) {os<<"奥特曼状态(rank="<<Tiga.rank;os<<" hp="<<Tiga.hp;os<<" damage="<<Tiga.damage;os<<" exp="<<Tiga.exp;os<<" money="<<Tiga.money<<")"<<endl;return os;
}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::display(){cout<<"怪兽状态(rank="<<rank;cout<<" hp="<<hp;cout<<" damage="<<damage;cout<<" exp="<<exp;cout<<" money="<<money<<")"<<endl;
}
int main() {int ograd;cin>>ograd;//输入奥特曼的等级值,利用等级值,声明一个奥特曼对象。Ultraman uobj(ograd);cout<<uobj; //显示奥特曼对象初始状态int t;cin>>t;//输入测试次数while(t--) {char c=0;while(1) {cin>>c;//输入要使用的魔法袋,G代表好事成双,B代表祸不单行,X代表吸星大法,Y代表有缘相会if(c=='G') {cout<<"****好事成双****"<<endl;++uobj;cout<<"****成功翻倍****"<<endl;break;}else if(c=='B') {cout<<"****祸不单行****"<<endl;--uobj;cout<<"****不幸减半****"<<endl;break;}else if(c=='X') {int r;cin>>r;//输入怪兽的等级值,利用等级值,声明一个怪兽对象并显示对象初始状态。Monster mobj(r);mobj.display();cout<<"****吸星大法****"<<endl;if(uobj<mobj) cout<<"****大功告成****"<<endl;else cout<<"****尚未成功****"<<endl;break;}else if(c=='Y') {int r;cin>>r;//输入怪兽的等级值,利用等级值,声明一个怪兽对象并显示对象初始状态。Monster mobj(r);mobj.display();cout<<"****有缘相会****"<<endl;if(uobj==mobj)cout<<"****有缘有分****"<<endl;else cout<<"****无缘无分****"<<endl;break;}else cout<<"请重新输入魔法袋类型"<<endl;}cout<<uobj;}return 0;
}
运算符重载函数作为类的成员函数
成员运算符重载函数在类中的声明格式为:
class X
{ ……
<返回数据类型> operator <运算符> (<参数表>);
……
};
成员运算符重载函数在类外定义的格式为:
<返回数据类型> X:: operator <运算符> (<参数表>)
{
<函数体>
}

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
