魔兽世界终极版 北京大学C++课程

 题目

魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部。两个司令部之间是依次排列的若干城市,城市从西向东依次编号为1,2,3 .... N ( N <= 20 )。红魔军的司令部算作编号为0的城市,蓝魔军的司令部算作编号为N+1的城市。司令部有生命元,用于制造武士。

 

两军的司令部都会制造武士。武士一共有 dragon 、ninja、iceman、lion、wolf 五种。每种武士都有编号、生命值、攻击力这三种属性。

 

双方的武士编号都是从1开始计算。红方制造出来的第 n 个武士,编号就是n。同样,蓝方制造出来的第 n 个武士,编号也是n。

 

武士在刚降生的时候有一个初始的生命值,生命值在战斗中会发生变化,如果生命值减少到0(生命值变为负数时应当做变为0处理),则武士死亡(消失)。

 

有的武士可以拥有武器。武器有三种,sword, bomb,和arrow,编号分别为0,1,2。

 

武士降生后就朝对方司令部走,在经过的城市如果遇到敌人(同一时刻每个城市最多只可能有1个蓝武士和一个红武士),就会发生战斗。每次战斗只有一方发起主动进攻一次。被攻击者生命值会减去进攻者的攻击力值和进攻者手中sword的攻击力值。被进攻者若没死,就会发起反击,被反击者的生命值要减去反击者攻击力值的一半(去尾取整)和反击者手中sword的攻击力值。反击可能致敌人于死地。

 

如果武士在战斗中杀死敌人(不论是主动进攻杀死还是反击杀死),则其司令部会立即向其发送8个生命元作为奖励,使其生命值增加8。当然前提是司令部得有8个生命元。如果司令部的生命元不足以奖励所有的武士,则优先奖励距离敌方司令部近的武士。

 

如果某武士在某城市的战斗中杀死了敌人,则该武士的司令部立即取得该城市中所有的生命元。注意,司令部总是先完成全部奖励工作,然后才开始从各个打了胜仗的城市回收生命元。对于因司令部生命元不足而领不到奖励的武士,司令部也不会在取得战利品生命元后为其补发奖励。

 

如果一次战斗的结果是双方都幸存(平局),则双方都不能拿走发生战斗的城市的生命元。

 

城市可以插旗子,一开始所有城市都没有旗子。在插红旗的城市,以及编号为奇数的无旗城市,由红武士主动发起进攻。在插蓝旗的城市,以及编号为偶数的无旗城市,由蓝武士主动发起进攻。

 

当某个城市有连续两场战斗都是同一方的武士杀死敌人(两场战斗之间如果有若干个战斗时刻并没有发生战斗,则这两场战斗仍然算是连续的;但如果中间有平局的战斗,就不算连续了) ,那么该城市就会插上胜方的旗帜,若原来插着败方的旗帜,则败方旗帜落下。旗帜一旦插上,就一直插着,直到被敌人更换。一个城市最多只能插一面旗帜,旗帜没被敌人更换前,也不会再次插同颜色的旗。

 

各种武器有其特点:

 

sword武器的初始攻击力为拥有它的武士的攻击力的20%(去尾取整)。但是sword每经过一次战斗(不论是主动攻击还是反击),就会变钝,攻击力变为本次战斗前的80% (去尾取整)。sword攻击力变为0时,视为武士失去了sword。如果武士降生时得到了一个初始攻击力为0的sword,则视为武士没有sword.

 

arrow有一个攻击力值R。如果下一步要走到的城市有敌人,那么拥有arrow的武士就会放箭攻击下一个城市的敌人(不能攻击对方司令部里的敌人)而不被还击。arrow使敌人的生命值减少R,若减至小于等于0,则敌人被杀死。arrow使用3次后即被耗尽,武士失去arrow。两个相邻的武士可能同时放箭把对方射死。

 

拥有bomb的武士,在战斗开始前如果判断自己将被杀死(不论主动攻击敌人,或者被敌人主动攻击都可能导致自己被杀死,而且假设武士可以知道敌人的攻击力和生命值),那么就会使用bomb和敌人同归于尽。武士不预测对方是否会使用bomb。

 

武士使用bomb和敌人同归于尽的情况下,不算是一场战斗,双方都不能拿走城市的生命元,也不影响城市的旗帜。

 

不同的武士有不同的特点。

 

dragon可以拥有一件武器。编号为n的dragon降生时即获得编号为 n%3 的武器。dragon还有“士气”这个属性,是个浮点数,其值为它降生后其司令部剩余生命元的数量除以造dragon所需的生命元数量。dragon 在一次在它主动进攻的战斗结束后,如果还没有战死,而且士气值大于0.8,就会欢呼。dragon每取得一次战斗的胜利(敌人被杀死),士气就会增加0.2,每经历一次未能获胜的战斗,士气值就会减少0.2。士气增减发生在欢呼之前。

 

ninjia可以拥有两件武器。编号为n的ninjia降生时即获得编号为 n%3 和 (n+1)%3的武器。ninja 挨打了也从不反击敌人。

 

iceman有一件武器。编号为n的iceman降生时即获得编号为 n%3 的武器。iceman 每前进两步,在第2步完成的时候,生命值会减少9,攻击力会增加20。但是若生命值减9后会小于等于0,则生命值不减9,而是变为1。即iceman不会因走多了而死。

 

lion 有“忠诚度”这个属性,其初始值等于它降生之后其司令部剩余生命元的数目。每经过一场未能杀死敌人的战斗,忠诚度就降低K。忠诚度降至0或0以下,则该lion逃离战场,永远消失。但是已经到达敌人司令部的lion不会逃跑。Lion在己方司令部可能逃跑。lion 若是战死,则其战斗前的生命值就会转移到对手身上。所谓“战斗前”,就是每个小时的40分前的一瞬间。

 

wolf降生时没有武器,但是在战斗中如果获胜(杀死敌人),就会缴获敌人的武器//換指針,但自己已有的武器就不缴获了。被缴获的武器当然不能算新的,已经被用到什么样了,就是什么样的。

 

以下是不同时间会发生的不同事件:

 

在每个整点,即每个小时的第0分, 双方的司令部中各有一个武士降生。

 

红方司令部按照 iceman、lion、wolf、ninja、dragon 的顺序制造武士。

 

蓝方司令部按照 lion、dragon、ninja、iceman、wolf 的顺序制造武士。

 

制造武士需要生命元。

 

制造一个初始生命值为 m 的武士,司令部中的生命元就要减少 m 个。

 

如果司令部中的生命元不足以制造某武士,那么司令部就等待,直到获得足够生命元后的第一个整点,才制造该武士。例如,在2:00,红方司令部本该制造一个 wolf ,如果此时生命元不足,那么就会等待,直到生命元足够后的下一个整点,才制造一个 wolf。

 

在每个小时的第5分,该逃跑的lion就在这一时刻逃跑了。

 

在每个小时的第10分:所有的武士朝敌人司令部方向前进一步。即从己方司令部走到相邻城市,或从一个城市走到下一个城市。或从和敌军司令部相邻的城市到达敌军司令部。

 

在每个小时的第20分:每个城市产出10个生命元。生命元留在城市,直到被武士取走。

 

在每个小时的第30分:如果某个城市中只有一个武士,那么该武士取走该城市中的所有生命元,并立即将这些生命元传送到其所属的司令部。

 

在每个小时的第35分,拥有arrow的武士放箭,对敌人造成伤害。放箭事件应算发生在箭发出的城市。注意,放箭不算是战斗,因此放箭的武士不会得到任何好处。武士在没有敌人的城市被箭射死也不影响其所在城市的旗帜更换情况。

 

在每个小时的第38分,拥有bomb的武士评估是否应该使用bomb。如果是,就用bomb和敌人同归于尽。

 

