修仙游戏(重载运算符练习)


某仙侠游戏中,有以下需求:


这个游戏世界中,有妖兽,灵石,修仙者

妖兽有自己的种类。
妖兽分为不同的等级:
1级妖兽:价值 100:初阶灵石
2级妖兽:价值 200初阶灵石
3级妖兽:价值 500初阶灵石
4级妖兽:价值 1000初阶灵石
5级妖兽:价值 2000初阶灵石
6级妖兽:价值 5000初阶灵石
7级妖兽:价值 10000初阶灵石
8级妖兽:价值 20000初阶灵石
9级妖兽:价值 100000初阶灵石

灵石:是一种类似黄金的硬货币。
灵石有级别:
初阶灵石:
1中阶灵石: 10初阶灵石
1高阶灵石: 10中阶灵石

修仙者
姓名
门派:(黄枫谷,鬼灵门,落云宗,掩月宗,古剑门,御灵宗, 散修)
级别(练气期, 筑基期, 结丹期,元婴期, 化神期,炼虚期,合体期,大成期,渡劫期)
资产(不定数量的妖兽,不定数量的灵石)
状态:生,死

1.修仙者之间常常进行贸易活动,用灵石购买妖兽,或者用妖兽换取灵石。
2.修仙者可以通过采矿来获取灵石,每次只能获取100个初阶灵石。
3.修仙者可以捕获妖兽,能否捕获妖兽,取决于自己的战斗力是否大于妖兽
4.修仙者之间可以进行切磋,实力更强大的胜利。
5.修仙者之间还可能进行争斗,实力更强大的生,另一方亡,生者夺取亡者的所有资产。
6.修仙者闭关进阶,自己的级别加1


项目实现:


