C++小游戏练习

我们设想一个简单的场景:

基本实现(使用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: 英雄和怪物都有血量和攻击力,是不是可以理解为他们可以拥有同一个父类。 如果他们属于同一个父类,那么多态怎么应用呢??

猜你喜欢

转载自blog.csdn.net/weixin_44406127/article/details/131585212