在每个小时的第40分:在有两个武士的城市,会发生战斗。 如果敌人在5分钟前已经被飞来的arrow射死,那么仍然视为发生了一场战斗,而且存活者视为获得了战斗的胜利。此情况下不会有“武士主动攻击”,“武士反击”,“武士战死”的事件发生,但战斗胜利后应该发生的事情都会发生。如Wolf一样能缴获武器,旗帜也可能更换,等等。在此情况下,Dragon同样会通过判断是否应该轮到自己主动攻击来决定是否欢呼。

 

在每个小时的第50分,司令部报告它拥有的生命元数量。

 

在每个小时的第55分,每个武士报告其拥有的武器情况。

 

武士到达对方司令部后就算完成任务了,从此就呆在那里无所事事。

 

任何一方的司令部里若是出现了2个敌人,则认为该司令部已被敌人占领。

 

任何一方的司令部被敌人占领,则战争结束。战争结束之后就不会发生任何事情了。

 

给定一个时间,要求你将从0点0分开始到此时间为止的所有事件按顺序输出。事件及其对应的输出样例如下:

 

 

1) 武士降生

 

输出样例: 000:00 blue lion 1 born

 

表示在 0点0分,编号为1的蓝魔lion武士降生

 

如果造出的是dragon,那么还要多输出一行,例:

 

000:00 blue dragon 1 born

 

Its morale is 23.34

 

表示该该dragon降生时士气是23. 34(四舍五入到小数点后两位)

 

如果造出的是lion,那么还要多输出一行,例:

 

000:00 blue lion 1 born

 

Its loyalty is 24

 

表示该lion降生时的忠诚度是24

 

2) lion逃跑

 

输出样例: 000:05 blue lion 1 ran away

 

表示在 0点5分,编号为1的蓝魔lion武士逃走

 

3) 武士前进到某一城市

 

输出样例: 000:10 red iceman 1 marched to city 1 with 20 elements and force 30

 

表示在 0点10分,红魔1号武士iceman前进到1号城市,此时他生命值为20,攻击力为30

 

对于iceman,输出的生命值和攻击力应该是变化后的数值

 

4)武士放箭

 

输出样例: 000:35 blue dragon 1 shot

 

表示在 0点35分,编号为1的蓝魔dragon武士射出一支箭。如果射出的箭杀死了敌人,则应如下输出:

 

000:35 blue dragon 1 shot and killed red lion 4

 

表示在 0点35分,编号为1的蓝魔dragon武士射出一支箭,杀死了编号为4的红魔lion。

 

5)武士使用bomb

 

输出样例: 000:38 blue dragon 1 used a bomb and killed red lion 7

 

表示在 0点38分,编号为1的蓝魔dragon武士用炸弹和编号为7的红魔lion同归于尽。

 

6) 武士主动进攻

 

输出样例:000:40 red iceman 1 attacked blue lion 1 in city 1 with 20 elements and force 30

 

表示在0点40分,1号城市中,红魔1号武士iceman 进攻蓝魔1号武士lion,在发起进攻前,红魔1号武士iceman生命值为20,攻击力为 30

 

7) 武士反击//忍者不反擊

 

输出样例:001:40 blue dragon 2 fought back against red lion 2 in city 1

 

表示在1点40分,1号城市中,蓝魔2号武士dragon反击红魔2号武士lion

 

8) 武士战死

 

输出样例:001:40 red lion 2 was killed in city 1

 

被箭射死的武士就不会有这一条输出。

 

9) 武士欢呼

 

输出样例:003:40 blue dragon 2 yelled in city 4

 

10) 武士获取生命元( elements )

 

输出样例:001:40 blue dragon 2 earned 10 elements for his headquarter

 

11) 旗帜升起

 

输出样例:004:40 blue flag raised in city 4

 

12) 武士抵达敌军司令部

 

输出样例:001:10 red iceman 1 reached blue headquarter with 20 elements and force 30

 

(此时他生命值为20,攻击力为30)对于iceman,输出的生命值和攻击力应该是变化后的数值

 

13) 司令部被占领

 

输出样例:003:10 blue headquarter was taken

 

14)司令部报告生命元数量

 

000:50 100 elements in red headquarter

 

000:50 120 elements in blue headquarter

 

表示在0点50分,红方司令部有100个生命元,蓝方有120个

 

15)武士报告武器情况

 

000:55 blue wolf 2 has arrow(2),bomb,sword(23)

 

000:55 blue wolf 4 has no weapon

 

000:55 blue wolf 5 has sword(20)

 

表示在0点55分,蓝魔2号武士wolf有一支arrow(这支arrow还可以用2次),一个bomb,还有一支攻击力为23的sword。

 

蓝魔4号武士wolf没武器。

 

蓝魔5号武士wolf有一支攻击力为20的sword。

 

交代武器情况时,次序依次是:arrow,bomb,sword。如果没有某种武器,某种武器就不用提。报告时,先按从西向东的顺序所有的红武士报告,然后再从西向东所有的蓝武士报告。

 

输出事件时:

 

首先按时间顺序输出;

 

同一时间发生的事件,按发生地点从西向东依次输出. 武士前进的事件, 算是发生在目的地

 

在一次战斗中有可能发生上面的 6 至 11 号事件。这些事件都算同时发生,其时间就是战斗开始时间。一次战斗中的这些事件,序号小的应该先输出。

 

两个武士同时抵达同一城市,则先输出红武士的前进事件,后输出蓝武士的。

 

显然,13号事件发生之前的一瞬间一定发生了12号事件。输出时,这两件事算同一时间发生,但是应先输出12号事件

 

虽然任何一方的司令部被占领之后,就不会有任何事情发生了。但和司令部被占领同时发生的事件,全都要输出。

 

输入

 

第一行是t,代表测试数据组数

 

每组样例共三行。

 

第一行,五个整数 M,N,R,K, T。其含义为:

 

每个司令部一开始都有M个生命元( 1 <= M <= 10000)

 

两个司令部之间一共有N个城市( 1 <= N <= 20 )

 

arrow的攻击力是R

 

lion每经过一场未能杀死敌人的战斗,忠诚度就降低K。

 

要求输出从0时0分开始,到时间T为止(包括T) 的所有事件。T以分钟为单位,0 <= T <= 5000

 

第二行:五个整数,依次是 dragon 、ninja、iceman、lion、wolf 的初始生命值。它们都大于0小于等于10000

 

第三行:五个整数,依次是 dragon 、ninja、iceman、lion、wolf 的攻击力。它们都大于0小于等于10000

 

输出

 

对每组数据,先输出一行:

 

Case n:

 

如对第一组数据就输出 Case1:

 

然后按恰当的顺序和格式输出到时间T为止发生的所有事件。每个事件都以事件发生的时间开头,时间格式是“时: 分”,“时”有三位,“分”有两位。


程序 