首先定义灵石类:作为一个基本类,根据需求有高级,中级,初级,因此
定义了一个c++类型的枚举.
头文件:`:

#pragma once
#include<string>
#include<iostream>
using namespace std;
enum class SpriteStoneLevel { //统计灵石的数量
	PRIMARY_LEVEL,
	MIDDLE_LEVEL,
	ADVANCED_LEVEL,
	SPRITESTONE_LEVEL_COUNT
};
class SpriteStone
{
public:
	SpriteStone(int count = 0, 
		SpriteStoneLevel level = SpriteStoneLevel::PRIMARY_LEVEL);
	string str()const ;
	friend ostream& operator<<(ostream& os, const  SpriteStone &stone);
	SpriteStone operator+(const SpriteStone& stone);
	int getcount()const;
	bool operator>=(const SpriteStone& stone);
	SpriteStone operator-(const SpriteStone& stone);
	bool operator==(const SpriteStone& stone);
private:
	int count;//灵石的块数
	SpriteStoneLevel level;
};
ostream& operator<<(ostream&os,const  SpriteStone &stone);

源文件:

#include "SpriteStone.h"
#include<iostream>
#include<sstream>
SpriteStone::SpriteStone(int count, SpriteStoneLevel level)
{
	this->count = count;
	this->level = level;
}
string SpriteStone::str()const
{
	stringstream ret;
	ret<<count<<"块";
	switch (level)
	{
	case SpriteStoneLevel::PRIMARY_LEVEL:
		ret << "初级灵石" << endl;
		break;
	case SpriteStoneLevel::MIDDLE_LEVEL:
		ret << "中级灵石" << endl;
		break;
	case SpriteStoneLevel::ADVANCED_LEVEL:
		ret << "高级灵石" << endl;
		break;
	default:
		ret << "未知灵石" << endl;
		break;
	}
	return ret.str();
}
SpriteStone SpriteStone::operator+(const SpriteStone& stone)
{
	int sum = 0;
	if (stone.level == SpriteStoneLevel::PRIMARY_LEVEL) {
		sum += stone.count;
	}
	else if (stone.level == SpriteStoneLevel::MIDDLE_LEVEL) {
		sum += stone.count * 10;
	}
	else if (stone.level == SpriteStoneLevel::ADVANCED_LEVEL) {
		sum += stone.count * 100;
	}
	if (this->level == SpriteStoneLevel::PRIMARY_LEVEL) {
		sum += this->count;
	}
	else if (this->level == SpriteStoneLevel::MIDDLE_LEVEL) {
		sum += this->count * 10;
	}
	else if (this->level == SpriteStoneLevel::ADVANCED_LEVEL) {
		sum += this->count * 100;
	}
	return SpriteStone(sum, SpriteStoneLevel::PRIMARY_LEVEL);
}
int SpriteStone::getcount() const
{
	return count;
}
bool SpriteStone::operator>=(const SpriteStone& stone)
{
	int sum1 = 0;
	if (this->level == SpriteStoneLevel::PRIMARY_LEVEL) {
		sum1 += this->count;
	}
	else if (this->level == SpriteStoneLevel::MIDDLE_LEVEL) {
		sum1 += this->count * 10;
	}
	else if (this->level == SpriteStoneLevel::ADVANCED_LEVEL) {
		sum1 += this->count * 100;
	}
	int sum2 = 0;
	if (stone.level == SpriteStoneLevel::PRIMARY_LEVEL) {
		sum2 += stone.count;
	}
	else if (stone.level == SpriteStoneLevel::MIDDLE_LEVEL) {
		sum2 += stone.count * 10;
	}
	else if (stone.level == SpriteStoneLevel::ADVANCED_LEVEL) {
		sum2 += stone.count * 100;
	}
	return sum1>=sum2;
}
SpriteStone SpriteStone::operator-(const SpriteStone& stone)
{
	int sum1 = 0;
	if (this->level == SpriteStoneLevel::PRIMARY_LEVEL) {
		sum1 += this->count;
	}
	else if (this->level == SpriteStoneLevel::MIDDLE_LEVEL) {
		sum1 += this->count * 10;
	}
	else if (this->level == SpriteStoneLevel::ADVANCED_LEVEL) {
		sum1 += this->count * 100;
	}
	int sum2 = 0;
	if (stone.level == SpriteStoneLevel::PRIMARY_LEVEL) {
		sum2 += stone.count;
	}
	else if (stone.level == SpriteStoneLevel::MIDDLE_LEVEL) {
		sum2 += stone.count * 10;
	}
	else if (stone.level == SpriteStoneLevel::ADVANCED_LEVEL) {
		sum2 += stone.count * 100;
	}
	return SpriteStone(sum1-sum2,SpriteStoneLevel::PRIMARY_LEVEL);
}
bool SpriteStone::operator==(const SpriteStone& stone)
{
	if (this->count == stone.count && this->level == stone.level) {
		return true;
	}
	else {
		return false;
	}
}
ostream& operator<<(ostream& os, const SpriteStone &stone)
{
	os << stone.str();
	return os;
}

再定义灵兽:灵兽有等级和名称
头文件:

#pragma once
#include<string>
#include<iostream>
using namespace std;
class SpriteStone;
class Monster
{
public:
	Monster(int level = 0,const string &category ="未知魂兽");
	SpriteStone getvalue()const ;
	friend ostream& operator<<(ostream& os, const  Monster& monster);
	friend bool operator==(const Monster& monster, const Monster& other);
	int getpower()const;
private:
	int level;
	string category;
};
ostream& operator<<(ostream& os,const Monster& monster);
bool operator==(const Monster &monster,const Monster &other);

源文件:

#include "Monster.h"
#include"SpriteStone.h"
#define MONSTER_FACTOR 1000
Monster::Monster(int level, const string &category) {
	this->level = level;
	this->category = category;
}
SpriteStone Monster::getvalue()const
{
	int stonecount[] = { 100,200,500,1000,2000,5000,10000,20000,100000 };
	int count = stonecount[level-1];
	return SpriteStone(count, SpriteStoneLevel::PRIMARY_LEVEL);
}
int Monster::getpower()const
{
	int ret = 0;
	ret = level * MONSTER_FACTOR ;
	return ret;
}
ostream& operator<<(ostream& os,const  Monster& monster)
{
	os << monster.level << "级,"
	<< monster.category << "魂兽" << endl;
	return os;
}
bool operator==(const Monster& monster, const Monster& other)
{
	if (monster.category == other.category &&
		monster.level == other.level) {
		return  true;
	}
	return false;
}

接下里是最重要的人物了:
人物主要有一些属性和活动:

#pragma once
#include<string>
#include<vector>
#include<iostream>
class Monster;
class SpriteStone;
using namespace std;
enum class Immortallevel {
	LIAN_QI,
	ZHU_JI,
	JIE_DAN,
	YUAN_YING,
	HUA_SHENG,
	LIAN_XU,
	HE_TI,
	DA_CHENG,
	DU_JIE
};
class Immortal
{
public:
	Immortal(const char*name,const char*menpai, 
		Immortallevel level);
	//挖矿
	void mining();
	//到市场售卖所有灵兽
	bool trade();
	//到市场售卖指定灵兽
	bool trade(const Monster &monster);
	//用自己的灵石,购买其他修仙者的灵兽
	bool trade(Immortal &other , const Monster& monster);
	//用自己指定的灵兽和其他修仙者的指定的灵兽交换
	bool trade( Immortal& other, const Monster& monsterSource,
		const Monster& monsterDest);
	//把自己的灵兽卖给其他修仙者
	bool trade(const Monster&monster,  Immortal& other);
	//捕获妖兽
	bool fight(const Monster& monster);
	//两个角色进行比武
	bool Contest(const Immortal &other);
	//两个角色用生命对决 
	bool risk( Immortal& other);
	//获取战斗力
	int getpower()const; 
	bool biguan() ;
	friend ostream& operator<<(ostream& os, const Immortal& immortal);
	friend ostream& operator<<(ostream& os, const Immortallevel& level);
private:
	string name;			//修仙者姓名
	string menpai;			//修仙者门派
	Immortallevel level;    //等级
	vector<SpriteStone> stones;//灵石资产
	vector<Monster>monsters;    //灵兽资产 
	bool alive;           //是否还活着
	bool Hadmonstr(const Monster &monster);  
	bool removemonster(const Monster &monster);
	void dead();
};
ostream& operator<<(ostream& os, const Immortal& immortal);
ostream& operator<<(ostream& os, const Immortallevel& level);

源文件:

#include "Immortal.h"
#include"Monster.h"
#include"SpriteStone.h"
#define IMMORTAL_GRADE_FACTOR 1000
#define SPRITESTONE_FACTOR 0.1
#define MONSTER_FACTOR1 0.5
using namespace std;
Immortal::Immortal(const char* name, const char* menpai, Immortallevel level)
{
	this->name = name;
	this->menpai = menpai;
	this->level = level;
	alive = true;
}
void Immortal::mining()
{
	stones.push_back(SpriteStone(100, 
		SpriteStoneLevel::PRIMARY_LEVEL));
}
bool Immortal::trade()
{
	if (!alive) {
		return  false;
	}
	SpriteStone stone;
	for (int i = 0;i < monsters.size();i++) {
		stone = stone + monsters[i].getvalue();
	}
	stones.push_back(stone);
	monsters.erase(monsters.begin(),monsters.end());
	return true;
}
bool Immortal::trade(const Monster& monster)
{
	if (alive == false) {
		return false;
	}
	if (!Hadmonstr(monster)) {
		cout << "没有找到该魂兽!" << endl;
		return false;
	}
	SpriteStone stone;
	stone = monster.getvalue();
	stones.push_back(stone);
	if (removemonster(monster)) {
		cout << "销售成功" << endl;
	}
	return true;
}
bool Immortal::trade(Immortal& other, const Monster& monster)
{//用自己的灵石,购买其他修仙者的灵兽
	if (alive == false) {
		return false;
	}
	if (!other.Hadmonstr(monster)) {
		cout << "没有这个灵兽" << endl;
		return  false;
	}
	SpriteStone stone;
	for (int i = 0;i < stones.size();i++) {
		stone = stone + stones[i];
	}
	if (stone >= monster.getvalue()) {
		stone = stone - monster.getvalue();
		stones.clear();
		stones.push_back(stone);
		other.stones.push_back(monster.getvalue());
		monsters.push_back(monster);
		other.removemonster(monster);
		return true;
	}else{
		return false;
	}
	
}
bool Immortal::trade(Immortal& other, const Monster& monsterSource, const Monster& monsterDest)
{
	//用自己指定的灵兽和其他修仙者的指定的灵兽交换
	if (other.alive == false || other.alive == false) {
		return false;
	}
	if (!Hadmonstr(monsterSource)) {
		return false;
		cout << "无";
	}
	if (!other.Hadmonstr(monsterDest)) {
		return false;
		cout << "无";
	}
	if (monsterSource.getvalue() == monsterDest.getvalue()) {
		cout << "交易成功" << endl;
		monsters.push_back(monsterDest);
		other.removemonster(monsterDest);
		other.monsters.push_back(monsterSource);
		removemonster(monsterSource);
		return true;
	}
	cout << "交易失败" << endl;
	return false;
}
bool Immortal::trade(const Monster& monster, Immortal& other)
{//把自己的灵兽卖给其他修仙者
	if (!Hadmonstr(monster)) {
		return false;
	}
	SpriteStone stone;
	for (int i = 0;i < other.stones.size();i++) {
		stone = stone + other.stones[i];
	}
	if (stone >= monster.getvalue()) {
		stone = stone - monster.getvalue();
		other.stones.clear();
		other.stones.push_back(stone);
		stones.push_back(monster.getvalue());
		other.monsters.push_back(monster);
		removemonster(monster);
		return true;
	}
	return false;
}
bool Immortal::fight(const Monster& monster)
{
	if (getpower() > monster.getpower()) {
		cout << "捕获成功" << endl;
		monsters.push_back(monster);
	}
	else {
		
	}
	return false;
}
bool Immortal::Contest(const Immortal& other)
{
	if (getpower() > other.getpower()) {
		cout << "比试成功" << endl;
		return true;
	}else if(getpower() == other.getpower()){
		cout << "比试战平" << endl;
		return true;
	}
	else {
		cout << "比试失败" << endl;
		return false;
	}

}
bool Immortal::risk(Immortal& other)
{
	if (getpower() > other.getpower()) {
		cout << "比试成功" << endl;
		for (int i = 0;i < other.stones.size();i++) {
			stones.push_back(other.stones[i]);
		}
		for (int i = 0;i < other.monsters.size();i++) {
			monsters.push_back(other.monsters[i]);
		}
		other.dead();
		return true;
	}
	else if (getpower() == other.getpower()) {
		cout << "比试战平" << endl;
		return true;
	}
	else {
		cout << "比试失败" << endl;
		for (int i = 0;i <stones.size();i++) {
			other.stones.push_back(stones[i]);
		}
		for (int i = 0;i <monsters.size();i++) {
			other.monsters.push_back(monsters[i]);
		}
		dead();
		return false;
	}
}
int Immortal::getpower() const
{
	int ret = 0;
	//根据人物的等级来判断战斗力
	ret = ((int)level + 1) * IMMORTAL_GRADE_FACTOR;
	//根据人物的灵石来增加战斗力
	SpriteStone stone;
	for (int i = 0;i < stones.size();i++) {
		stone = stone + stones[i];
	}
	ret += stone.getcount() * SPRITESTONE_FACTOR;
	//根据灵兽来增加战斗力
	for (int i = 0;i < monsters.size();i++) {
		ret += monsters[i].getpower() * MONSTER_FACTOR1;;
	}
	return ret;
}
bool Immortal::biguan() 
{
	level = (Immortallevel)((int)level + 1);
	return true;
}
bool Immortal::Hadmonstr(const Monster& monster)
{
	for (int i = 0;i < monsters.size();i++) {
		if (monster == monsters[i]) {
			return true;
		}
	}
	return false;
}
bool Immortal::removemonster(const Monster& monster)
{
	vector<Monster>::iterator it = monsters.begin();
	while (it != monsters.end()) {
		if (monster == *it) {
			it = monsters.erase(it);
			return true;
		}
		else {
			it++;
		}
	}
	return false;
}
void Immortal::dead()
{
	alive = false;
	monsters.erase(monsters.begin(),monsters.end());
	stones.erase(stones.begin(),stones.end());
}
ostream& operator<<(ostream& os, const Immortal& immortal) {//你这里的immortal 加了const 限定,后面也必须有const 限定
	os << "修仙者:" << immortal.name
		<<"状态:"<<(immortal.alive?"在修":"已亡")
		<< "\t门派:" << immortal.menpai
		<< "\t等级:" << immortal.level;
	SpriteStone stone;
	for (int i = 0;i<immortal.stones.size();i++) {
		stone = stone + immortal.stones[i];
	}
	os <<"\t灵石折合为:"<< stone;
	os << "拥有的灵兽:";
	if (immortal.monsters.size() == 0) {
		os << "无" << endl;
	}
	else {
		for (int i = 0;i < immortal.monsters.size();i++) {
			os << immortal.monsters[i];//这个monsters[i] 就是const 的常量
		}
	}
	return os;
}
ostream& operator<<(ostream& os, const Immortallevel& level)
{
	switch (level) {
	case Immortallevel::LIAN_QI:
		os << "练气期";
		break;
	case Immortallevel::ZHU_JI:
		os << "筑基期";
		break;
	case Immortallevel::JIE_DAN:
		os << "结丹期";
		break;
	case Immortallevel::YUAN_YING:
		os << "元婴期";
		break;
	case Immortallevel::HUA_SHENG:
		os << "化神期";
		break;
	case Immortallevel::LIAN_XU:
		os << "炼虚期";
		break;
	case Immortallevel::HE_TI:
		os << "合体期";
		break;
	case Immortallevel::DA_CHENG:
		os << "大成期";
		break;
	case Immortallevel::DU_JIE:
		os << "渡劫期";
		break;
	}
	return os;
}

最后可以开始测试了:

#include<iostream>
#include"SpriteStone.h"
#include"Monster.h"
#include"Immortal.h"
#include<Windows.h>
using namespace std;
void testImmortal() {
	Immortal immortal("唐三","唐门", Immortallevel::HE_TI);
	cout << immortal;
	for (int i = 0;i < 50;i++) {
		immortal.mining();
	}
	cout << immortal;

	Monster monster1(1,"擎天巨蟒");
	immortal.fight(monster1);
	cout << "捕获后的情况:" << endl;
	cout << immortal;

	Monster monster2(1,"泰坦巨猿");
	cout<<monster2;
	immortal.fight(monster2);
	Monster monster3(1,"柔骨兔");
	immortal.fight(monster3);
	cout << "捕获后的情况:" << endl;
	cout << immortal;

	//交易特定的
	immortal.trade(monster1);
	cout << "交易后的情况:" << endl;
	cout << immortal;
	//全部交易
	immortal.trade();
	cout << "清仓大甩卖" << endl;
	cout << immortal;
}
void testtrade() {
	Immortal tangsan("唐三", "唐门", Immortallevel::HE_TI);
	for (int i = 0;i < 50;i++) {
		tangsan.mining();
	}
	Monster monster1(1,"蓝银妖兽");
	tangsan.fight(monster1);
	cout << tangsan;
	Immortal huoyuhao("霍雨浩", "昊天宗", Immortallevel::DA_CHENG);
	for (int i = 0;i < 50;i++) {
		huoyuhao.mining();
	}
	Monster monster2(1,"天梦冰蚕");
	huoyuhao.fight(monster2);
	cout << huoyuhao;
	cout << "-----------------------------------------------" << endl;;
	tangsan.trade( monster1,huoyuhao);
	cout << tangsan;
	cout << huoyuhao;
}
void testContest() {
	Immortal tangsan("唐三", "唐门", Immortallevel::HE_TI);
	for (int i = 0;i < 50;i++) {
		tangsan.mining();
	}
	cout << tangsan;
	Immortal huoyuhao("霍雨浩", "昊天宗", Immortallevel::DA_CHENG);
	for (int i = 0;i < 50;i++) {
		huoyuhao.mining();
	}
	cout << huoyuhao;
	huoyuhao.risk(tangsan);
	cout << tangsan;
	cout << huoyuhao;
}
void testup() {
	Immortal tangsan("唐三", "唐门", Immortallevel::HE_TI);
	cout << tangsan;
	tangsan.biguan();
	cout << tangsan;
}
void tsetmining() {//挖矿
	Immortal ts("唐三", "唐门", Immortallevel::HE_TI);
	cout << ts;
	ts.mining();
	cout << ts;
}
int main() {
	cout << "------------测试挖矿--------------------" << endl;
	cout << "------------------------------------" << endl;
	tsetmining();
	cout << "------------测试交易--------------------" << endl;
	cout << "------------------------------------" << endl;
	testtrade();
	cout << "------------测试斗争--------------------" << endl;
	cout << "------------------------------------" << endl;
	testContest();
	system("pause");
	return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值