里面写了一些暂时用不上的继承类主要是希望以后扩展。
//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(); //更新时间
}
}
}