欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【openjudge】魔兽世界(终极版)

程序员文章站 2024-03-17 19:47:52
...

第一行是取消vs的error用的

//#pragma warning(disable:4996)
#include <iostream>
#include <fstream>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <iomanip>
#include <cstring>
#include <vector>
#define RED 0
#define BLUE 1
#define DRAGON 0
#define NINJA 1
#define ICEMAN 2
#define LION 3
#define WOLF 4
#define SWORD 0
#define BOMB 1
#define ARROW 2
#define NEUTRAL -1
using namespace std;
int K, R, N;
int headquarter[2], atk[5], init_hp[5], num[2][5];					//五种武士的攻击力															//箭的攻击力
const string warrior[5] = { "dragon", "ninja", "iceman", "lion", "wolf" };
const string camp[2] = { "red", "blue" };
const string weapon[3] = { "sword", "bomb", "arrow" };
const int seq[2][5] = { { 2,3,4,1,0 },{ 3,0,1,2,4 } };
class Weapon {
private:
	int type;																	
	int r;															//武器的攻击力
	int Durability;													//弓箭的耐久度
public:
	Weapon(int type_, int Atk) :
		type(type_) {
		switch (type) {
		case SWORD:
			r = int(Atk*0.2);
			break;
		case ARROW:
			Durability = 3;
			r = R;
			break;
		}
	};
	Weapon(int k) {
		type = k;
	}
	Weapon() {};
	int getType() {
		return type;
	};
	int getR() {
		return r;
	}
	int getDurability() {
		return Durability;
	}
	void fightSword() {
		r = int(0.8 * r);
	}
	void fightArrow() {
		Durability -= 1;
	}
	Weapon &operator = (Weapon other) {
		this->r = other.getR();
		this->type = other.getType();
		this->Durability = other.getDurability();
		return *this;
	}
	bool isNULL() {
		if (type == -1)
			return true;
		else
			return false;
	}
};
const Weapon null(-1);
class Warrior {
private:
	int name;														//0-4依次为dragon, ninja, iceman, lion, wolf
	int color;														//红色代表0, 蓝色代表
	int ID;															//武士在阵营中的编号
	int hp;															//武士的生命力
	int Loyalty;													//武士的忠诚(只有lion有用)
	int city;														//武士所在城市的编号
	int Atk;														//武士的攻击力
	int direction;													//武士前进的方向,红色为1,蓝色为-1
	int step;														//已经走的步数(只有iceman有用)	
	double morale;													//武士的士气(只有dragon有用)
	void Call(int DATE) {
		printf("%03d:00 %s %s %d born\n",
			DATE, camp[color].c_str(), warrior[name].c_str(), ID);
	}
	void Dragon(int energe) {
		Weapon w1(ID % 3, Atk);
		wea.at(ID % 3) = w1;
		morale = (energe - hp)*1.0 / hp;
		printf("Its morale is %.2f\n", morale);
	};
	void Ninja() {
		Weapon w1(ID % 3, Atk);
		wea.at(ID % 3) = w1;
		Weapon w2((ID + 1) % 3, Atk);
		wea.at((ID + 1) % 3) = w2;
	}
	void Iceman() {
		Weapon w1(ID % 3, Atk);
		wea.at(ID % 3) = w1;
	};
	void Lion(int energe) {
		Loyalty = energe - hp;
		printf("Its loyalty is %d\n",
			Loyalty);
	};
	void Wolf() {
		return;
	};
	void killed(int DATE, bool what) {
		if (!what)
			return;
		printf("%03d:40 %s %s %d was killed in city %d\n",
			DATE, camp[color].c_str(), warrior[name].c_str(), ID, city);
	}
	void getWeapon(Warrior* opponent) {
		if (name != WOLF)
			return;
		for (int i = 0; i < 3; i++) {
			if (wea.at(i).isNULL() && !opponent->wea.at(i).isNULL())
				wea.at(i) = opponent->wea.at(i);
		}
	}
	void superIceman() {
		if (name != ICEMAN)
			return;
		if ((step % 2) == 0) {
			if (hp > 9)
				hp -= 9;
			else
				hp = 1;
			Atk += 20;
		}
	}
	void yell(int DATE) {
		if (name != DRAGON)
			return;
		printf("%03d:40 %s dragon %d yelled in city %d\n",
			DATE, camp[color].c_str(), ID, city);
	}
public:
	bool kill;														//本回合是否杀敌
	bool live;														//是否还或者
	vector<Weapon> wea;												//指向武器的指针
	Warrior(int name_, int color_, int ID_, int hp_, int DATE, int energe) :
		name(name_), color(color_), ID(ID_), hp(hp_) {
		live = true;
		if (color == RED) {
			direction = 1;
			city = 0;
		}
		else {
			direction = -1;
			city = N + 1;
		}
		step = 0;
		Atk = atk[name];
		num[color][name]++;
		wea.push_back(null);
		wea.push_back(null);
		wea.push_back(null);
		Call(DATE);
		switch (name) {
		case DRAGON:
			Dragon(energe);
			break;
		case NINJA:
			Ninja();
			break;
		case ICEMAN:
			Iceman();
			break;
		case LION:
			Lion(energe);
			break;
		case WOLF:
			Wolf();
			break;
		}
		if (wea.at(SWORD).getR() == 0)
			wea.at(SWORD) = null;
	};
	Warrior(int k) {
		name = -1;
		wea.push_back(null);
		wea.push_back(null);
		wea.push_back(null);
	}
	Warrior() {
		wea.push_back(null);
		wea.push_back(null);
		wea.push_back(null);
	}
	int getAtk() {
		return Atk;
	}
	int getID() {
		return ID;
	}
	int getColor() {
		return color;
	}
	int getName() {
		return name;
	}
	int getCity() {
		return city;
	}
	int getHp() {
		return hp;
	}
	int getLoyalty() {
		return Loyalty;
	}
	int getDirection() {
		return direction;
	}
	int getStep() {
		return step;
	}
	double getMorale() {
		return morale;
	}
	bool isLive() {
		return live;
	}
	Warrior &operator = (Warrior other) {
		if (other.isNULL()) {
			this->name = other.getName();
			return *this;
		}
		this->name = other.getName();
		this->color = other.getColor();
		this->ID = other.getID();
		this->Atk = other.getAtk();
		this->city = other.getCity();
		this->hp = other.getHp();
		this->direction = other.getDirection();
		this->step = other.getStep();
		this->wea.at(0) = other.wea.at(0);
		this->wea.at(1) = other.wea.at(1);
		this->wea.at(2) = other.wea.at(2);
		this->morale = other.getMorale();
		this->Loyalty = other.getLoyalty();
		this->live = other.live;
		this->kill = other.kill;
		return *this;
	}
	void attack(Warrior* opponent, int DATE, bool what) {
		if (what) {
			printf("%03d:40 %s %s %d attacked %s %s %d in city %d with %d elements and force %d\n",
				DATE, camp[color].c_str(), warrior[name].c_str(), ID,
				camp[opponent->getColor()].c_str(), warrior[opponent->getName()].c_str(), opponent->getID(),
				city, hp, Atk);
		}
		int at = Atk;
		int HP = opponent->getHp();
		if (!wea.at(SWORD).isNULL()) {
			at += wea.at(SWORD).getR();
			wea.at(SWORD).fightSword();
			if (wea.at(SWORD).getR() == 0)
				wea.at(SWORD) = null;
		}
		kill = opponent->Injured(at, DATE, what);
		if (!kill)
			opponent->CounterAttack(this, DATE, what);
		if (!isLive())
			return;
		if (kill && opponent->getName() == LION)
			hp += HP;
	};
	void CounterAttack(Warrior* opponent, int DATE, bool what) {
		if (name == NINJA)
			return;
		int HP = opponent->getHp();
		int at = Atk / 2;
		if (!wea.at(SWORD).isNULL()) {
			at += wea.at(SWORD).getR();
			wea.at(SWORD).fightSword();
			if (wea.at(SWORD).getR() == 0)
				wea.at(SWORD) = null;
		}
		if(what)
			printf("%03d:40 %s %s %d fought back against %s %s %d in city %d\n",
				DATE, camp[color].c_str(), warrior[name].c_str(), ID,
				camp[opponent->getColor()].c_str(), warrior[opponent->getName()].c_str(), opponent->getID(),
				city);
		kill = opponent->Injured(at, DATE, what);
		if (kill && opponent->getName() == LION)
			hp += HP;
	}
	bool Injured(int injured, int DATE, bool what) {
		hp -= injured;
		if (hp <= 0) {
			live = false;
			killed(DATE, what);
			return true;
		}
		return false;
	}
	bool shoted(int injured) {
		hp -= injured;
		if (hp <= 0) {
			live = false;
			return true;
		}
		return false;
	}
	void March() {
		if (city + direction >= 0 && city + direction <= N + 1) {
			city += direction;
			step++;
			superIceman();
		}
	}
	bool marchClaim(int DATE) {
		if (color == RED && city == N + 1) {
			printf("%03d:10 red %s %d reached blue headquarter with %d elements and force %d\n",
				DATE, warrior[name].c_str(), ID, hp, Atk);
			return true;
		}
		else if (color == BLUE && city == 0) {
			printf("%03d:10 blue %s %d reached red headquarter with %d elements and force %d\n",
				DATE, warrior[name].c_str(), ID, hp, Atk);
			return true;
		}
		else {
			printf("%03d:10 %s %s %d marched to city %d with %d elements and force %d\n",
				DATE, camp[color].c_str(), warrior[name].c_str(), ID, city, hp, Atk);
			return false;
		}
	}
	void shot(int DATE, Warrior* opponent) {
		bool kill = opponent->shoted(R);
		wea.at(ARROW).fightArrow();
		if (wea.at(ARROW).getDurability() == 0)
			wea.at(ARROW) = null;
		printf("%03d:35 %s %s %d shot",
			DATE, camp[color].c_str(), warrior[name].c_str(), ID);
		if (kill)
			printf(" and killed %s %s %d\n",
				camp[opponent->getColor()].c_str(), warrior[opponent->getName()].c_str(), opponent->getID());
		else
			printf("\n");
	}
	void useBomb(int DATE, Warrior* opponent) {
		if (wea[BOMB].isNULL())
			return;
		else {
			live = false;
			opponent->live = false;
			printf("%03d:38 %s %s %d used a bomb and killed %s %s %d\n",
				DATE, camp[color].c_str(), warrior[name].c_str(), ID,
				camp[opponent->getColor()].c_str(), warrior[opponent->getName()].c_str(), opponent->getID());
		}
	}
	void earn(int DATE, int elements) {
		hp += elements;
		printf("%03d:40 %s %s %d earned %d elements for his headquarter\n",
			DATE, camp[color].c_str(), warrior[name].c_str(), ID, elements);
	}
	void report(int DATE) {
		string hasWeapon[3];
		int cnt = 0;
		if (!wea.at(ARROW).isNULL()) {
			cnt++;
			char buf[64];
			sprintf(buf, "arrow(%d)", wea.at(ARROW).getDurability());
			hasWeapon[0] = buf;
		}
		if (!wea.at(BOMB).isNULL()) {
			cnt++;
			hasWeapon[1] = "bomb";
		}
		if (!wea.at(SWORD).isNULL()) {
			cnt++;
			char buf[64];
			sprintf(buf, "sword(%d)", wea.at(SWORD).getR());
			hasWeapon[2] = buf;
		}
		printf("%03d:55 %s %s %d has ",
			DATE, camp[color].c_str(), warrior[name].c_str(), ID);
		int countOut = 0;
		for (int i = 0; i < 3; i++) {
			printf("%s", hasWeapon[i].c_str());
			if (hasWeapon[i] != "" && countOut != cnt - 1) {
				countOut++;
				printf(",");
			}
		}
		if (cnt == 0)
			printf("no weapon");
		printf("\n");
	}
	bool runAway(int DATE) {
		if (name != LION)
			return false;
		if (Loyalty <= 0) {
			printf("%03d:05 %s lion %d ran away\n",
				DATE, camp[color].c_str(), ID);
			return true;
		}
		return false;
	}
	bool isNULL() {
		if (name == -1)
			return true;
		else
			return false;
	}
	void reward() {
		hp += 8;
	}
	void afterFight(int DATE, Warrior* opponent, int pre) {
		if (name == LION) {
			if (!kill)
				Loyalty -= K;
		}
		else if (name == DRAGON) {
			if (kill)
				morale += 0.2;
			else
				morale -= 0.2;
			if (live && morale > 0.8 && pre == color)
				yell(DATE);
		}
		else if (name == WOLF && kill) {
			getWeapon(opponent);
		}
	}
	
};
const Warrior Wnull(-1);
class City {
private:
	int Flag;
	int num;
	int element;
	int Win[2];
public:
	City* nextCity;
	City* lastCity;
	Warrior intruder;												//入侵者,只有两个司令部的入侵者可能不为Wnull
	Warrior warrior_red;
	Warrior warrior_r_t;
	Warrior warrior_blue;
	Warrior warrior_b_t;
	City() {};
	City(int num_) :
		num(num_) {
		element = 0;
		Flag = NEUTRAL;												//初始为中立
		Win[0] = NEUTRAL;
		Win[1] = NEUTRAL;
		intruder = Wnull;											
		warrior_red = Wnull;
		warrior_blue = Wnull;
		warrior_r_t = Wnull;
		warrior_b_t = Wnull;
		nextCity = NULL;
		lastCity = NULL;
	};
	void Trans(int DATE) {											//要转换旗帜只有连续两次战斗有胜方且相同
		if ((Win[0] == Win[1]) &&									//上次和上上次战斗的结果相同
			Win[0] != NEUTRAL &&									//上上次战斗的结果不为平手
			Win[1] != NEUTRAL &&									//上次战斗的结果不为平手
			Win[0] != Flag) {										//如果胜方等于旗帜的颜色则不需要转换
			Flag = Win[0];
			printf("%03d:40 %s flag raised in city %d\n",			//flag立起来
				DATE, camp[Flag].c_str(), num);
		}
	}
	int getFlag() {
		return Flag;
	}
	int getNum() {
		return num;
	}
	void product() {
		element += 10;
	}
	void clear() {
		element = 0;
	}
	int getColor() {
		if ((Flag == RED) || ((Flag == NEUTRAL) && ((num % 2) == 1)))
			return RED;
		else
			return BLUE;
	}
	int getElement() {
		return element;
	}
	void March_r_step1() {
		if (!warrior_red .isNULL() && nextCity != NULL) {
			warrior_red.March();
			nextCity->warrior_r_t = warrior_red;
			warrior_red = Wnull;
		}
	}
	void March_b_step1() {
		if (!warrior_blue.isNULL() && lastCity != NULL) {
			warrior_blue.March();
			lastCity->warrior_b_t = warrior_blue;
			warrior_blue = Wnull;
		}
	}
	bool March_r_step2(int DATE) {
		bool flag = false;
		if (!warrior_r_t.isNULL()) {
			flag = warrior_r_t.marchClaim(DATE);
			warrior_red = warrior_r_t;
			warrior_r_t = Wnull;
		}
		return flag;
	}
	bool March_b_step2(int DATE) {
		bool flag = false;
		if (!warrior_b_t.isNULL()) {
			flag = warrior_b_t.marchClaim(DATE);
			warrior_blue = warrior_b_t;
			warrior_b_t = Wnull;
		}
		return flag;
	}
	int fight(int DATE) {
		int winner = NEUTRAL;
		if (!warrior_red.isNULL() && !warrior_blue.isNULL()) {		//发动战斗首先要求有两个武士,结果则是一死一活或者两活
			if (getColor() == RED) {								//红方先手,并且红武士还活着则进攻
				if (warrior_red.isLive()) {							//红武士还活着
					if (!warrior_blue.isLive()) {					//如果对方是被射死的 
						warrior_red.kill = true;					//仍然判定本回合杀敌
						warrior_red.afterFight(DATE, &warrior_blue, RED);
					}
					else {											
						warrior_red.attack(&warrior_blue, DATE, true);
						if (warrior_red.isLive())
							warrior_red.afterFight(DATE, &warrior_blue, RED);	//只要活着就能做战后动作
						if (warrior_blue.isLive())	
							warrior_blue.afterFight(DATE, &warrior_red, RED);	//只要活着就能做战后动作
					}
				}
				else {												//红武士死了,如果蓝武士还活着直接判定蓝武士胜利
					if (warrior_blue.isLive()) {
						warrior_blue.kill = true;
						warrior_blue.afterFight(DATE, &warrior_red, RED);
					}
				}
			}
			else if (getColor() == BLUE) {							//蓝方先手,并且蓝武士还活着则进攻
				if (warrior_blue.isLive()) {						//蓝武士还活着
					if (!warrior_red.isLive()) {					//如果对方是被射死的
						warrior_blue.kill = true;					//仍然判定本回合杀敌
						warrior_blue.afterFight(DATE, &warrior_red, BLUE);
					}
					else {
						warrior_blue.attack(&warrior_red, DATE, true);
						if (warrior_red.isLive())
							warrior_red.afterFight(DATE, &warrior_blue, BLUE);	//只要活着就能做战后动作
						if (warrior_blue.isLive())
							warrior_blue.afterFight(DATE, &warrior_red, BLUE);	//只要活着就能做战后动作
					}
				}
				else {												//蓝武士死了,如果红武士还活着则判定蓝武士胜利
					if (warrior_red.isLive()) {
						warrior_red.kill = true;
						warrior_red.afterFight(DATE, &warrior_blue, BLUE);
					}
				}
			}
			if (!warrior_red.isLive() && warrior_blue.isLive()) {	//红死蓝活
				warrior_red = Wnull;
				Win[0] = Win[1];
				Win[1] = BLUE;
				winner = BLUE;
			}
			else if (!warrior_blue.isLive() && warrior_red.isLive()) {	//蓝死红活
				warrior_blue = Wnull;
				Win[0] = Win[1];
				Win[1] = RED;
				winner = RED;
			}
			else if (!warrior_blue.isLive() && !warrior_red.isLive()) {
				warrior_red = Wnull; 
				warrior_blue = Wnull;
			}
			else {								//两个都活,则连胜中断
				Win[0] = Win[1];
				Win[1] = NEUTRAL;
			}
		}
																	/*如果返回NEUTRAL,则有两种情况
																	**一.没有开战,由本函数可知没有开战虽然返回的是NEUTRAL,但是
																	**最近两次的战斗结果是不变的
																	**二.开战了,无人死亡,则战斗结果为中立
																	**三.没有开战且全部死亡,则战斗结果不变
																	*/
		return winner;
	}
	void boom(int DATE) {
		if (!warrior_red.isNULL() && !warrior_blue.isNULL() && warrior_red.isLive() && warrior_blue.isLive()) {
																	//如果敌人或者自己有一个是已经死去的则不考虑bomb
			if (getColor() == RED) {
				Warrior warrior1 = warrior_red;						//复制红武士
				Warrior warrior2 = warrior_blue;					//复制蓝武士
				warrior1.attack(&warrior2, DATE, false);			//发动攻击
				if (!warrior1.isLive())								//如果正常攻击之后红武士死去,则红武士考虑bomb
					warrior_red.useBomb(DATE, &warrior_blue);
				if (!warrior2.isLive())								//如果正常攻击之后蓝武士死去,则蓝武士考虑bomb
					warrior_blue.useBomb(DATE, &warrior_red);
			}
			else {
				Warrior warrior1 = warrior_red;
				Warrior warrior2 = warrior_blue;
				warrior2.attack(&warrior1, DATE, false);
				if (!warrior1.isLive())
					warrior_red.useBomb(DATE, &warrior_blue);
				if (!warrior2.isLive())
					warrior_blue.useBomb(DATE, &warrior_red);
			}
			if (!warrior_red.isLive() && !warrior_blue.isLive()) {	//如果考虑bomb之后两者都死去,则是被炸死的,赋值Wnull
				warrior_red = Wnull;
				warrior_blue = Wnull;
			}
		}
	}
	void win(int winner) {
		Win[0] = Win[1];
		Win[1] = winner;
	}
};
class Camp {
private:
	int energe;														//拥有的生命元数目
	int last;														//上一次制造的士兵阵营编号
	int warriorNum;													//已有武士数目+1
	int color;														//阵营颜色
	int headQuarter;												//司令部所在的城市编号
	vector<Warrior> Warr;
	void getWarrior(int I, int DATE, int &last, vector<City> &Map) {
		int name = seq[color][I];
		int hp = init_hp[name];
		Warrior warri = Warrior(name, color, warriorNum, hp, DATE, energe);
		Warr.push_back(warri);
		if (color == RED)
			Map[headQuarter].warrior_red = Warr.back();
		else
			Map[headQuarter].warrior_blue = Warr.back();
		energe -= hp;
		last = I;
		warriorNum++;
		return;
	}

public:
	int intruder;
	Camp(int energe_, int color_) :
		energe(energe_), color(color_) {
		last = -1;
		warriorNum = 1;
		intruder = 0;
		if (color == RED)
			headQuarter = 0;
		else
			headQuarter = N + 1;
	}
	~Camp() {}
	void Build(int DATE, vector<City> &Map) {
		int I = (last + 1) % 5;
		if (energe >= init_hp[seq[color][I]]) {
			getWarrior(I, DATE, last, Map);
			return;
		}
	}
	int getEnerge() {
		return energe;
	}
	int getColor() {
		return color;
	}
	void claim(int DATE) {
		printf("%03d:50 %d elements in %s headquarter\n",
			DATE, energe, camp[color].c_str());
	}
	void getElement(int ele) {
		energe += ele;
	}
	void reward() {
		energe -= 8;
	}
};
class War {
private:
	int M, T;
	bool over;
	bool flag[2];
	vector<City> Map;
	vector<Camp>headQuarter;
	void Input() {
		cin >> M >> N >> R >> K >> T;
		for (int i = 0; i < 5; i++)
			cin >> init_hp[i];
		for (int i = 0; i < 5; i++)
			cin >> atk[i];
	}
	void Init(int &k) {
		memset(num, 0, sizeof(num));
		over = false;
		for (int i = 0; i <= N + 1; i++) {
			Map.push_back(City(i));
		}
		for (int i = 0; i <= N + 1; i++) {
			if (i == 0)
				Map.at(i).lastCity = NULL;
			else
				Map.at(i).lastCity = &Map[i - 1];
			if (i == N + 1)
				Map.at(i).nextCity = NULL;
			else
				Map.at(i).nextCity = &Map[i + 1];
		}
		printf("Case %d:\n", k++);
	}
	void runAway(int DATE){
		City* city = &Map[0];
		while (city != NULL) {
			if (!city->warrior_red.isNULL()) {
				if(city->warrior_red.runAway(DATE))
					city->warrior_red = Wnull;						//逃跑之后指向原来狮子的指针变回Wnull
			}
			if (!city->warrior_blue.isNULL()) {
				if(city->warrior_blue.runAway(DATE))
					city->warrior_blue = Wnull;
			}
			city = city->nextCity;
		}
	}
	void March(int DATE){
		bool flag[2] = { false, false };
		City* city = &Map[0];
		while (city != NULL) {
			city->March_r_step1();									//先挂载
			city->March_b_step1();									//先挂载
			city = city->nextCity;
		}
		city = &Map[0];
		while (city != NULL) {
			if (city->March_r_step2(DATE)) {
				headQuarter[BLUE].intruder++;						//到达司令部
				if (headQuarter[BLUE].intruder == 2)				//两个武士到达司令部
					printf("%03d:10 blue headquarter was taken\n", DATE);
			}
			if (city->March_b_step2(DATE)) {
				headQuarter[RED].intruder++;
				if (headQuarter[RED].intruder == 2)
					printf("%03d:10 red headquarter was taken\n", DATE);
			}
			city = city->nextCity;
		}
		if (!Map.at(0).warrior_blue.isNULL()) {
			Map.at(0).intruder = Map.at(0).warrior_blue;
				Map.at(0).warrior_blue = Wnull;
		}
		if (!Map.at(N+1).warrior_blue.isNULL()) {
			Map.at(N + 1).intruder = Map.at(N + 1).warrior_red;
			Map.at(N + 1).warrior_red = Wnull;
		}
	}						
	void productElement(){
		City* city = &Map[0];
		while (city != NULL) {
			city->product();										//生产生命元
			city = city->nextCity;
		}
	}
	void getElement(int DATE) {
		City* city = &Map[1];
		while (city->nextCity != NULL) {							//除了司令部,所有的都开始收获能量
			if (city->getElement() == 0) {							//没有就继续
				city = city->nextCity;
				continue;
			}
			Warrior &warrior1 = city->warrior_red;
			Warrior &warrior2 = city->warrior_blue;
			if (!warrior1.isNULL() && warrior2.isNULL()) {			//有红武士没有蓝武士
				headQuarter.at(RED).getElement(city->getElement());	//红司令部收获
				printf("%03d:30 red %s %d earned %d elements for his headquarter\n",
					DATE, warrior[warrior1.getName()].c_str(), warrior1.getID(), city->getElement());
				city->clear();										//收获后清零
			}
			else if (warrior1.isNULL() && !warrior2.isNULL()) {		//有蓝武士没有红武士
				headQuarter.at(BLUE).getElement(city->getElement());//蓝司令部收获
				printf("%03d:30 blue %s %d earned %d elements for his headquarter\n",
					DATE, warrior[warrior2.getName()].c_str(), warrior2.getID(), city->getElement());
				city->clear();										//收获后清零
			}
			city = city->nextCity;
		}
	}
	void shot(int DATE){											//射箭,每个城市开始,对将走到的下个城市的敌人放箭
		City* city = &Map[0];
		while (city != NULL) {
			if (!city->warrior_red.isNULL() &&						//有红武士
				!(city->warrior_red.wea[ARROW].isNULL()) &&			//红武士有弓箭
				(city->nextCity != NULL)) {							//这不是最后一个城市
				if (!(city->nextCity->warrior_blue.isNULL()) &&		//下一个城市有敌人
					city->nextCity->nextCity != NULL)				//下一个城市不是司令部
					city->warrior_red.shot(DATE, &(city->nextCity->warrior_blue));
			}
			if (!(city->warrior_blue.isNULL()) &&					//有蓝武士
				!(city->warrior_blue.wea[ARROW].isNULL()) &&		//蓝武士有弓箭
				(city->lastCity != NULL)) {							//这不是第一个城市
				if (!city->lastCity->warrior_red.isNULL() &&		//上一个城市有敌人
					city->lastCity->lastCity != NULL)				//上一个城市不是司令部
					city->warrior_blue.shot(DATE, &(city->lastCity->warrior_red));
			}
			city = city->nextCity;
		}
	}
	void bomb(int DATE){
		City* city = &Map[0];
		while (city != NULL) {
			city->boom(DATE);
			city = city->nextCity;
		}
	}
	void attack(int DATE){
		City* city = &Map[0];
		while (city != NULL) {	
			int winner = city->fight(DATE);							//winner是战斗结果,RED,BLUE分别是红、蓝胜利,NEUTRAL是平手
			if (winner != NEUTRAL) {								//如果有胜方
				clean(DATE, city, winner);							//胜方打扫战场并奖赏
				city->Trans(DATE);									//判定是否需要转换旗帜
			}
			city = city->nextCity;
		}
		city = &Map[0];
		while (city != NULL) {										//处理那些被射死的武士
			if (!city->warrior_red.isNULL())
				if (!city->warrior_red.isLive())					//战斗后还没有被处理的尸体处理掉
					city->warrior_red = Wnull;
			if (!city->warrior_blue.isNULL())
				if (!city->warrior_blue.isLive())
					city->warrior_blue = Wnull;
			city = city->nextCity;
		}
	}
	void report(int DATE){
		City* city = &Map[0];									
		while (city != NULL) {
			if (!city->warrior_red.isNULL())
					city->warrior_red.report(DATE);
			city = city->nextCity;
		}
		if (!Map.at(N + 1).intruder.isNULL())
			Map.at(N + 1).intruder.report(DATE);					//入侵者也要报告武器使用情况
		city = &Map[0];
		if (!Map.at(0).intruder.isNULL())
			Map.at(0).intruder.report(DATE);						//入侵者也要报告武器使用情况
		while (city != NULL) {
			if (!city->warrior_blue.isNULL())
				city->warrior_blue.report(DATE);
			city = city->nextCity;
		}
	}
	void isOver(int DATE) {											//是否满足司令部被攻破这一条件
		if (headQuarter[RED].intruder == 2)
			over = true;
		if (headQuarter[BLUE].intruder == 2)
			over = true;
	}
	void clean(int DATE, City* city, int color) {
		if (headQuarter[color].getEnerge() >= 8) {
			if (color == RED)
				city->warrior_red.reward();
			else
				city->warrior_blue.reward();
			headQuarter[color].reward();
		}
		if (city->getElement() > 0) {
			headQuarter[color].getElement(city->getElement());
			if (color == RED) {
				printf("%03d:40 red %s %d earned %d elements for his headquarter\n",
					DATE, warrior[city->warrior_red.getName()].c_str(), city->warrior_red.getID(), city->getElement());		
				city->warrior_red.kill = false;
			}
			else {
				printf("%03d:40 blue %s %d earned %d elements for his headquarter\n",
					DATE, warrior[city->warrior_blue.getName()].c_str(), city->warrior_blue.getID(), city->getElement());
				city->warrior_blue.kill = false;
			}
			city->clear();
		}
	}
	bool ddl(int DATE, int t) {										//判定时间是否到了
		if (DATE * 60 + t > T)
			return true;
		return false;
	}
public:
	War(int &k) {
		Input();													//输入数据
		Init(k);													//进行初始化
	};
	