#include <iostream>
#include <stdlib.h>
#include <iomanip>
#include <string>
using namespace std;
class headquarter;
bool STOP = true;
class weapon {
public:
	int Num;
	string Name;
	weapon(string a, int b) : Name(a), Num(b) {}
};
class sword :public weapon {
public:
	int gongjili;
	sword(int gongjili_) :weapon("sword", 0), gongjili(gongjili_) {}
	void biandun() {
		gongjili = (int)((double)gongjili* 0.8);
	}
};
class bomb :public weapon {
public:
	bomb() :weapon("bomb", 1) {}
};
class arrow :public weapon {
public:
	int cishu;
	arrow() :weapon("arrow", 2), cishu(3) {}
};
class worriors {
protected:
	headquarter * head;
public:
	string Name;
	int city, Number;
	int seimeichi, gongjili;
	virtual void Attact(worriors* p) {
		p->Hurted(gongjili);
	}
	virtual void Hurted(int Power) {
		seimeichi -= Power;
		if (seimeichi < 0)seimeichi = 0;
	}
	virtual void Fightback(worriors* p) {
		p->Hurted(gongjili / 2);
	}
	virtual void qianjin(char name, int N) {
		if (name == 'r')city++;
		else city--;
	}
	worriors(int Num, int seimeichi_, int gongjili_, headquarter* h, char name, int N, string Name_)
		:Number(Num), seimeichi(seimeichi_), gongjili(gongjili_), head(h), Name(Name_) {
		if (name == 'b')city = N + 1;
		else city = 0;
	}//構造函數
};
class dragon :public worriors {
public:
	weapon * a;//武器類a的指針
	double shiqi;
	void Attact(worriors*p) {
		if (!a || a->Num) {//sword編號為0,如果持有sword增加攻擊力輸出
			p->Hurted(gongjili);
		}
		else {
			p->Hurted(gongjili + ((sword*)a)->gongjili);
			((sword*)a)->biandun();
			if (!((sword*)a)->gongjili) {
				free(a);
				a = NULL;
			}
		}
	}
	void Fightback(worriors*p) {
		if (!a || a->Num) {
			p->Hurted(gongjili / 2);
		}
		else {
			p->Hurted(gongjili / 2 + ((sword*)a)->gongjili);
			((sword*)a)->biandun();
			if (!((sword*)a)->gongjili) {
				free(a);
				a = NULL;
			}
		}
	}
	void yell(int time, string name) {
		cout << setfill('0') << setw(3) << time << ":40 " << name
			<< " dragon " << Number << " yelled in city " << city << endl;
	}//歡呼
	dragon(int Num, int seimeichi_, int gongjili_, headquarter*h, char name, int N, weapon*a_, double shiqi_)
		:worriors(Num, seimeichi_, gongjili_, h, name, N, "dragon"), a(a_), shiqi(shiqi_) {}//構造函數
};
class ninja :public worriors {
public:
	weapon * a, *b;
	void Attact(worriors*p) {
		if ((!a || a->Num) && (!b || b->Num)) {
			p->Hurted(gongjili);
		}
		else if (a && !a->Num) {
			p->Hurted(gongjili + ((sword*)a)->gongjili);
			((sword*)a)->biandun();
			if (!((sword*)a)->gongjili) {
				free(a);
				a = NULL;
			}
		}
		else {
			p->Hurted(gongjili + ((sword*)b)->gongjili);
			((sword*)b)->biandun();
			if (!((sword*)b)->gongjili) {
				free(b);
				b = NULL;
			}
		}

	}
	void Fightback(worriors*p) {}//忍者不反擊
	ninja(int Num, int seimeichi_, int gongjili_, headquarter*h, char name, int N, weapon*a_, weapon*b_)
		:worriors(Num, seimeichi_, gongjili_, h, name, N, "ninja"), a(a_), b(b_) {}//構造函數
};
class iceman :public worriors {
public:
	weapon * a;
	void Attact(worriors*p) {
		if (!a || a->Num) {
			p->Hurted(gongjili);
		}
		else {
			p->Hurted(gongjili + ((sword*)a)->gongjili);
			((sword*)a)->biandun();
			if (!((sword*)a)->gongjili) {
				free(a);
				a = NULL;
			}
		}
	}
	void Fightback(worriors*p) {
		if (!a || a->Num) {
			p->Hurted(gongjili / 2);
		}
		else {
			p->Hurted(gongjili / 2 + ((sword*)a)->gongjili);
			((sword*)a)->biandun();
			if (!((sword*)a)->gongjili) {
				free(a);
				a = NULL;
			}
		}
	}
	void qianjin(char name, int N) {
		if (name == 'r')city++;
		else city--;
		if ((name == 'r' || N % 2 == 1) && city % 2 == 0 ||
			name == 'b'&&N % 2 == 0 && city % 2 == 1) {
			seimeichi -= 9;
			if (seimeichi < 1)seimeichi = 1;
			gongjili += 20;
		}
	}
	iceman(int Num, int seimeichi_, int gongjili_, headquarter* h, char name, int N, weapon*a_)
		:worriors(Num, seimeichi_, gongjili_, h, name, N, "iceman"), a(a_) {}//構造函數
};
class lion :public worriors {
public:
	int zhongchengdu, K;
	virtual void Attact(worriors*p) {
		if (zhongchengdu) {
			p->Hurted(gongjili);
			if (p->seimeichi) {
				zhongchengdu -= K;
				if (zhongchengdu < 0)zhongchengdu = 0;
			}
		}
	}
	virtual void Fightback(worriors* p) {
		if (zhongchengdu) {
			p->Hurted(gongjili / 2);
			if (p->seimeichi) {
				zhongchengdu -= K;
				if (zhongchengdu < 0)zhongchengdu = 0;
			}
		}
	}
	lion(int Num, int seimeichi_, int gongjili_, headquarter*h, char name, int N, int a, int K_)
		:worriors(Num, seimeichi_, gongjili_, h, name, N, "lion"), zhongchengdu(a), K(K_) {
	}//構造函數
};
class wolf :public worriors {
public:
	arrow * a; bomb*b; sword*c;
	void Attact(worriors*p) {
		if (c) {
			p->Hurted(gongjili + c->gongjili);
			((sword*)c)->biandun();
			if (!c->gongjili) {
				free(c);
				c = NULL;
			}
		}
		else p->Hurted(gongjili);
	}
	void Fightback(worriors*p) {
		if (c) {
			p->Hurted(gongjili / 2 + c->gongjili);
			((sword*)c)->biandun();
			if (!c->gongjili) {
				free(c);
				c = NULL;
			}
		}
		else p->Hurted(gongjili / 2);
	}
	wolf(int Num, int seimeichi_, int gongjili_, headquarter*h, char name, int N)
		:worriors(Num, seimeichi_, gongjili_, h, name, N, "wolf") {
		a = NULL; b = NULL; c = NULL;
	}//構造函數
};
class headquarter {
	worriors* pWorriors[5000];//存放武士的指針
	int seimeigen, n;//武士編號n
	char chengshi[22];//城市上的旗幟,0和N+1標記司令部的敵軍人數,靜態變量,
					  //w表示無旗,r表示紅旗,b表示藍旗,x表示無旗但上一場戰鬥是紅方獲勝,y表示無旗但上一場戰爭藍方勝,0表示紅旗但上一場是藍方勝,1表示藍旗但上一場是紅方勝
	int seimeigen_in_city[21];//城市裡的生命元,靜態變量
	string worriors_Name[5];//武士名
	int strength[5], gongjili[5];
	int borntime;
	int R;//arrow攻擊力
	int K;//lion忠誠度降低常數
	static string head_name[2];//兩個司令部的名字
	int N;//城市數目
	string Name;//司令部名稱
public:
	worriors * worriors_in_city[22][2];//城市上的武士,[0]放red,[1]放blue
	headquarter(string Name_, int shengmingyuan, string wushi[],
		int strength_[5], int gongjili_[5], int R_, int K_, int N_)
	{
		Name = Name_;
		seimeigen = shengmingyuan;
		for (int i = 0; i < 5; i++)
			worriors_Name[i] = wushi[i];
		for (int i = 0; i < 5; i++)
			strength[i] = strength_[i];
		for (int i = 0; i < 5; i++)
			gongjili[i] = gongjili_[i];
		N = N_;
		K = K_;
		R = R_;
		n = 0;
		borntime = 0;
		if (Name[0] == 'r') {
			chengshi[0] = '0';
			for (int i = 1; i <= N_; i++) {
				chengshi[i] = 'w';//無旗城市
				seimeigen_in_city[i] = 0;
			}
			chengshi[N_ + 1] = '0';
			head_name[0] = "red";
			head_name[1] = "blue";
			for (int i = 0; i <= N + 1; i++)
				for (int j = 0; j < 2; j++)
					worriors_in_city[i][j] = NULL;
		}
	}//構造函數
	~headquarter() {
		if (Name[0] == 'r')
			for (int i = 0; i <= N + 1; i++)
				for (int j = 0; j < 2; j++)
					if (worriors_in_city[i][j]) {
						free_worriors(worriors_in_city[i][j]);
						worriors_in_city[i][j] = NULL;
					}
	}
	weapon* creat_weapon(int i) {
		switch (i)
		{
		case 0: {
			int g = (int)((double)gongjili[borntime] * 0.2);
			weapon* a;
			if (g)
				a = new sword(g);
			else a = NULL;
			return a;
		} break;
		case 1: {weapon* a = new bomb; return a;  }break;
		default: {weapon* a = new arrow; return a; }break;
		}
	}
	bool if_worrior_with_arrow(worriors*worrior)
	{
		switch (worrior->Name[0])
		{
		case'd':
			if (((dragon*)worrior)->a && ((dragon*)worrior)->a->Num == 2) return true;
			break;
		case'n':
			if (((ninja*)worrior)->a && ((ninja*)worrior)->a->Num == 2 ||
				((ninja*)worrior)->b && ((ninja*)worrior)->b->Num == 2) return true;
			break;
		case'i':
			if (((iceman*)worrior)->a && ((iceman*)worrior)->a->Num == 2) return true;
			break;
		case'w':
			if (((wolf*)worrior)->a) return true;
			break;
		default:
			break;
		}
		return false;
	}
	arrow* worrior_arrow(worriors*worrior) {
		switch (worrior->Name[0])
		{
		case'd':
			if (((dragon*)worrior)->a && ((dragon*)worrior)->a->Num == 2) return (arrow*)((dragon*)worrior)->a;
			break;
		case'n':
			if (((ninja*)worrior)->a && ((ninja*)worrior)->a->Num == 2)return (arrow*)((ninja*)worrior)->a;
			else if (((ninja*)worrior)->b && ((ninja*)worrior)->b->Num == 2) return (arrow*)((ninja*)worrior)->b;
			break;
		case'i':
			if (((iceman*)worrior)->a && ((iceman*)worrior)->a->Num == 2) return (arrow*)((iceman*)worrior)->a;
			break;
		case'w':
			if (((wolf*)worrior)->a) return (arrow*)((wolf*)worrior)->a;
			break;
		default:
			break;
		}
		return NULL;
	}
	bool if_worrior_with_bomb(worriors*worrior)
	{
		switch (worrior->Name[0])
		{
		case'd':
			if (((dragon*)worrior)->a && ((dragon*)worrior)->a->Num == 1) return true;
			break;
		case'n':
			if (((ninja*)worrior)->a && ((ninja*)worrior)->a->Num == 1 ||
				((ninja*)worrior)->b && ((ninja*)worrior)->b->Num == 1) return true;
			break;
		case'i':
			if (((iceman*)worrior)->a && ((iceman*)worrior)->a->Num == 1) return true;
			break;
		case'w':
			if (((wolf*)worrior)->b) return true;
			break;
		default:
			break;
		}
		return false;
	}
	bomb* worrior_bomb(worriors*worrior) {
		switch (worrior->Name[0])
		{
		case'd':
			if (((dragon*)worrior)->a && ((dragon*)worrior)->a->Num == 1) return (bomb*)((dragon*)worrior)->a;
			break;
		case'n':
			if (((ninja*)worrior)->a && ((ninja*)worrior)->a->Num == 1)return (bomb*)((ninja*)worrior)->a;
			else if (((ninja*)worrior)->b && ((ninja*)worrior)->b->Num == 1) return (bomb*)((ninja*)worrior)->b;
			break;
		case'i':
			if (((iceman*)worrior)->a && ((iceman*)worrior)->a->Num == 1) return (bomb*)((iceman*)worrior)->a;
			break;
		case'w':
			if (((wolf*)worrior)->b) return (bomb*)((wolf*)worrior)->b;
			break;
		default:
			break;
		}
		return NULL;
	}
	bool if_worrior_with_sword(worriors*worrior)
	{
		switch (worrior->Name[0])
		{
		case'd':
			if (((dragon*)worrior)->a && ((dragon*)worrior)->a->Num == 0) return true;
			break;
		case'n':
			if (((ninja*)worrior)->a && ((ninja*)worrior)->a->Num == 0 ||
				((ninja*)worrior)->b && ((ninja*)worrior)->b->Num == 0) return true;
			break;
		case'i':
			if (((iceman*)worrior)->a && ((iceman*)worrior)->a->Num == 0) return true;
			break;
		case'w':
			if (((wolf*)worrior)->c) return true;
			break;
		default:
			break;
		}
		return false;
	}
	sword* worrior_sword(worriors*worrior) {
		switch (worrior->Name[0])
		{
		case'd':
			if (((dragon*)worrior)->a && ((dragon*)worrior)->a->Num == 0) return (sword*)((dragon*)worrior)->a;
			break;
		case'n':
			if (((ninja*)worrior)->a && ((ninja*)worrior)->a->Num == 0)return (sword*)((ninja*)worrior)->a;
			else if (((ninja*)worrior)->b && ((ninja*)worrior)->b->Num == 0) return (sword*)((ninja*)worrior)->b;
			break;
		case'i':
			if (((iceman*)worrior)->a && ((iceman*)worrior)->a->Num == 0) return (sword*)((iceman*)worrior)->a;
			break;
		case'w':
			if (((wolf*)worrior)->c) return (sword*)((wolf*)worrior)->c;
			break;
		default:
			break;
		}
		return NULL;
	}
	void make(int time, headquarter*red) {
		int seimeigen_temp = seimeigen;
		borntime %= 5;
		if (seimeigen >= strength[borntime])
		{
			seimeigen -= strength[borntime];
			n++;
			cout << setfill('0') << setw(3) << time << ":00 " << Name << ' '
				<< worriors_Name[borntime] << ' ' << n << " born" << endl;
			switch (worriors_Name[borntime][0])
			{
			case'd':
			{
				dragon*pd;
				pd = new dragon(n, strength[borntime], gongjili[borntime], this, Name[0], N,
					creat_weapon(n % 3), (double)seimeigen / (double)strength[borntime]);
				pWorriors[n] = pd;
				cout << "Its morale is " << fixed << setprecision(2) << pd->shiqi << endl;
			}
			break;
			case'n':
			{
				ninja*pn;
				pn = new ninja(n, strength[borntime], gongjili[borntime], this, Name[0], N,
					creat_weapon(n % 3), creat_weapon((n + 1) % 3));
				pWorriors[n] = pn;
			}
			break;
			case'i':
			{
				iceman*pi;
				pi = new iceman(n, strength[borntime], gongjili[borntime], this, Name[0], N,
					creat_weapon(n % 3));
				pWorriors[n] = pi;
			}
			break;
			case'l':
			{
				cout << "Its loyalty is " << seimeigen << endl;
				lion*pl;
				pl = new lion(n, strength[borntime], gongjili[borntime], this, Name[0], N,
					seimeigen, K);
				pWorriors[n] = pl;
			}
			break;
			default: {//wolf
				wolf*pw;
				pw = new wolf(n, strength[borntime], gongjili[borntime], this, Name[0], N);
				pWorriors[n] = pw;
			}
					 break;
			}
			if (Name[0] == 'r')
				worriors_in_city[0][0] = pWorriors[n];
			else red->worriors_in_city[N + 1][1] = pWorriors[n];
			pWorriors[n] = NULL;
			borntime++;
		}
	}//(沒寫)如果司令部中的生命元不足以制造某武士,那么司令部就等待,直到获得足够生命元后的第一个整点,才制造该武士。
	void free_worriors(worriors*worrior) {
		switch (worrior->Name[0])
		{
		case'd':
			if (((dragon*)worrior)->a) {
				free(((dragon*)worrior)->a);
				((dragon*)worrior)->a = NULL;
			}
			free((dragon*)worrior);
			break;
		case'n':
			if (((ninja*)worrior)->a) {
				free(((ninja*)worrior)->a);
				((ninja*)worrior)->a = NULL;
			}
			if (((ninja*)worrior)->b) {
				free(((ninja*)worrior)->b);
				((ninja*)worrior)->b = NULL;
			}
			free((ninja*)worrior);
			break;
		case'i':
			if (((iceman*)worrior)->a) {
				free(((iceman*)worrior)->a);
				((iceman*)worrior)->a = NULL;
			}
			free((iceman*)worrior);
			break;
		case'w':
			if (((wolf*)worrior)->a) {
				free(((wolf*)worrior)->a);
				((wolf*)worrior)->a = NULL;
			}
			if (((wolf*)worrior)->b) {
				free(((wolf*)worrior)->b);
				((wolf*)worrior)->b = NULL;
			}
			if (((wolf*)worrior)->c) {
				free(((wolf*)worrior)->c);
				((wolf*)worrior)->c = NULL;
			}
			free((wolf*)worrior);
			break;
		default:free((lion*)worrior);
			break;
		}
	}//武器也要free
	void free_weapon(worriors*worrior, int Number) {//前提是已經知道有這個weapon
		switch (worrior->Name[0])
		{
		case'd':
			if (((dragon*)worrior)->a->Num == Number) {
				free(((dragon*)worrior)->a);
				((dragon*)worrior)->a = NULL;
			}
			break;
		case'n':
			if (((ninja*)worrior)->a->Num == Number) {
				free(((ninja*)worrior)->a);
				((ninja*)worrior)->a = NULL;
			}
			else if (((ninja*)worrior)->b->Num == Number) {
				free(((ninja*)worrior)->b);
				((ninja*)worrior)->b = NULL;
			}
			break;
		case'i':
			if (((iceman*)worrior)->a->Num == Number) {
				free(((iceman*)worrior)->a);
				((iceman*)worrior)->a = NULL;
			}
			break;
		case'w':
			switch (Number)
			{
			case 0:
				free(((wolf*)worrior)->c);
				((wolf*)worrior)->c = NULL;
				break;
			case 1:
				free(((wolf*)worrior)->b);
				((wolf*)worrior)->b = NULL;
				break;
			case 2:
				free(((wolf*)worrior)->a);
				((wolf*)worrior)->a = NULL;
				break;
			default:
				break;
			}
		default:
			break;
		}
	}
	void do05(int time) {
		for (int i = 0; i <= N + 1; i++)
			for (int j = 0; j < 2; j++)
				if (worriors_in_city[i][j] && worriors_in_city[i][j]->Name[0] == 'l' &&
					!((lion*)worriors_in_city[i][j])->zhongchengdu) {
					cout << setfill('0') << setw(3) << time << ":05 " << head_name[j]
						<< " lion " << worriors_in_city[i][j]->Number
						<< " ran away" << endl;
					free_worriors(worriors_in_city[i][j]);
					worriors_in_city[i][j] = NULL;
				}
	}
	void do10(int time) {
		for (int i = 0; i <= N + 1; i++) {
			if (i > 0 && worriors_in_city[i - 1][0]) {
				if (i <= N) {
					worriors_in_city[i - 1][0]->qianjin(head_name[0][0], N);
					cout << setfill('0') << setw(3) << time << ":10 red "
						<< worriors_in_city[i - 1][0]->Name << ' ' << worriors_in_city[i - 1][0]->Number
						<< " marched to city " << worriors_in_city[i - 1][0]->city << " with "
						<< worriors_in_city[i - 1][0]->seimeichi << " elements and force "
						<< worriors_in_city[i - 1][0]->gongjili << endl;
				}
				else if (i = N + 1) {
					worriors_in_city[i - 1][0]->qianjin(head_name[0][0], N);
					cout << setfill('0') << setw(3) << time << ":10 red "
						<< worriors_in_city[i - 1][0]->Name << ' ' << worriors_in_city[i - 1][0]->Number
						<< " reached blue headquarter with " << worriors_in_city[i - 1][0]->seimeichi
						<< " elements and force " << worriors_in_city[i - 1][0]->gongjili << endl;
					if (!worriors_in_city[i][0]) {
						worriors_in_city[i][0] = worriors_in_city[i - 1][0];
						worriors_in_city[i - 1][0] = NULL;
					}
					else
					{
						free_worriors(worriors_in_city[N + 1][0]);
						free_worriors(worriors_in_city[N][0]);
						worriors_in_city[N + 1][0] = NULL;
						worriors_in_city[N][0] = NULL;
						cout << setfill('0') << setw(3) << time
							<< ":10 blue headquarter was taken" << endl;
						STOP = false;
					}
				}
			}
			if (i < N + 1 && worriors_in_city[i + 1][1]) {
				if (i > 0) {
					worriors_in_city[i + 1][1]->qianjin(head_name[1][0], N);
					worriors_in_city[i][1] = worriors_in_city[i + 1][1];
					worriors_in_city[i + 1][1] = NULL;
					cout << setfill('0') << setw(3) << time << ":10 blue "
						<< worriors_in_city[i][1]->Name << ' ' << worriors_in_city[i][1]->Number
						<< " marched to city " << worriors_in_city[i][1]->city << " with "
						<< worriors_in_city[i][1]->seimeichi << " elements and force "
						<< worriors_in_city[i][1]->gongjili << endl;
				}
				else if (!i) {
					worriors_in_city[i + 1][1]->qianjin(head_name[1][0], N);
					cout << setfill('0') << setw(3) << time << ":10 blue "
						<< worriors_in_city[i + 1][1]->Name << ' ' << worriors_in_city[i + 1][1]->Number
						<< " reached red headquarter with " << worriors_in_city[i + 1][1]->seimeichi
						<< " elements and force " << worriors_in_city[i + 1][1]->gongjili << endl;
					if (!worriors_in_city[i][1]) {
						worriors_in_city[i][1] = worriors_in_city[i + 1][1];
						worriors_in_city[i + 1][1] = NULL;
					}
					else
					{
						free_worriors(worriors_in_city[0][1]);
						free_worriors(worriors_in_city[1][1]);
						worriors_in_city[0][1] = NULL;
						worriors_in_city[1][1] = NULL;
						cout << setfill('0') << setw(3) << time
							<< ":10 red headquarter was taken" << endl;
						STOP = false;
					}
				}
			}
		}
		for (int i = N; i > 0; i--)
			if (worriors_in_city[i - 1][0]) {
				worriors_in_city[i][0] = worriors_in_city[i - 1][0];
				worriors_in_city[i - 1][0] = NULL;
			}
	}
	void do20() {
		for (int i = 1; i <= N; i++) {
			seimeigen_in_city[i] += 10;
		}
	}
	void do30(headquarter*blue, int time) {
		for (int i = 1; i <= N; i++)
			if (worriors_in_city[i][0] != NULL && worriors_in_city[i][1] == NULL) {
				seimeigen += seimeigen_in_city[i];
				cout << setfill('0') << setw(3) << time << ":30 red "
					<< worriors_in_city[i][0]->Name << ' ' << worriors_in_city[i][0]->Number
					<< " earned " << seimeigen_in_city[i]
					<< " elements for his headquarter" << endl;
				seimeigen_in_city[i] = 0;
			}
			else if (worriors_in_city[i][0] == NULL && worriors_in_city[i][1] != NULL) {
				blue->seimeigen += seimeigen_in_city[i];
				cout << setfill('0') << setw(3) << time << ":30 blue "
					<< worriors_in_city[i][1]->Name << ' ' << worriors_in_city[i][1]->Number
					<< " earned " << seimeigen_in_city[i]
					<< " elements for his headquarter" << endl;
				seimeigen_in_city[i] = 0;
			}
	}
	void do35(int time) {
		for (int i = 1; i <= N; i++) {//思路,自西向東一個一個來
			if (worriors_in_city[i][0] && if_worrior_with_arrow(worriors_in_city[i][0])) {
				if (worriors_in_city[i + 1][1]) {
					worriors_in_city[i + 1][1]->Hurted(R);
					worrior_arrow(worriors_in_city[i][0])->cishu--;
					if (worrior_arrow(worriors_in_city[i][0])->cishu == 0)
						free_weapon(worriors_in_city[i][0], 2);
					cout << setfill('0') << setw(3) << time << ":35 red "
						<< worriors_in_city[i][0]->Name << ' ' << worriors_in_city[i][0]->Number
						<< " shot";
					if (worriors_in_city[i + 1][1]->seimeichi == 0)
						cout << " and killed blue " << worriors_in_city[i + 1][1]->Name << ' ' << worriors_in_city[i + 1][1]->Number;
					cout << endl;
				}
			}
			if (worriors_in_city[i][1] && if_worrior_with_arrow(worriors_in_city[i][1])) {
				if (worriors_in_city[i - 1][0]) {
					worriors_in_city[i - 1][0]->Hurted(R);
					worrior_arrow(worriors_in_city[i][1])->cishu--;
					if (worrior_arrow(worriors_in_city[i][1])->cishu == 0)
						free_weapon(worriors_in_city[i][1], 2);
					cout << setfill('0') << setw(3) << time << ":35 blue "
						<< worriors_in_city[i][1]->Name << ' ' << worriors_in_city[i][1]->Number
						<< " shot";
					if (worriors_in_city[i - 1][0]->seimeichi == 0)
						cout << " and killed red " << worriors_in_city[i - 1][0]->Name << ' ' << worriors_in_city[i - 1][0]->Number;
					cout << endl;
				}
			}
		}
	}
	bool korosarerunoka(int i, int x_, int y_, int x_seimeichi, int y_seimeichi, char name) {
		int x, gongjili = 0;
		switch (chengshi[i])
		{
		case 'r':
		case '0':
			x = 0;
			break;
		case 'b':
		case '1':
			x = 1;
			break;
		default:if (i % 2) x = 0;
				else  x = 1;
				break;
		}
		if (x != x_) {
			gongjili = worriors_in_city[i][y_]->gongjili;
			if (if_worrior_with_sword(worriors_in_city[i][y_]))gongjili += worrior_sword(worriors_in_city[i][y_])->gongjili;
		}
		else if (name != 'n' && !korosarerunoka(i, y_, x_, y_seimeichi, 0, 0)) {//(沒寫)可能自己先打死了他
			gongjili = worriors_in_city[i][y_]->gongjili / 2;
			if (if_worrior_with_sword(worriors_in_city[i][y_]))gongjili += worrior_sword(worriors_in_city[i][y_])->gongjili;
		}
		if (gongjili >= x_seimeichi)return 1;
		else return 0;
	}
	void do38(int time) {//bomb之後的武士直接free掉,不參與40min的戰鬥
		for (int i = 1; i <= N; i++)
			for (int x = 0, y = 1; x < 2; x++, y--)
			{
				if (worriors_in_city[i][x] && worriors_in_city[i][x]->seimeichi && if_worrior_with_bomb(worriors_in_city[i][x]) && worriors_in_city[i][y] && worriors_in_city[i][y]->seimeichi)
					if (korosarerunoka(i, x, y, worriors_in_city[i][x]->seimeichi, worriors_in_city[i][y]->seimeichi, worriors_in_city[i][y]->Name[0])) {
						cout << setfill('0') << setw(3) << time << ":38 " << head_name[x] << ' '
							<< worriors_in_city[i][x]->Name << ' ' << worriors_in_city[i][x]->Number
							<< " used a bomb and killed " << head_name[y] << ' ' << worriors_in_city[i][y]->Name << ' ' << worriors_in_city[i][y]->Number << endl;
						free_worriors(worriors_in_city[i][x]);
						free_worriors(worriors_in_city[i][y]);
						worriors_in_city[i][x] = NULL;
						worriors_in_city[i][y] = NULL;
					}
			}
	}
	void weapon_NULL(worriors*worrior) {
		switch (worrior->Name[0])
		{
		case'd':
			if (((dragon*)worrior)->a)((dragon*)worrior)->a = NULL;
			break;
		case'n':
			if (((ninja*)worrior)->a)(((ninja*)worrior)->a) = NULL;
			if (((ninja*)worrior)->b)(((ninja*)worrior)->b) = NULL;
			break;
		case'i':
			if (((iceman*)worrior)->a)(((iceman*)worrior)->a) = NULL;
			break;
		case'w':
			if (((wolf*)worrior)->a)(((wolf*)worrior)->a) = NULL;
			if (((wolf*)worrior)->b)(((wolf*)worrior)->b) = NULL;
			if (((wolf*)worrior)->c)(((wolf*)worrior)->c) = NULL;
			break;
		default:
			break;
		}
	}
	void do40(headquarter*blue, int time) {
		for (int i = 1; i <= N; i++) {
			if (worriors_in_city[i][0] && worriors_in_city[i][1] && (worriors_in_city[i][0]->seimeichi || worriors_in_city[i][1]->seimeichi)) {
				int x, y;
				switch (chengshi[i])
				{
				case 'r':
				case '0':
					x = 0;
					y = 1;
					break;
				case 'b':
				case '1':
					x = 1;
					y = 0;
					break;
				default:if (i % 2) { x = 0; y = 1; }
						else { x = 1; y = 0; }
						break;
				}
				if (worriors_in_city[i][0]->seimeichi && worriors_in_city[i][1]->seimeichi)
				{
					int lion_seimeichi_x = 0, lion_seimeichi_y = 0;
					if (worriors_in_city[i][x]->Name[0] == 'l')lion_seimeichi_x = worriors_in_city[i][x]->seimeichi;
					if (worriors_in_city[i][y]->Name[0] == 'l')lion_seimeichi_y = worriors_in_city[i][y]->seimeichi;
					worriors_in_city[i][x]->Attact(worriors_in_city[i][y]);
					cout << setfill('0') << setw(3) << time << ":40 " << head_name[x] << ' '
						<< worriors_in_city[i][x]->Name << ' ' << worriors_in_city[i][x]->Number
						<< " attacked " << head_name[y] << ' ' << worriors_in_city[i][y]->Name << ' ' << worriors_in_city[i][y]->Number
						<< " in city " << i << " with " << worriors_in_city[i][x]->seimeichi << " elements and force " << worriors_in_city[i][x]->gongjili << endl;
					if (worriors_in_city[i][y]->seimeichi > 0 && worriors_in_city[i][y]->Name[0] != 'n')
					{
						worriors_in_city[i][y]->Fightback(worriors_in_city[i][x]);
						cout << setfill('0') << setw(3) << time << ":40 " << head_name[y] << ' '
							<< worriors_in_city[i][y]->Name << ' ' << worriors_in_city[i][y]->Number
							<< " fought back against " << head_name[x] << ' ' << worriors_in_city[i][x]->Name << ' ' << worriors_in_city[i][x]->Number
							<< " in city " << i << endl;
					}
					if (!worriors_in_city[i][y]->seimeichi) {
						cout << setfill('0') << setw(3) << time << ":40 " << head_name[y] << ' '
							<< worriors_in_city[i][y]->Name << ' ' << worriors_in_city[i][y]->Number
							<< " was killed in city " << i << endl;
						if (worriors_in_city[i][y]->Name[0] == 'l')
							worriors_in_city[i][x]->seimeichi += lion_seimeichi_y;
					}
					else if (!worriors_in_city[i][x]->seimeichi) {
						cout << setfill('0') << setw(3) << time << ":40 " << head_name[x] << ' '
							<< worriors_in_city[i][x]->Name << ' ' << worriors_in_city[i][x]->Number
							<< " was killed in city " << i << endl;
						if (worriors_in_city[i][x]->Name[0] == 'l')
							worriors_in_city[i][y]->seimeichi += lion_seimeichi_x;
					}
				}
				if (worriors_in_city[i][x]->Name[0] == 'd'&&worriors_in_city[i][x]->seimeichi) //dragon主動攻擊后改變士氣值與歡呼
				{
					if (worriors_in_city[i][y]->seimeichi)
						((dragon*)worriors_in_city[i][x])->shiqi -= (float)0.2;
					else((dragon*)worriors_in_city[i][x])->shiqi += (float)0.2;
					if (((dragon*)worriors_in_city[i][x])->shiqi > 0.8)
						((dragon*)worriors_in_city[i][x])->yell(time, head_name[x]);
				}
				if (worriors_in_city[i][0]->seimeichi && !worriors_in_city[i][1]->seimeichi)//把x變成獲勝一方的數字
				{
					x = 0;
					y = 1;
				}
				else if (!worriors_in_city[i][0]->seimeichi && worriors_in_city[i][1]->seimeichi)
				{
					x = 1;
					y = 0;
				}
				else x = y = -1;
				if (x == 0 && seimeigen >= 8) {//(沒寫)如果司令部的生命元不足以奖励所有的武士,则优先奖励距离敌方司令部近的武士。(紅方的bug)
					seimeigen -= 8;
					worriors_in_city[i][0]->seimeichi += 8;
				}
				else if (x == 1 && blue->seimeigen >= 8) {
					blue->seimeigen -= 8;
					worriors_in_city[i][1]->seimeichi += 8;
				}
				if (x >= 0 && worriors_in_city[i][x]->Name[0] == 'w')//wolf繳獲武器
				{
					if (!((wolf*)worriors_in_city[i][x])->a&&if_worrior_with_arrow(worriors_in_city[i][y]))
						((wolf*)worriors_in_city[i][x])->a = worrior_arrow(worriors_in_city[i][y]);
					if (!((wolf*)worriors_in_city[i][x])->b&&if_worrior_with_bomb(worriors_in_city[i][y]))
						((wolf*)worriors_in_city[i][x])->b = worrior_bomb(worriors_in_city[i][y]);
					if (!((wolf*)worriors_in_city[i][x])->c&&if_worrior_with_sword(worriors_in_city[i][y]))
						((wolf*)worriors_in_city[i][x])->c = worrior_sword(worriors_in_city[i][y]);
					weapon_NULL(worriors_in_city[i][y]);
				}
				if (x >= 0)//武士获取生命元
				{
					if (x)blue->seimeigen += seimeigen_in_city[i];
					else seimeigen += seimeigen_in_city[i];
					cout << setfill('0') << setw(3) << time << ":40 " << head_name[x] << ' '
						<< worriors_in_city[i][x]->Name << ' ' << worriors_in_city[i][x]->Number
						<< " earned " << seimeigen_in_city[i] << " elements for his headquarter" << endl;
					seimeigen_in_city[i] = 0;
				}
				switch (x)//處理旗幟
				{
				case -1:
					switch (chengshi[i])
					{
					case 'x':
					case 'y':
						chengshi[i] = 'w';
						break;
					case '0':
						chengshi[i] = 'r';
						break;
					case '1':
						chengshi[i] = 'b';
						break;
					default:
						break;
					}
					break;
				case 0:
					switch (chengshi[i])
					{
					case 'b':
						chengshi[i] = '1';
						break;
					case 'w':
					case 'y':
						chengshi[i] = 'x';
						break;
					case '0':
						chengshi[i] = 'r';
						break;
					case '1':
					case 'x':
						chengshi[i] = 'r';
						cout << setfill('0') << setw(3) << time << ":40 red flag raised in city " << i << endl;
						break;
					default:
						break;
					}
					break;
				case 1:
					switch (chengshi[i])
					{
					case 'r':
						chengshi[i] = '0';
						break;
					case 'w':
					case 'x':
						chengshi[i] = 'y';
						break;
					case '1':
						chengshi[i] = 'b';
						break;
					case 'y':
					case '0':
						chengshi[i] = 'b';
						cout << setfill('0') << setw(3) << time << ":40 blue flag raised in city " << i << endl;
						break;
					default:
						break;
					}
					break;
				default:
					break;
				}
			}
			if (worriors_in_city[i][0] && !worriors_in_city[i][0]->seimeichi) {
				free_worriors(worriors_in_city[i][0]);
				worriors_in_city[i][0] = NULL;
			}
			if (worriors_in_city[i][1] && !worriors_in_city[i][1]->seimeichi) {
				free_worriors(worriors_in_city[i][1]);
				worriors_in_city[i][1] = NULL;
			}
		}
	}
	void do50(headquarter*blue, int time) {
		cout << setfill('0') << setw(3) << time << ":50 " << seimeigen << " elements in red headquarter" << endl;
		cout << setfill('0') << setw(3) << time << ":50 " << blue->seimeigen << " elements in blue headquarter" << endl;
	}
	void do55(int time) {
		for (int x = 0; x < 2; x++)
			for (int i = 0; i <= N + 1; i++)
				if (worriors_in_city[i][x])
				{
					cout << setfill('0') << setw(3) << time << ":55 " << head_name[x] << ' '
						<< worriors_in_city[i][x]->Name << ' ' << worriors_in_city[i][x]->Number << " has ";
					switch (worriors_in_city[i][x]->Name[0])
					{
					case'd':
						if (((dragon*)worriors_in_city[i][x])->a)
							switch (((dragon*)worriors_in_city[i][x])->a->Num)
							{
							case 0:cout << "sword(" << ((sword*)((dragon*)worriors_in_city[i][x])->a)->gongjili << ')' << endl; break;
							case 1:cout << "bomb" << endl; break;
							case 2:cout << "arrow(" << ((arrow*)((dragon*)worriors_in_city[i][x])->a)->cishu << ')' << endl; break;
							default:
								break;
							}
						else cout << "no weapon" << endl;
						break;
					case'i':
						if (((iceman*)worriors_in_city[i][x])->a)
							switch (((iceman*)worriors_in_city[i][x])->a->Num)
							{
							case 0:cout << "sword(" << ((sword*)((iceman*)worriors_in_city[i][x])->a)->gongjili << ')' << endl; break;
							case 1:cout << "bomb" << endl; break;
							case 2:cout << "arrow(" << ((arrow*)((iceman*)worriors_in_city[i][x])->a)->cishu << ')' << endl; break;
							default:
								break;
							}
						else cout << "no weapon" << endl;
						break;
					case'n':
					case'w':
						if (if_worrior_with_arrow(worriors_in_city[i][x])) {
							cout << "arrow(" << (worrior_arrow(worriors_in_city[i][x]))->cishu << ')';
							if (if_worrior_with_bomb(worriors_in_city[i][x])) {
								cout << ",bomb";
								if (if_worrior_with_sword(worriors_in_city[i][x]))
									cout << ",sword(" << (worrior_sword(worriors_in_city[i][x]))->gongjili << ')';
							}
							else if (if_worrior_with_sword(worriors_in_city[i][x]))
								cout << ",sword(" << (worrior_sword(worriors_in_city[i][x]))->gongjili << ')';
						}
						else {
							if (if_worrior_with_bomb(worriors_in_city[i][x])) {
								cout << "bomb";
								if (if_worrior_with_sword(worriors_in_city[i][x]))
									cout << ",sword(" << (worrior_sword(worriors_in_city[i][x]))->gongjili << ')';
							}
							else if (if_worrior_with_sword(worriors_in_city[i][x]))
								cout << "sword(" << (worrior_sword(worriors_in_city[i][x]))->gongjili << ')';
							else cout << "no weapon";
						}
						cout << endl;
						break;
					default:cout << "no weapon" << endl;
						break;
					}
				}
	}
};
string headquarter::head_name[2] = { "red", "blue" };
int main() {
	int suikai, konkai;
	cin >> suikai;
	for (konkai = 0; konkai < suikai; konkai++)
	{
		int M, N, R, K, T, s_dragon, s_ninja, s_iceman, s_lion, s_wolf,
			g_dragon, g_ninja, g_iceman, g_lion, g_wolf;//分別定義生命值和攻擊力
		int time = 0;
		cout << "Case " << konkai + 1 << ':' << endl;
		cin >> M >> N >> R >> K >> T;
		cin >> s_dragon >> s_ninja >> s_iceman >> s_lion >> s_wolf;
		cin >> g_dragon >> g_ninja >> g_iceman >> g_lion >> g_wolf;
		string red_wushi[] = { "iceman","lion","wolf","ninja", "dragon" },
			blue_wushi[] = { "lion","dragon","ninja","iceman","wolf" };
		int red_strength[] = { s_iceman, s_lion ,s_wolf, s_ninja,s_dragon },
			blue_strength[] = { s_lion, s_dragon, s_ninja, s_iceman, s_wolf };
		int red_gongjili[] = { g_iceman, g_lion ,g_wolf, g_ninja,g_dragon },
			blue_gongjili[] = { g_lion, g_dragon, g_ninja, g_iceman, g_wolf };
		headquarter red("red", M, red_wushi, red_strength, red_gongjili, R, K, N),
			blue("blue", M, blue_wushi, blue_strength, blue_gongjili, R, K, N);
		while (time + 60 <= T && STOP) {
			red.make(time / 60, &red);
			blue.make(time / 60, &red);
			red.do05(time / 60);
			red.do10(time / 60);
			if (!STOP)break;
			red.do20();
			red.do30(&blue, time / 60);
			red.do35(time / 60);
			red.do38(time / 60);
			red.do40(&blue, time / 60);
			red.do50(&blue, time / 60);
			red.do55(time / 60);
			time += 60;
		}
		while (time <= T && STOP) {
			red.make(time / 60, &red);
			blue.make(time / 60, &red);
			time += 5;
			if (time <= T)red.do05(time / 60);
			else break;
			time += 5;
			if (time <= T)red.do10(time / 60);
			else break;
			if (!STOP)break;
			time += 10;
			if (time <= T)red.do20();
			else break;
			time += 10;
			if (time <= T)red.do30(&blue, time / 60);
			else break;
			time += 5;
			if (time <= T)red.do35(time / 60);
			else break;
			time += 3;
			if (time <= T)red.do38(time / 60);
			else break;
			time += 2;
			if (time <= T)red.do40(&blue, time / 60);
			else break;
			time += 10;
			if (time <= T)red.do50(&blue, time / 60);
			else break;
			time += 5;
			if (time <= T)red.do55(time / 60);
		}
		STOP = true;
	}
	return 0;
}
问题描述 魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部。两个司令部之间是依次排列的若干城市,城市从西向东依次编号为1,2,3 …. N ( N <= 20 )。红魔军的司令部算作编号为0的城市,蓝魔军的司令部算作编号为N+1的城市。司令部有生命元,用于制造武士。 两军的司令部都会制造武士。武士一共有 dragon 、ninja、iceman、lion、wolf 五种。每种武士都有编号、生命值、攻击力这三种属性。 双方的武士编号都是从1开始计算。红方制造出来的第 n 个武士,编号就是n。同样,蓝方制造出来的第 n 个武士,编号也是n。 武士在刚降生的时候有一个初始的生命值,生命值在战斗中会发生变化,如果生命值减少到0(生命值变为负数时应当做变为0处理),则武士死亡(消失)。 有的武士可以拥有武器。武器有三种,sword, bomb,和arrow,编号分别为0,1,2。 武士降生后就朝对方司令部走,在经过的城市如果遇到敌人(同一时刻每个城市最多只可能有1个蓝武士和一个红武士),就会发生战斗。每次战斗只有一方发起主动进攻一次。被攻击者生命值会减去进攻者的攻击力值和进攻者手中sword的攻击力值。被进攻者若没死,就会发起反击,被反击者的生命值要减去反击者攻击力值的一半(去尾取整)和反击者手中sword的攻击力值。反击可能致敌人于死地。 如果武士在战斗中杀死敌人(不论是主动进攻杀死还是反击杀死),则其司令部会立即向其发送8个生命元作为奖励,使其生命值增加8。当然前提是司令部得有8个生命元。如果司令部的生命元不足以奖励所有的武士,则优先奖励距离敌方司令部近的武士。 如果某武士在某城市的战斗中杀死了敌人,则该武士的司令部立即取得该城市中所有的生命元。注意,司令部总是先完成全部奖励工作,然后才开始从各个打了胜仗的城市回收生命元。对于因司令部生命元不足而领不到奖励的武士,司令部也不会在取得战利品生命元后为其补发奖励。 如果一次战斗的结果是双方都幸存(平局),则双方都不能拿走发生战斗的城市的生命元。 城市可以插旗子,一开始所有城市都没有旗子。在插红旗的城市,以及编号为奇数的无旗城市,由红武士主动发起进攻。在插蓝旗的城市,以及编号为偶数的无旗城市,由蓝武士主动发起进攻。 当某个城市有连续两场战斗都是同一方的武士杀死敌人(两场战斗之间如果有若干个战斗时刻并没有发生战斗,则这两场战斗仍然算是连续的;但如果中间有平局的战斗,就不算连续了) ,那么该城市就会插上胜方的旗帜,若原来插着败方的旗帜,则败方旗帜落下。旗帜一旦插上,就一直插着,直到被敌人更换。一个城市最多只能插一面旗帜,旗帜没被敌人更换前,也不会再次插同颜色的旗。 各种武器有其特点: sword武器的初始攻击力为拥有它的武士的攻击力的20%(去尾取整)。但是sword每经过一次战斗(不论是主动攻击还是反击),就会变钝,攻击力变为本次战斗前的80% (去尾取整)。sword攻击力变为0时,视为武士失去了sword。如果武士降生时得到了一个初始攻击力为0的sword,则视为武士没有sword. arrow有一个攻击力值R。如果下一步要走到的城市有敌人,那么拥有arrow的武士就会放箭攻击下一个城市的敌人(不能攻击对方司令部里的敌人)而不被还击。arrow使敌人的生命值减少R,若减至小于等于0,则敌人被杀死。arrow使用3次后即被耗尽,武士失去arrow。两个相邻的武士可能同时放箭把对方射死。 拥有bomb的武士,在战斗开始前如果判断自己将被杀死(不论主动攻击敌人,或者被敌人主动攻击都可能导致自己被杀死,而且假设武士可以知道敌人的攻击力和生命值),那么就会使用bomb和敌人同归于尽。武士不预测对方是否会使用bomb。 武士使用bomb和敌人同归于尽的情况下,不算是一场战斗,双方都不能拿走城市的生命元,也不影响城市的旗帜。 不同的武士有不同的特点。 dragon可以拥有一件武器。编号为n的dragon降生时即获得编号为 n%3 的武器。dragon还有“士气”这个属性,是个浮点数,其值为它降生后其司令部剩余生命元的数量除以造dragon所需的生命元数量。dragon 在一次在它主动进攻的战斗结束后,如果还没有战死,而且士气值大于0.8,就会欢呼。dragon每取得一次战斗的胜利(敌人被杀死),士气就会增加0.2,每经历一次未能获胜的战斗,士气值就会减少0.2。士气增减发生在欢呼之前。 ninjia可以拥有两件武器。编号为n的ninjia降生时即获得编号为 n%3 和 (n+1)%3的武器。ninja 挨打了也从不反击敌人。 iceman有一件武器。编号为n的iceman降生时即获得编号为 n%3 的武器。iceman 每前进两步,在第2步完成的时候,生命值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值