凡人修仙传(利用重载)

Immortal.h

#pragma once
#include <string>
#include <vector>
#include "SpriteStone.h"
#include "Monster.h"
#include <iostream>

using namespace std;

typedef enum
{
	LIAN_QI,
	ZHU_JI,
	JIE_DAN,
	YUAN_YING,
	HUA_SHEN,
	LIAN_XU,
	HE_TI,
	DA_CHENG,
	DU_JIE

}ImmortalLevel;

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(const Monster& monsterSource, Immortal& other,
		const Monster& monsterDest);

	//把自己的妖兽,售卖给其他的修仙者,以换取灵石
	bool trade(const Monster& monster, Immortal& other);
	
	//获取攻击力
	int getPower() const;

	//修仙者死亡后的处理
	void dead();

	//捕获妖兽
	void fight(const Monster& monster);

	friend ostream& operator<<(ostream& os, const Immortal& immortal);

	friend ostream& operator<<(ostream& os,  ImmortalLevel level);

private:
	string name;
	string menPai;
	vector<SpriteStone> stones;	//拥有灵石数量
	vector<Monster> monsters;	//拥有妖兽数量
	bool alive = true;
	ImmortalLevel level;

	//内部判断是否自己有指定的妖兽
	bool hadMonster(const Monster& monster);

	//移除指定的妖兽
	bool removeMonster(const Monster& monster);
	
};

ostream& operator<<(ostream & os,  ImmortalLevel level);

ostream& operator<<(ostream& os, const Immortal& immortal);

Immortal.cpp

#include "Immortal.h"
#include "SpriteStone.h"
#include "Monster.h"

#define IMMORTAL_LEVEL_FACTOR	1000
#define SPRITE_FACTOR			0.1
#define MONSTER_FACTOR			0.1

Immortal::Immortal(const char* name, const char* menPai,
	ImmortalLevel level)
{
	this->name = name;
	this->menPai = menPai;
	this->level = level;
}

void Immortal::mining()
{
	stones.push_back(SpriteStone(100, SpriteStoneLevel::PRIMARY_LEVEL));
}

