我们设想一个简单的场景:
基本实现(使用Class将怪物、英雄进行封装)
有一个英雄,和一个怪物: 1. 我们可以在终端初始化英雄的血量、蓝量,和攻击力,以及怪物的血量和攻击力。 2. 英雄有4个技能,每个技能都有一定的伤害(或者能够加血),但是需要消耗一定的蓝量(可 以在代码中写死)。(可以考虑冷却时间,比如说,第一个技能3个回合才能放一次)。 3. 游戏是回合制游戏,英雄可以放技能以及普通攻击,怪物只能普通攻击。 首先是英雄攻击,然 后是怪物攻击。然后再是英雄攻击,接着是怪物攻击。依次循 环。 英雄可以通过键盘的输入 来选择技能还是普通攻击,但是如果英雄蓝量不够的话,就 没法放技能,因此攻击失败,此回 合不会造成任何伤害。 每个回合结束后英雄会回复一定的蓝量。(随着回合的增加,英雄的蓝 量回复能力增 强) 4. 输出最终获胜的结果。 5. 可以通过输入q,结束游戏。 在回合中,可以输入某个命令来查看双方的信息(英雄的血量、 蓝量,攻击力、回复能力以及怪物 的血量,攻击力)
#include <iostream>
using namespace std;
class NPC{
public:
NPC();
NPC(int Health, int Attack);
~NPC();
int Health, Attack;
private:
};
NPC::NPC() {
}
NPC::NPC(int Health, int Attack) {
this->Health = Health;
this->Attack = Attack;
}
NPC::~NPC(){
}
class Hero : public NPC{
public:
Hero(int Health, int Blue, int Attack);
~Hero();
int Blue;
void Normal_Attackl(NPC &n); //普通攻击
void Attack_Skill(NPC &n); //攻击技能
void Restoration_Skill(NPC &n);//回复技能
private:
};
Hero::Hero(int Health, int Blue, int Attack){
this->Health = Health;
this->Attack = Attack;
this->Blue = Blue;
}
Hero::~Hero(){
}
void Hero::Normal_Attackl(NPC &n) {
cout << "hero使用了普通公鸡,对monster造成了20点伤害!" << endl;
n.Health -= this->Attack;
}
void Hero::Attack_Skill(NPC &n) {
if (this->Blue - 20 < 0) {
cout << "hero蓝量不足,释放火球失败,未对monster造成伤害!" << endl;
}
else {
this->Blue -= 20;
cout << "hero释放了豪火球之术,对monster造成了30点伤害!" << endl;
n.Health -= 30;
}
}
void Hero::Restoration_Skill(NPC &n) {
if (this->Blue - 10 < 0) {
cout << "hero蓝量不足,释放回复技能失败,未回复生命值!" << endl;
}
else {
this->Blue -= 10;
cout << "hero释放了圣光沐浴,回复生命值50!" << endl;
this->Health += 50;
}
}
int main() {
int i = 1; //记录回合数
int attack; //匹配攻击方式
Hero hero(100,50,10); //NPC属性初始化
NPC monster(100, 20);
cout << "战斗开始"<<endl;
while (1) {
cout << "<*******************************第" << i << "回合*******************************>" << endl;
cout << "请选择指令:" << endl;
cout << "1:普通公鸡 2:豪火球之术(攻击技能) 3:圣光沐浴(回复技能) 4: 撤退" << endl;
cin >> attack;
while(attack != 1 & attack != 2 & attack != 3 & attack != 4) {
cout << "输入指令无效,请重新输入!" << endl;
cin >> attack;
}
if (attack == 1) {
hero.Normal_Attackl(monster);
}
if (attack == 2) {
hero.Attack_Skill(monster);
}
if (attack == 3) {
hero.Restoration_Skill(monster);
}
if (attack == 4) {
break;
}
if (monster.Health <= 0) { //判断怪兽死否死亡,若死亡退出循环
break;
}
cout << "monster使用了普通公鸡,对hero造成了20点伤害!" << endl;
hero.Health -= monster.Attack;
if (hero.Health <= 0) { //判断英雄死否死亡,若死亡退出循环
break;
}
cout << "第" << i << "回合结束" ;
i++;
hero.Blue += 50 / (10 - i); //蓝量回复力随着回合的增加而增强
cout << " hero当前血量:" << hero.Health << " 蓝量:" << hero.Blue;
cout << " monster当前血量:" << monster.Health << endl;
cout << endl;
}
if (attack == 4) {
cout << "撤退成功,战斗结束!" << endl;
}
else if (hero.Health > monster.Health) {
cout << "monster死亡,对战结束,hero胜利!" << endl;
}
else {
cout << "hero死亡,对战结束,monster胜利!" << endl;
}
return 0;
}
提高 C++是一门面向对象(OOP)的语言,在上面的任务中,只是使用Class将功能和属性进行了分装, 并不能称之为OOP(应该是称之为ADT)。OOP有三个特性:
- 封装:在上面的过程中已经尝试封装
- 继承:??
- 多态:??
想一想如何将继承和多态加入到上面的代码中。
Tips: 英雄和怪物都有血量和攻击力,是不是可以理解为他们可以拥有同一个父类。 如果他们属于同一个父类,那么多态怎么应用呢??