	void Fight() {
		int TIME = 0;
		headQuarter.push_back(Camp(M, RED));						//构造司令部红
		headQuarter.push_back(Camp(M, BLUE));						//构造司令部蓝
		while (!over) {
			if (ddl(TIME, 0))
				break;
			headQuarter[RED].Build(TIME, Map);						//00司令部制造
			headQuarter[BLUE].Build(TIME, Map);						//00司令部制造
			if (ddl(TIME, 5))
				break;
			runAway(TIME);											//05狮子逃跑
			if (ddl(TIME, 10))
				break;
			March(TIME);											//10武士前进
			isOver(TIME);
			if (over)
				break;
			if (ddl(TIME, 20))
				break;
			productElement();										//20城市产出生命元
			if (ddl(TIME, 30))
				break;
			getElement(TIME);										//30只有一个武士的城市夺走生命元
			if (ddl(TIME, 35))
				break;
			shot(TIME);												//35武士放箭
			if (ddl(TIME, 38))
				break;
			bomb(TIME);												//38放bomb
			if (ddl(TIME, 40))
				break;
			attack(TIME);											//40发生战斗
			if (ddl(TIME, 50))
				break;
			headQuarter[RED].claim(TIME);							//50司令部报告生命元
			headQuarter[BLUE].claim(TIME);							//50司令部报告生命元
			if (ddl(TIME, 55))
				break;
			report(TIME);											//55武士报告武器情况
			TIME++;
		}
	}
};
int main() {
//	ifstream in("input.txt");
//	streambuf *cinbuf = cin.rdbuf();
//	cin.rdbuf(in.rdbuf());
//	freopen("out.txt", "w", stdout);
	int t;
	cin >> t;
	int k = 1;
	while (t--) {
		War aWar(k);
		aWar.Fight();
	}
//	fclose(stdout);
	return 0;
}


相关标签: 魔兽世界 c++