013:魔兽世界之一:备战 北京大学 程序设计与算法(三)C++面向对象程序设计

里面写了一些暂时用不上的继承类主要是希望以后扩展。

//gitee 
//https://gitee.com/lagrange9/my-warehouse/blob/master/OOP/013:%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C%E4%B9%8B%E4%B8%80%EF%BC%9A%E5%A4%87%E6%88%98
//author lagrange9
#include <iostream>
#include <string>
#include <vector>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
//一些常用函数
class Factory
{
public:
	static void PrintVector(const vector<int>& l)
	{
		auto i = l.begin();
		for (i = l.begin(); i != l.end(); i++)
		{
			cout << *i << endl;
		}
	}
	static void PrintArray(const string* a,int size)
	{
		for (int i = 0; i < size; i++)
		{
			cout << a[i] << endl;
		}
	}
	static void PrintArray(const int* a, int size)
	{
		for (int i = 0; i < size; i++)
		{
			cout << a[i] << endl;
		}
	}
};

class Warrior
{
private:
	int id; //游戏中的编号 ID是类型编号,数组下表
	static const int warriorTypeCnt = 5;
public:
	int GetID() { return id; }
	static vector<int> warriorCost;
	static vector<string> warriorName;
	static int NameToID(string name)
	{
		auto i = warriorName.begin();
		int ID = 0;
		for (; i != warriorName.end(); i++)
		{
			if (*i != name)
			{
				ID++;
			}
			else
			{
				return ID;
			}
		}
	}
};

vector<int> Warrior::warriorCost;
vector<string> Warrior::warriorName;

class Dragon:public Warrior
{
public:
	static int lifeCost;
	static string tag;
};

class Ninja :public Warrior
{
public:
	static int lifeCost;
	static string tag;
};

class Iceman :public Warrior
{
public:
	static int lifeCost;
	static string tag;
};

class Lion :public Warrior
{
public:
	static int lifeCost;
	static string tag;
};

class Wolf :public Warrior
{
public:
	static int lifeCost;
	static string tag;
};

int Dragon::lifeCost;
int Ninja::lifeCost;
int Iceman::lifeCost;
int Lion::lifeCost;
int Wolf::lifeCost;
string Dragon::tag = "dragon";
string Ninja::tag = "ninja";
string Iceman::tag = "iceman";
string Lion::tag = "lion";
string Wolf::tag = "wolf";

//只有一份时间
class Timer
{
private:
	static int now;
public:
	static int GetTime() { return now; }
	static void InitTime() { now = 0; }
	static void UpdateTime() { now++; }
};

int Timer::now = 0;

//司令部
class Headquarters
{
private:
	static const int warriorTypeCnt = 5; //兵种个数
	static const int circuCnt = 5; //循环次数
	string order[circuCnt]; //顺序
	int curWarriorID;
	int turn; //轮次

	string curWarrior; //当前时间要出的兵种
	int curWarriorCnt[warriorTypeCnt];
	string name; //红色方,蓝色方
	int curLife; //当前生命
	bool end;
public:
	vector<int> warriorCostByOrder; //按顺序的战士花销
	static int initLife; //初始生命
	bool hasLife; //是否有生命元可以出兵
	
	Headquarters(string name):name(name),curWarriorID(0),hasLife(true)
	,curLife(initLife),turn(0),end(false)
	{
		//初始化order数组
		if (name == "red")
		{
			order[0] = "iceman";
			order[1] = "lion";
			order[2] = "wolf";
			order[3] = "ninja";
			order[4] = "dragon";
		}
		else
		{
			order[0] = "lion";
			order[1] = "dragon";
			order[2] = "ninja";
			order[3] = "iceman";
			order[4] = "wolf";
		}
		memset(curWarriorCnt, 0, sizeof(curWarriorCnt));

		//初始化warriorCostByOrder
		for (int i = 0; i < warriorTypeCnt; i++)
		{
			int ID = Warrior::NameToID(order[i]);
			warriorCostByOrder.emplace_back(Warrior::warriorCost[ID]);
		}
	}
	
	virtual ~Headquarters() {}
	
	int getLife() { return curLife; }
	
	void setLife(int x) { curLife = x; }
	
	//指挥部随时间更新
	void Update()
	{
		if (end) return;
		int time = Timer::GetTime();

		//判断生命值是否足够,选择第一个能出的兵种
		int cnt = warriorTypeCnt; //计数器,5次以后就跳出循环
		while (curLife < warriorCostByOrder[turn % warriorTypeCnt])
		{
			turn++; cnt--;
			if (cnt == 0)
			{
				hasLife = false;
				break;
			}
		}

		//选择能出的兵种
		curWarrior = order[turn % circuCnt];

		//对应的兵种++
		int curID = Warrior::NameToID(curWarrior);
		curWarriorCnt[curID]++;

		//生命之源--
		int strength = Warrior::warriorCost[curID]; //消耗的生命源就是战士的生命值
		curLife -= strength;

		//打印出兵信息
		if (time < 10)
		{
			printf("00");
		}
		else if (time < 100)
		{
			printf("0");
		}
		if (hasLife)
		{
			printf("%d %s %s %d born with strength %d,%d %s in %s headquarter\n",
				time, name.c_str(),
				curWarrior.c_str(), time + 1,
				strength, curWarriorCnt[curID],
				curWarrior.c_str(), name.c_str());
		}
		else
		{
			cout << time;
			cout << " "+name+" headquarter stops making warriors"<<endl;
			end = true;
		}
		turn++; //轮到下一个兵种
	}
};

int Headquarters::initLife;

class Input
{
public:
	//项目初始化,给一些静态变量赋值
	static void InitProject()
	{
		Warrior::warriorName.emplace_back("dragon");
		Warrior::warriorName.emplace_back("ninja");
		Warrior::warriorName.emplace_back("iceman");
		Warrior::warriorName.emplace_back("lion");
		Warrior::warriorName.emplace_back("wolf");
	}
	static void InputData()
	{
		cin >> Headquarters::initLife;
		cin >> Dragon::lifeCost >> Ninja::lifeCost
			>> Iceman::lifeCost >> Lion::lifeCost >> Wolf::lifeCost;
		Warrior::warriorCost.clear(); //清理上次的数据
		Warrior::warriorCost.emplace_back(Dragon::lifeCost);
		Warrior::warriorCost.emplace_back(Ninja::lifeCost);
		Warrior::warriorCost.emplace_back(Iceman::lifeCost);
		Warrior::warriorCost.emplace_back(Lion::lifeCost);
		Warrior::warriorCost.emplace_back(Wolf::lifeCost);
		//PrintVector(Warrior::warriorCost);
	}
};

int main()
{
	Input::InitProject();
	int cnt,n=0; // cnt: 数据组数 n: 该组数据的编号
	cin >> cnt;
	int M; // M: 初始生命源
	while (cnt--)
	{
		Timer::InitTime();
		n++;
		Input::InputData(); //输入数据
		Headquarters red("red"), blue("blue");
		cout << "Case:" << n << endl;
		//cout events
		while (red.hasLife || blue.hasLife)
		{
			red.Update();
			blue.Update();
			Timer::UpdateTime(); //更新时间
		}
	}
	

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值