bool Immortal::trade()
{
	if (alive == false)
	{
		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 false;
}

bool Immortal::trade(const Monster& monster)
{
	if (!alive)
	{
		return false;
	}

	if (!hadMonster(monster))
	{
		return false;
	}

	
	SpriteStone stone = monster.getValue();

	stones.push_back(stone);
	removeMonster(monster);

	return false;

}

bool Immortal::trade(Immortal& other, const Monster& monster)
{
	//判断自己和售卖者死亡否
	if (alive == false||other.alive==false)
	{
		return  false;
	}

	if (!other.hadMonster(monster))
	{
		cout << other.name << "没有" << monster << endl;
		return false;
	}

	//计算当前的所有灵石总价
	SpriteStone stone;
	for (int i = 0; i < stones.size(); i++)
	{
		stone = stone + stones[i];
	}

	if (stone >= monster.getValue())
	{
		//购买
		SpriteStone valueStone = monster.getValue();
		stone = stone - valueStone;
		stones.clear();
		stones.push_back(stone);

		monsters.push_back(monster);
		other.removeMonster(monster);
		other.stones.push_back(valueStone);

		return true;
	}
	else
	{
		cout << "抱歉!" << name << "的灵石不够买" 
			<< monster << endl;
		return false;
	}

	return false;
}

bool Immortal::trade(const Monster& monsterSource, Immortal& other, const Monster& monsterDest)
{
	if (alive == false || other.alive == false)
	{
		return false;
	}

	if (monsterSource == monsterDest ||
		!hadMonster(monsterSource) ||
		!other.hadMonster(monsterDest) ||
		!(monsterSource.getValue() >= monsterDest.getValue()))
	{
		return false;
	}

	removeMonster(monsterSource);
	other.removeMonster(monsterDest);
	
	monsters.push_back(monsterDest);
	other.monsters.push_back(monsterSource);

	return false;
}

bool Immortal::trade(const Monster& monster, Immortal& other)
{
	if (alive == false || other.alive == false)
	{
		return false;
	}

	if (!hadMonster(monster))
	{
		cout << name << "没有" << monster << endl;
		return false;
	}

	SpriteStone otherStone;
	for (int i = 0; i < other.stones.size(); i++)
	{
		otherStone = otherStone + other.stones[i];
	}

	if (otherStone >= monster.getValue())
	{
		otherStone = otherStone - monster.getValue();
		other.stones.clear();
		other.stones.push_back(otherStone);
		other.monsters.push_back(monster);

		this->removeMonster(monster);
		this->stones.push_back(monster.getValue());

		return true;
	}

	return false;
}

int Immortal::getPower() const
{
	//计算修仙者的攻击力
	int ret = ((int)level + 1) * IMMORTAL_LEVEL_FACTOR;

	//计算机灵石带来的攻击力
	SpriteStone stone;
	for (int i = 0; i < stones.size(); i++)
	{
		stone = stone + stones[i];
	}
	ret = ret + stone.getCount() * SPRITE_FACTOR;

	for (int i = 0; i < monsters.size(); i++)
	{
		ret = ret + monsters[i].getPower() * MONSTER_FACTOR;
	}

	return ret;

}

void Immortal::fight(const Monster& monster)
{
	int selfPower = getPower();
	int monsterPower = monster.getPower();

	if (selfPower > monsterPower)
	{
		monsters.push_back(monster);
	}
	else if (selfPower < monsterPower)
	{
		dead();
	}
}

void Immortal::dead()
{
	alive = false;

	//清空灵石和妖兽
	stones.erase(stones.begin(), stones.end());
	monsters.erase(monsters.begin(), monsters.end());

}

//判断是否有妖兽
bool Immortal::hadMonster(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)
{
	//定义一个迭代器(是一种特殊的指针,指向monsters中的第一个成员
	vector<Monster>::iterator it = monsters.begin();
	//vector<Monster>::iterator it = monsters.begin();

	while (it != monsters.end())
	{
		if (*it == monster)
		{
			it = monsters.erase(it);
			return true;
		}
		else
		{
			it++;
		}
	}

	return false;
}

ostream& operator<<(ostream& os, const Immortal& immortal)
{
	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 << "\t妖兽数量:";


		if (immortal.monsters.size() == 0)
		{
			os << "无";
		}

		for (int i = 0; i < immortal.monsters.size(); i++)
		{
			os << immortal.monsters[i] << " ";
		}

		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_SHEN:
		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;
}

Monster.h

#pragma once
#include <string>
#include "SpriteStone.h"

using namespace std;

class Monster
{
public:
	Monster(int level = 0,const string category = "δ֪");
	SpriteStone getValue() const;

	int getPower() const;

	friend ostream& operator<<(ostream& os, const Monster& monster);

	friend bool operator==(const Monster& one, const Monster& other);

private:
	int level;
	string category;
};

ostream& operator<<(ostream& os, const Monster& monster);

bool operator==(const Monster& one, const Monster& other);

Monster.cpp

#include "Monster.h"

#define MONSTER_LEVEL_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,10000,20000,100000 };
	int len = stoneCount[level - 1];
	
	return SpriteStone(len, SpriteStoneLevel::PRIMARY_LEVEL);

}

int Monster::getPower() const
{
	int ret = MONSTER_LEVEL_FACTOR * level;

	return ret;
}

ostream& operator<<(ostream& os, const Monster& monster)
{
	os << "等级:" << monster.level << "妖兽类别:" << monster.category;
	return os;
}

bool operator==(const Monster& one, const Monster& other)
{
	if (one.category == other.category &&
		one.level == other.level)
	{
		return true;
	}
	else
	{
		return false;
	}
}

SpriteStone.h

#pragma once
#include <string>
#include "SpriteStone.h"

using namespace std;

class Monster
{
public:
	Monster(int level = 0,const string category = "δ֪");
	SpriteStone getValue() const;

	int getPower() const;

	friend ostream& operator<<(ostream& os, const Monster& monster);

	friend bool operator==(const Monster& one, const Monster& other);

private:
	int level;
	string category;
};

ostream& operator<<(ostream& os, const Monster& monster);

bool operator==(const Monster& one, const Monster& other);

Monster.cpp

#include "Monster.h"

#define MONSTER_LEVEL_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,10000,20000,100000 };
	int len = stoneCount[level - 1];
	
	return SpriteStone(len, SpriteStoneLevel::PRIMARY_LEVEL);

}

int Monster::getPower() const
{
	int ret = MONSTER_LEVEL_FACTOR * level;

	return ret;
}

ostream& operator<<(ostream& os, const Monster& monster)
{
	os << "等级:" << monster.level << "妖兽类别:" << monster.category;
	return os;
}

bool operator==(const Monster& one, const Monster& other)
{
	if (one.category == other.category &&
		one.level == other.level)
	{
		return true;
	}
	else
	{
		return false;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会飞的鱼-blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值