cousera of pku:魔兽世界:终极版

做这个终极版的题目,花了大概3个礼拜的时间。做完之后,感觉立刻轻松了很多,也学到了很多。这是我第一个写的差不多2000行的程序,当然也有比较大的满足感。
首先,先说下这个题目的注意事项。
1.这个题目是魔兽世界系列题目最复杂的一题,理论上是可以通过前面的装备和备战进行扩充的。但实际上,由于我们这些新手能力用限,刚开始写出来的装备和备战程序的可扩充性不强。所以我强烈建议,等做到这道题的时候,重新编写代码。
2.这道题对里面士兵的操作过程有非常严格的要求,所以写之前,要好好理解题目的意思。
3.武器,士兵,司令部以及城市之间的关系要搞明白,能恰当用程序进行描述。
4.调试这道题的程序是一个很复杂的过程,可以借用网上正确的程序,输入同样的数据,比较输出的异同点。
5.每个时间要输出什么,要进行什么操作,这个题目都描述清楚了,要按题目的要求编写动作和输出。
6.一个调试小窍门:这个程序的输出数据总的有4W多条,所以得用文本比较器进行比较,网上有很多。因为输出数据的界面有限,所以我们一次性只能得到差不多8000条数据。所以我们得直接利用程序生产输出数据的文本来进行比较,这是一件非常省事的方法。生成输出数据的程序如下:
#include <fstream>
using namespace std;
//题目的程序;
int main() {
ofstream outfile("out.txt");
streambuf *streams = cout.rdbuf();//保存原来的cout对象
cout.rdbuf(outfile.rdbuf());
       //属于main函数的题目程序;
cout.rdbuf(streams);
return 0;

}

这样就可以得到输出数据的文本。
本人也是初学编程,所以用了接近2000行的程序才描述清楚这个题目。网上还有其他高手用了仅仅600多行就写出来了。

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<string>
using namespace std;
class army;
class weapon;
class city;
int Num, flag1 = 0, flag2 = 0,t=0,minu=0;
int K,R;
class soldier {
friend class army;
    friend class weapon;
public:
int devote;
static int no1,no2;//no1表示红军杀死的人数,no2表示蓝军杀死的人数。
bool can_delete;
bool kill_;
bool remv;
city *pcity;
int weapon_num;
weapon *pweapon[3];
int sort_nm;//0代表dragon 、1代表ninja、2代表iceman、3代表lion、4代表wolf
int power;
static int powerary[5];
int lifev;
int num;//编号
army *parmy;
int position;
void init();
bool escape;
static string names[5];
static int lifevalue[5];
void remove(army *p) {};
soldier(army *p, int to_num, int sort,int N);
virtual void printing(int tm);
virtual void attack(soldier *p) {};
virtual void hurted(int npower,soldier *p) {};
virtual void fightback(soldier *p) {};
virtual ~soldier();



};
class dragon : public soldier {
public:

    
double brave;
dragon(army *p, int to_num, int sort, int N);
void printing(int tm);
void attack(soldier *p);
void hurted(int npower, soldier *p);
void fightback(soldier *p);


};
class ninja : public soldier {
public:


ninja(army *p, int to_num, int sort, int N);
void printing(int tm);
void attack(soldier *p);
void hurted(int npower, soldier *p);
void fightback(soldier *p);

};
class iceman : public soldier {
public:


iceman(army *p, int to_num, int sort, int N);
void printing(int tm);
void attack(soldier *p);
void hurted(int npower, soldier *p);
void fightback(soldier *p);

};
class lion : public soldier {
public:

lion(army *p, int to_num, int sort, int N);
void printing(int tm);
void attack(soldier *p);
void hurted(int npower, soldier *p);
void fightback(soldier *p);
};
class wolf : public soldier {
public:
int n;
int wep_sort[3];
wolf(army *p, int to_num, int sort, int N);
void printing(int tm);
void attack(soldier *p);
void hurted(int npower, soldier *p);
void fightback(soldier *p);

};
class weapon {
public:
int power;
int fight_num;
int kind_no1;//0为sword,1为bomb,2为arrow.
soldier *psoldier;
bool exist;
static string name[3];
weapon(soldier *p) {
psoldier = p;

}
virtual void update(){}
virtual void check() {}
};
class sword :public weapon {
public:


sword(soldier *p) :weapon(p) {
power = int((p->power)*0.2);
fight_num = 0;
kind_no1 = 0;
if (power > 0)
exist = 1;
else
exist = 0;


}

void update() {
fight_num++;
power = power*0.8;
}
void check() {
if (power <=0)
exist = 0;
else 
exist = 1;
}
};
class bomb :public weapon {
public:
bomb(soldier *p) :weapon(p) {
kind_no1 = 1;
exist = 1;
fight_num = 0;
}
void update() {
fight_num++;
}
void check() {
if (fight_num==1)
exist = 0;
else
exist = 1;
}
};
class arrow :public weapon {
public:

arrow(soldier *p) :weapon(p) {
kind_no1 = 2;
fight_num = 0;
exist = 1;
power = R;
}
void update() {
fight_num++;
}
void check() {
if (fight_num >=3)
exist = 0;
else
exist = 1;
}


};
class city {
public:
int a[2];//0为红,1为蓝
int num;//城市编号
int color;//所属阵营,0为红,1为蓝,2为无
int life;
soldier *psoldier[2];//0为红,1为蓝
city(){
psoldier[0] = NULL;
psoldier[1] = NULL;
a[0] = 0;
a[1] = 0;
color=2;
life = 0;
num = 100;
}
void initial() {
psoldier[0] = NULL;
psoldier[1] = NULL;
a[0] = 0;
a[1] = 0;
color = 2;
life = 0;
}
void init(int i);
void produce_life() {
life += 10;
}
void printing();
void supply_life();
void battle();
void shoot();
void judge();
void printing_red();
void printing_blue();
} ct[100];


class army {
public:
int color;//0为红,1为蓝
soldier *psoldier[1000];
int total_life;
int total_num;
int order_index;
bool stop;
friend class soldier;
int soldier1[5];
static int pro_order[2][5];
army(int c_o, int M) {
color = c_o;
total_num = 0;
total_life = M;
order_index = 0;
stop = 0;
for (int i = 0; i < 5; i++) {
soldier1[i] = 0;
}
for (int i = 0; i < 1000; i++) {
psoldier[i] = NULL;
}
}
void remove();
void shoot();
void produce(int tm,int N);
string getcolor();
~army() {
for (int i = 0; i < total_num; i++)

delete psoldier[i];

}
void printing(){
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << total_life << " elements in " << getcolor() << " headquarter" << endl;
}
};




soldier::soldier(army *p, int to_num, int sort,int N) {

kill_ = 0;
can_delete = 0;
remv = 0;
parmy = p;
num = to_num;
sort_nm = sort;
if (parmy->color == 0)
position = 0;
else
position = N + 1;
pcity = NULL;
for (int i = 0; i < 3; i++) {
pweapon[i] = NULL;
}
}
void soldier::printing(int tm) {}
void soldier::init(){
if (can_delete == 0) {
kill_ = 0;


}
}
soldier::~soldier() {
for (int i = 0; i < 3; i++)
if (pweapon[i] != NULL) {
delete pweapon[i];
}
}




dragon::dragon(army *p, int to_num, int sort, int N) :soldier(p, to_num, sort,N) {
lifev = lifevalue[0];
power = powerary[0];
switch (num % 3) {
case 0:pweapon[0] = new sword(this); break;
case 1:pweapon[0] = new bomb(this); break;
case 2:pweapon[0] = new arrow(this); break;


}
weapon_num = 1;
brave = double(parmy->total_life) / double(lifevalue[sort_nm]);
escape = 0;
}
void dragon:: printing(int tm) {
string color = parmy->getcolor();
cout << setw(3) << setfill('0') << tm << ":";
cout<< setw(2) <<minu<< " ";
cout << color << " " << "dragon" << " " << num << " born" << endl;
cout <<setprecision(2)<<fixed<< "Its morale is " <<brave<< endl;
}
void dragon::attack(soldier *p) {
if (p->can_delete == 0) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << this->parmy->getcolor() << " dragon " << num << " attacked " << p->parmy->getcolor() << " " << soldier::names[p->sort_nm];
cout << " " << p->num << " in city " << this->position << " with " << this->lifev << " elements and force " << this->power << endl;
p->hurted(power, this);
}
if (p->lifev <= 0||p->can_delete==1){
kill_ = 1;

if (this->parmy->color == 0)
no1++;
else                                            
no2++;

if (lifev > 0) {
brave += 0.2;
if (brave > 0.8 && ((this->parmy->color == 0 && ((this->pcity->num % 2 == 1 && this->pcity->color != 1) || this->pcity->color == 0)) || (this->parmy->color == 1 && ((this->pcity->num % 2 == 0 && this->pcity->color != 0) || this->pcity->color == 1)))) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << this->parmy->getcolor() << " dragon " << this->num << " yelled in city " << this->position << endl;
}
if (this->pcity->life > 0) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << this->parmy->getcolor() << " dragon " << num << " earned " << this->pcity->life << " elements for his headquarter" << endl;
}
}

}
else {
p->fightback(this);
if (lifev>0) {
brave -= 0.2;
if (brave > 0.8 && ((this->parmy->color == 0 && ((this->pcity->num % 2 == 1 && this->pcity->color != 1) || this->pcity->color == 0)) || (this->parmy->color == 1 && ((this->pcity->num % 2 == 0 && this->pcity->color != 0) || this->pcity->color == 1)))) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << this->parmy->getcolor() << " dragon " << this->num << " yelled in city " << this->position << endl;
}
}
}
}
void dragon::hurted(int npower, soldier *p) {

lifev -= npower;
for (int i = 0; i < 3; i++) {
if (p->pweapon[i]!=NULL&&p->pweapon[i]->kind_no1 == 0&& p->pweapon[i] ->exist==1) {
lifev -= p->pweapon[i]->power;
p->pweapon[i]->update();
break;
}
}
if (lifev > 0) {

}
else {
this->pcity->a[this->parmy->color] = 0;

cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << this->parmy->getcolor() << " dragon " << num << " was killed in city " << this->position << endl;
this->can_delete=1;

}
}
void dragon::fightback(soldier *p) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << this->parmy->getcolor() << " dragon " << num << " fought back against " << p->parmy->getcolor() << " " << soldier::names[p->sort_nm] << " " << p->num << " in city " << this->position << endl;
p->hurted(power /2,this);
if (p->lifev <= 0) {
kill_ = 1;
brave += 0.2;
if (this->parmy->color == 0)
no1++;
else
no2++;


if (this->pcity->life > 0) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << this->parmy->getcolor() << " dragon " << num << " earned " << this->pcity->life << " elements for his headquarter" << endl;
}


}
else
{
brave -= 0.2;
}
}






ninja::ninja(army *p, int to_num, int sort, int N) :soldier(p, to_num, sort,N) {
lifev = lifevalue[1];
power = powerary[1];
weapon_num = 2;
escape = 0;
if (num % 3 < (num + 1) % 3) {
switch (num % 3) {
case 0:pweapon[0] = new sword(this); break;
case 1:pweapon[0] = new bomb(this); break;
case 2:pweapon[0] = new arrow(this); break;
}
switch ((num + 1) % 3) {
case 0:pweapon[1] = new sword(this); break;
case 1:pweapon[1] = new bomb(this); break;
case 2:pweapon[1] = new arrow(this); break;
}
}
else if (num % 3 > (num + 1) % 3) {
switch (num % 3) {
case 0:pweapon[1] = new sword(this); break;
case 1:pweapon[1] = new bomb(this); break;
case 2:pweapon[1] = new arrow(this); break;
}
switch ((num + 1) % 3) {
case 0:pweapon[0] = new sword(this); break;
case 1:pweapon[0] = new bomb(this); break;
case 2:pweapon[0] = new arrow(this); break;
}
}
}
void ninja:: printing(int tm) {
string color = parmy->getcolor();
cout << setw(3) << setfill('0') << tm << ":";
cout << setw(2) << minu << " ";
cout << color << " " << "ninja" << " " << num << " born" << endl;
}
void ninja::attack(soldier *p) {
if (p->can_delete == 0) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << this->parmy->getcolor() << " ninja " << num << " attacked " << p->parmy->getcolor() << " " << soldier::names[p->sort_nm];
cout << " " << p->num << " in city " << this->position << " with " << this->lifev << " elements and force " << this->power << endl;


p->hurted(power, this);
}
if (p->lifev <= 0 || p->can_delete == 1) {
kill_ = 1;

if (this->parmy->color == 0)
no1++;
else
no2++;

if (this->pcity->life > 0) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << this->parmy->getcolor() << " ninja " << num << " earned " << this->pcity->life << " elements for his headquarter" << endl;
}


}
else {
p->fightback(this);
}
}
void ninja::hurted(int npower, soldier *p) {
lifev -= npower;
for (int i = 0; i < 3; i++) {
if (p->pweapon[i] != NULL&&p->pweapon[i]->kind_no1 == 0 && p->pweapon[i]->exist == 1) {
lifev -= p->pweapon[i]->power;
p->pweapon[i]->update();
break;
}
}
if (lifev > 0) {

}
else {
this->pcity->a[this->parmy->color] = 0;

cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << this->parmy->getcolor() << " ninja " << num << " was killed in city " << this->position << endl;
this->can_delete = 1;
}
}
void  ninja::fightback(soldier *p) {}






iceman::iceman(army *p, int to_num, int sort, int N) :soldier(p, to_num, sort,N) {
power = powerary[2];
lifev = lifevalue[2];
weapon_num = 1;
escape = 0;
switch (num % 3) {
case 0:pweapon[0] = new sword(this); break;
case 1:pweapon[0] = new bomb(this); break;
case 2:pweapon[0] = new arrow(this); break;
}

}
void iceman:: printing(int tm) {
string color = parmy->getcolor();
cout << setw(3) << setfill('0') << tm << ":";
cout << setw(2) << minu << " ";
cout << color << " " << "iceman" << " " << num << " born" << endl;
}
void iceman::attack(soldier *p) {
if (p->can_delete == 0) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << this->parmy->getcolor() << " iceman " << num << " attacked " << p->parmy->getcolor() << " " << soldier::names[p->sort_nm];
cout << " " << p->num << " in city " << this->position << " with " << this->lifev << " elements and force " << this->power << endl;


p->hurted(power, this);
}
if (p->lifev <= 0 || p->can_delete == 1) {
kill_ = 1;

if (this->parmy->color == 0)
no1++;
else
no2++;

if (this->pcity->life > 0) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << this->parmy->getcolor() << " iceman " << num << " earned " << this->pcity->life << " elements for his headquarter" << endl;
}

}
else {
p->fightback(this);
}
}
void iceman::hurted(int npower, soldier *p) {
lifev -= npower;
for (int i = 0; i < 3; i++) {
if (p->pweapon[i] != NULL&&p->pweapon[i]->kind_no1 == 0 && p->pweapon[i]->exist == 1) {
lifev -= p->pweapon[i]->power;
p->pweapon[i]->update();
break;
}
}
if (lifev > 0) {

}
else {
this->pcity->a[this->parmy->color] = 0;

cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << this->parmy->getcolor() << " iceman " << num << " was killed in city " << this->position << endl;
this->can_delete = 1;
}
}
void iceman::fightback(soldier *p) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << this->parmy->getcolor() << " iceman " << num << " fought back against " << p->parmy->getcolor() << " " << soldier::names[p->sort_nm] << " " << p->num << " in city " << this->position << endl;


p->hurted(power / 2,this);
if (p->lifev <= 0) {
kill_ = 1;

if (this->parmy->color == 0)
no1++;
else
no2++;


if (this->pcity->life > 0) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << this->parmy->getcolor() << " iceman " << num << " earned " << this->pcity->life << " elements for his headquarter" << endl;


}


}
}




lion::lion(army *p, int to_num, int sort, int N) :soldier(p, to_num, sort,N) {
power = powerary[3];
lifev = lifevalue[3];
devote = p->total_life;
escape = 0;
weapon_num = 0;
}
void lion:: printing(int tm) {
string color = parmy->getcolor();
cout << setw(3) << setfill('0') << tm << ":";
cout << setw(2) << minu << " ";
cout << color << " " << "lion" << " " << num << " born" << endl;
cout << "Its loyalty is " << devote << endl;
}
void lion::attack(soldier *p) {
if (p->can_delete == 0) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << this->parmy->getcolor() << " lion " << num << " attacked " << p->parmy->getcolor() << " " << soldier::names[p->sort_nm];
cout << " " << p->num << " in city " << this->position << " with " << this->lifev << " elements and force " << this->power << endl;


p->hurted(power, this);
}
if (p->lifev <= 0 || p->can_delete == 1) {
kill_ = 1;

if (this->parmy->color == 0)
no1++;
else
no2++;

if (this->pcity->life > 0) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << this->parmy->getcolor() << " lion " << num << " earned " << this->pcity->life << " elements for his headquarter" << endl;


}


}
else {

p->fightback(this);
devote -= K;
if (devote <= 0) {

if (this->parmy->color == 0 && this->position != Num + 1 || this->parmy->color == 1 && this->position != 0) {
escape = 1;

}
}
}
}
void lion::hurted(int npower, soldier *p) {
int ori = lifev;
lifev -= npower;
for (int i = 0; i < 3; i++) {
if (p->pweapon[i] != NULL&&p->pweapon[i]->kind_no1 == 0 && p->pweapon[i]->exist == 1) {
lifev -= p->pweapon[i]->power;
p->pweapon[i]->update();
break;
}
}
if (lifev > 0) {

}
else {
this->pcity->a[this->parmy->color] = 0;

cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << this->parmy->getcolor() << " lion " << num << " was killed in city " << this->position << endl;


p->lifev +=ori;

this->can_delete = 1;
}
}
void lion::fightback(soldier *p) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << this->parmy->getcolor() << " lion " << num << " fought back against " << p->parmy->getcolor() << " " << soldier::names[p->sort_nm] << " " << p->num << " in city " << this->position << endl;


p->hurted(power / 2,this);
if (p->lifev <= 0) {
kill_ = 1;

if (this->parmy->color == 0)
no1++;
else
no2++;


if (this->pcity->life > 0) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << this->parmy->getcolor() << " lion " << num << " earned " << this->pcity->life << " elements for his headquarter" << endl;
}





}
else
{
devote -= K;
if (devote <= 0) {
if (this->parmy->color == 0 && this->position != Num + 1 || this->parmy->color == 1 && this->position != 0) {
escape = 1;

}

}

}
}




wolf::wolf(army *p, int to_num, int sort, int N) :soldier(p, to_num, sort,N) {
power = powerary[4];
lifev = lifevalue[4];
n = 0;
weapon_num = 0;
for (int i = 0; i < 3; i++) {
pweapon[i] = NULL;
}
for (int i = 0; i < 3; i++) {
wep_sort[i] = -1;
}
escape = 0;
}
void wolf:: printing(int tm) {
string color = parmy->getcolor();
cout << setw(3) << setfill('0') << tm << ":";
cout << setw(2) << minu << " ";
cout << color << " " << "wolf" << " " << num << " born" << endl;
}
void wolf::attack(soldier *p) {
if (p->can_delete == 0) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << this->parmy->getcolor() << " wolf " << num << " attacked " << p->parmy->getcolor() << " " << soldier::names[p->sort_nm];
cout << " " << p->num << " in city " << this->position << " with " << this->lifev << " elements and force " << this->power << endl;


p->hurted(power, this);
}
if (p->lifev <= 0 || p->can_delete == 1) {
for (int i = 0; i < 3; i++) {
if (pweapon[i] != NULL&&pweapon[i]->kind_no1 == 0 && pweapon[i]->exist == 1) {
wep_sort[i] = 0;
}
else if (pweapon[i] != NULL&&pweapon[i]->kind_no1 == 0 && pweapon[i]->exist == 0) {
wep_sort[i] = -1;
}
if (pweapon[i] != NULL&&pweapon[i]->kind_no1 == 1 && pweapon[i]->exist == 1) {
wep_sort[i] = 1;
}
else if (pweapon[i] != NULL&&pweapon[i]->kind_no1 == 1 && pweapon[i]->exist == 0) {
wep_sort[i] = -1;
}
if (pweapon[i] != NULL&&pweapon[i]->kind_no1 == 2 && pweapon[i]->exist == 1) {
wep_sort[i] = 2;
}
else if (pweapon[i] != NULL&&pweapon[i]->kind_no1 == 2 && pweapon[i]->exist == 0) {
wep_sort[i] = -1;
}
}

if (p->sort_nm == 0 || p->sort_nm == 2) {
int time = 0;
for (int i = 0; i < 3; i++) {
if (p->pweapon[0]!=NULL&&p->pweapon[0]->kind_no1 != wep_sort[i])
time++;
}
if (time == 3) {
switch (p->pweapon[0]->kind_no1) {
case 0:pweapon[p->pweapon[0]->kind_no1] = new sword(this); break;
case 1:pweapon[p->pweapon[0]->kind_no1] = new bomb(this); break;
case 2:pweapon[p->pweapon[0]->kind_no1] = new arrow(this); break;
}
*pweapon[p->pweapon[0]->kind_no1] = *p->pweapon[0];
weapon_num++;
}
}
else if (p->sort_nm == 1) {
for (int j = 0; j < 2;j++) {
int time = 0;
for (int i = 0; i < 3; i++) {
if (p->pweapon[j] != NULL&&p->pweapon[j]->kind_no1 != wep_sort[i])
time++;
}
if (time == 3) {
switch (p->pweapon[j]->kind_no1) {
case 0:pweapon[p->pweapon[j]->kind_no1] = new sword(this); break;
case 1:pweapon[p->pweapon[j]->kind_no1] = new bomb(this); break;
case 2:pweapon[p->pweapon[j]->kind_no1] = new arrow(this); break;
}
*pweapon[p->pweapon[j]->kind_no1] = *p->pweapon[j];
weapon_num++;
}
}
}
else if (p->sort_nm == 4) {
for (int j = 0; j < 3; j++) {
int time = 0;
for (int i = 0; i < 3; i++) {
if (p->pweapon[j]!=NULL&&p->pweapon[j]->kind_no1 != wep_sort[i])
time++;
}
if (time == 3) {
switch (p->pweapon[j]->kind_no1) {
case 0:pweapon[p->pweapon[j]->kind_no1] = new sword(this); break;
case 1:pweapon[p->pweapon[j]->kind_no1] = new bomb(this); break;
case 2:pweapon[p->pweapon[j]->kind_no1] = new arrow(this); break;
}
*pweapon[p->pweapon[j]->kind_no1] = *p->pweapon[j];
weapon_num++;
}
}
}
kill_ = 1;



if (this->parmy->color == 0)
no1++;
else
no2++;
if (this->pcity->life > 0) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << this->parmy->getcolor() << " wolf " << num << " earned " << this->pcity->life << " elements for his headquarter" << endl;


}



}
else {
p->fightback(this);
}
}
void wolf::hurted(int npower, soldier *p) {
lifev -= npower;
for (int i = 0; i < 3; i++) {
if (p->pweapon[i] != NULL&&p->pweapon[i]->kind_no1 == 0 && p->pweapon[i]->exist == 1) {
lifev -= p->pweapon[i]->power;
p->pweapon[i]->update();
break;
}
}
if (lifev > 0) {

}
else {
this->pcity->a[this->parmy->color] = 0;

cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu<< " ";
cout << this->parmy->getcolor() << " wolf " << num << " was killed in city " << this->position << endl;
this->can_delete = 1;


}
}
void wolf:: fightback(soldier *p) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << this->parmy->getcolor() << " wolf " << num << " fought back against " << p->parmy->getcolor() << " " << soldier::names[p->sort_nm] << " " << p->num << " in city " << this->position << endl;


p->hurted(power / 2,this);
if (p->lifev <= 0) {
if (p->lifev <= 0) {
for (int i = 0; i < 3; i++) {
if (pweapon[i] != NULL&&pweapon[i]->kind_no1 == 0 && pweapon[i]->exist == 1) {
wep_sort[0] = 0;
}
else if (pweapon[i] != NULL&&pweapon[i]->kind_no1 == 0 && pweapon[i]->exist == 0) {
wep_sort[0] = -1;
}
if (pweapon[i] != NULL&&pweapon[i]->kind_no1 == 1 && pweapon[i]->exist == 1) {
wep_sort[1] = 1;
}
else if (pweapon[i] != NULL&&pweapon[i]->kind_no1 == 1 && pweapon[i]->exist == 0) {
wep_sort[1] = -1;
}
if (pweapon[i] != NULL&&pweapon[i]->kind_no1 == 2 && pweapon[i]->exist == 1) {
wep_sort[2] = 2;
}
else if(pweapon[i] != NULL&&pweapon[i]->kind_no1 == 2 && pweapon[i]->exist == 0) {
wep_sort[2] = -1;
}
}


if (p->sort_nm == 0 || p->sort_nm == 2) {
int time = 0;
for (int i = 0; i < 3; i++) {
if (p->pweapon[0] != NULL&&p->pweapon[0]->kind_no1 != wep_sort[i])
time++;
}
if (time == 3) {
switch (p->pweapon[0]->kind_no1) {
case 0:pweapon[p->pweapon[0]->kind_no1] = new sword(this); break;
case 1:pweapon[p->pweapon[0]->kind_no1] = new bomb(this); break;
case 2:pweapon[p->pweapon[0]->kind_no1] = new arrow(this); break;
}
*pweapon[p->pweapon[0]->kind_no1] = *p->pweapon[0];
weapon_num++;
}
}
else if (p->sort_nm == 1) {
for (int j = 0; j < 2; j++) {
int time = 0;
for (int i = 0; i < 3; i++) {
if (p->pweapon[j] != NULL&&p->pweapon[j]->kind_no1 != wep_sort[i])
time++;
}
if (time == 3) {
switch (p->pweapon[j]->kind_no1) {
case 0:pweapon[p->pweapon[j]->kind_no1] = new sword(this); break;
case 1:pweapon[p->pweapon[j]->kind_no1] = new bomb(this); break;
case 2:pweapon[p->pweapon[j]->kind_no1] = new arrow(this); break;
}
*pweapon[p->pweapon[j]->kind_no1] = *p->pweapon[j];
weapon_num++;
}
}
}
else if (p->sort_nm == 4) {
for (int j = 0; j < 3; j++) {
int time = 0;
for (int i = 0; i < 3; i++) {
if (p->pweapon[j] != NULL&& p->pweapon[j]->kind_no1 != wep_sort[i])
time++;
}
if (time == 3) {
switch (p->pweapon[j]->kind_no1) {
case 0:pweapon[p->pweapon[j]->kind_no1] = new sword(this); break;
case 1:pweapon[p->pweapon[j]->kind_no1] = new bomb(this); break;
case 2:pweapon[p->pweapon[j]->kind_no1] = new arrow(this); break;
}
*pweapon[p->pweapon[j]->kind_no1] = *p->pweapon[j];
weapon_num++;
}
}
}


kill_ = 1;


if (this->parmy->color == 0)
no1++;
else
no2++;


if (this->pcity->life > 0) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << this->parmy->getcolor() << " wolf " << num << " earned " << this->pcity->life << " elements for his headquarter" << endl;
}


}


}
}






void army::produce(int tm,int N) {
int sort_num = pro_order[color][order_index];
if (total_life >= soldier::lifevalue[sort_num]) {
total_life -= soldier::lifevalue[sort_num];
switch (sort_num) {
case 0:psoldier[total_num] = new dragon(this, total_num + 1, sort_num, N); break;
case 1:psoldier[total_num] = new ninja(this, total_num + 1, sort_num, N); break;
case 2:psoldier[total_num] = new iceman(this, total_num + 1, sort_num, N); break;
case 3:psoldier[total_num] = new lion(this, total_num + 1, sort_num, N); break;
case 4:psoldier[total_num] = new wolf(this, total_num + 1, sort_num, N); break;
}
soldier1[sort_num]++;
psoldier[total_num]->printing(tm);
total_num++;
order_index = (order_index + 1) % 5;

}
}
string army::getcolor()
{
if (color == 0)
return "red";
else
return "blue";
}
int army::pro_order[2][5] = { { 2,3,4,1,0 },{ 3,0,1,2,4 } };//生产顺序
int soldier::lifevalue[5];
string soldier::names[5] = { "dragon","ninja","iceman","lion","wolf" };
string weapon::name[3] = { "sword","bomb","arrow" };
int soldier::powerary[5];
int soldier::no1;
int soldier::no2;


void city::init(int i) {
num = i;
life = 0;


}
void city:: supply_life() {
if ((psoldier[0] != NULL&&psoldier[0]->can_delete==0)&&(psoldier[1] == NULL||psoldier[1]->can_delete==1)&&life>0) {

cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << psoldier[0]->parmy->getcolor() << " " << soldier::names[psoldier[0]->sort_nm] << " " << psoldier[0]->num << " earned " << life << " elements for his headquarter" << endl;


psoldier[0]->parmy->total_life += life;
life = 0;

}
else if ((psoldier[1] != NULL&&psoldier[1]->can_delete == 0)&&(psoldier[0] == NULL || psoldier[0]->can_delete == 1) && life>0) {

cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << psoldier[1]->parmy->getcolor() << " " << soldier::names[psoldier[1]->sort_nm] << " " << psoldier[1]->num << " earned " << life << " elements for his headquarter" << endl;
psoldier[1]->parmy->total_life += life;
life = 0;
}
}
void city::battle() {
if (psoldier[0] != NULL&&psoldier[1] != NULL &&psoldier[0]->escape==0&& psoldier[1]->escape==0) {
if ((((num % 2 == 1&&color!=1) || color == 0)&&psoldier[0]->can_delete == 0 )|| ((((num % 2 == 0 && color != 0) || color == 1)&& psoldier[0]->can_delete == 0 && psoldier[1]->can_delete == 1))){
psoldier[0]->attack(psoldier[1]);
if (psoldier[0]->lifev > 0 && psoldier[1]->lifev>0) {
a[0] = 0;
a[1] = 0;
}

}
else if (((num % 2 == 0&&color!=0) || color == 1)&&psoldier[1]->can_delete == 0 || (((num % 2 == 1 && color != 1) || color == 0) && psoldier[0]->can_delete == 1&&psoldier[1]->can_delete == 0)){
psoldier[1]->attack(psoldier[0]);
if (psoldier[0]->lifev > 0 && psoldier[1]->lifev>0) {
a[0] = 0;
a[1] = 0;
}
}
}
if ((psoldier[0]!=NULL&&psoldier[0]->can_delete==0)&&(psoldier[1]!=NULL&&psoldier[1]->can_delete==1 )) {

a[0]++;
a[1] = 0;
}
else if ((psoldier[1] != NULL&&psoldier[1]->can_delete == 0) && (psoldier[0] != NULL&&psoldier[0]->can_delete == 1)) {

a[1]++;
a[0] = 0;
}

if (a[0] == 2 && (color == 1||color==2))
{
color = 0;
a[0] = 0;
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << psoldier[0]->parmy->getcolor() << " flag raised in city " << num << endl;
}
if (a[1] == 2 && (color == 0||color==2))
{
color = 1;
a[1] = 0;
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << psoldier[1]->parmy->getcolor() << " flag raised in city " << num << endl;
}

}
void city::printing() {
if (psoldier[0]!=NULL&&psoldier[0]->can_delete == 0&& psoldier[0]->position<=Num) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << psoldier[0]->parmy->getcolor() << " " << psoldier[0]->names[psoldier[0]->sort_nm] << " " << psoldier[0]->num << " marched to city " << psoldier[0]->position;
cout << " with " << psoldier[0]->lifev << " elements and force " << psoldier[0]->power << endl;


}
if (psoldier[1] != NULL&&psoldier[1]->can_delete == 0 && psoldier[1]->position >=1) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << psoldier[1]->parmy->getcolor() << " " << psoldier[1]->names[psoldier[1]->sort_nm] << " " << psoldier[1]->num << " marched to city " << psoldier[1]->position;
cout << " with " << psoldier[1]->lifev << " elements and force " << psoldier[1]->power << endl;


}
}


void city::shoot() {
for (int i = 0; i < 3;i++)
if (this->psoldier[0]!=NULL&&this->psoldier[0]->pweapon[i]!=NULL&&this->psoldier[0]->pweapon[i]->kind_no1 == 2&& this->psoldier[0]->pweapon[i]->exist==1 && this->num <= Num - 1&&ct[(this->num) + 1].psoldier[1]!=NULL&&ct[(this->num) + 1].psoldier[1]->can_delete==0) {
ct[(this->num) + 1].psoldier[1]->lifev -=psoldier[0]->pweapon[i]->power;
if (ct[(this->num) + 1].psoldier[1]->lifev > 0) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << "red " << soldier::names[psoldier[0]->sort_nm] << " " << psoldier[0]->num << " shot" << endl;
}

psoldier[0]->pweapon[i]->update();

if (ct[(this->num) + 1].psoldier[1]->lifev <= 0) {
ct[this->num + 1].psoldier[1]->can_delete = 1;

cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << "red " << soldier::names[psoldier[0]->sort_nm] << " " << psoldier[0]->num << " shot and killed blue " << soldier::names[ct[(this->num) + 1].psoldier[1]->sort_nm] <<" "<< ct[(this->num) + 1].psoldier[1]->num << endl;


}
if (psoldier[0]->pweapon[i]->fight_num == 3) {
psoldier[0]->pweapon[i]->exist = 0;
}
}
for (int i = 0; i < 3; i++)
if (this->psoldier[1]!=NULL&&this->psoldier[1]->pweapon[i] != NULL&&this->psoldier[1]->pweapon[i]->kind_no1 == 2 && this->psoldier[1]->pweapon[i]->exist == 1 && this->num >=2 && ct[(this->num) - 1].psoldier[0] != NULL&&ct[(this->num) - 1].psoldier[0]->can_delete ==0) {
ct[(this->num) - 1].psoldier[0]->lifev -= psoldier[1]->pweapon[i]->power;
if (ct[(this->num) - 1].psoldier[0]->lifev > 0) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << "blue " << soldier::names[psoldier[1]->sort_nm] << " " << psoldier[1]->num << " shot" << endl;
}
psoldier[1]->pweapon[i]->update();
if (ct[(this->num) - 1].psoldier[0]->lifev <= 0) {
ct[this->num - 1].psoldier[0]->can_delete = 1;

cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << "blue " << soldier::names[psoldier[1]->sort_nm] << " " << psoldier[1]->num << " shot and killed red " << soldier::names[ct[(this->num) - 1].psoldier[0]->sort_nm] << " " << ct[(this->num) - 1].psoldier[0]->num << endl;

}
if (psoldier[1]->pweapon[i]->fight_num == 3) {
psoldier[1]->pweapon[i]->exist = 0;
}
}




}


void city::judge() {
if ((num % 2 == 1 && color != 1) || color == 0) {


if (psoldier[0] != NULL&&psoldier[0]->can_delete == 0 && psoldier[1] != NULL&&psoldier[1]->can_delete == 0) {
int b = psoldier[1]->lifev - psoldier[0]->power;
for (int j = 0; j < 3; j++) {
if (psoldier[0]->pweapon[j] != NULL&&psoldier[0]->pweapon[j]->kind_no1 == 0) {
b = b - psoldier[0]->pweapon[j]->power;
break;
}
}
if (b > 0&&psoldier[1]->sort_nm!=1) {
int f = psoldier[0]->lifev - (psoldier[1]->power) / 2;
for (int j = 0; j < 3; j++) {
if (psoldier[1]->pweapon[j] != NULL&&psoldier[1]->pweapon[j]->kind_no1 == 0) {
f = f - psoldier[1]->pweapon[j]->power;
break;
}
}
if (f <= 0) {
for (int i = 0; i < 3; i++) {
if (psoldier[0]->pweapon[i]!=NULL&&psoldier[0]->pweapon[i]->kind_no1 == 1) {
psoldier[0]->pweapon[i]->fight_num++;
psoldier[0]->pweapon[i]->exist = 0;
psoldier[0]->lifev = 0;
psoldier[1]->lifev = 0;
psoldier[0]->can_delete = 1;
psoldier[1]->can_delete = 1;
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << "red " << soldier::names[psoldier[0]->sort_nm] << " " << psoldier[0]->num << " used a bomb and killed blue " << soldier::names[psoldier[1]->sort_nm] << " " << psoldier[1]->num << endl;
}
}
}
}
else if (b <= 0) {
for (int i = 0; i < 3; i++) {
if (psoldier[1]->pweapon[i]!=NULL&&psoldier[1]->pweapon[i]->kind_no1 == 1) {
psoldier[1]->pweapon[i]->fight_num++;
psoldier[1]->pweapon[i]->exist = 0;
psoldier[0]->lifev = 0;
psoldier[1]->lifev = 0;
psoldier[0]->can_delete = 1;
psoldier[1]->can_delete = 1;
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << "blue " << soldier::names[psoldier[1]->sort_nm] << " " << psoldier[1]->num << " used a bomb and killed red " << soldier::names[psoldier[0]->sort_nm] << " " << psoldier[0]->num << endl;


}


}
}
}
}



else if ((num % 2 == 0 && color != 0) || color == 1) {
if (psoldier[0] != NULL&&psoldier[0]->can_delete == 0 && psoldier[1] != NULL&&psoldier[1]->can_delete == 0) {
int b = psoldier[0]->lifev - psoldier[1]->power;
for (int j = 0; j < 3; j++) {
if (psoldier[1]->pweapon[j] != NULL&&psoldier[1]->pweapon[j]->kind_no1 == 0) {
b = b - psoldier[1]->pweapon[j]->power;
break;
}
}
if (b > 0&& psoldier[0]->sort_nm!=1) {
int f = psoldier[1]->lifev - (psoldier[0]->power) / 2;
for (int j = 0; j < 3; j++) {
if (psoldier[0]->pweapon[j] != NULL&&psoldier[0]->pweapon[j]->kind_no1 == 0) {
f = f - psoldier[0]->pweapon[j]->power;
break;
}
}
if (f <= 0) {
for (int i = 0; i < 3; i++) {
if (psoldier[1]->pweapon[i]!=NULL&&psoldier[1]->pweapon[i]->kind_no1 == 1) {
psoldier[1]->pweapon[i]->fight_num++;
psoldier[1]->pweapon[i]->exist = 0;
psoldier[0]->lifev = 0;
psoldier[1]->lifev = 0;
psoldier[0]->can_delete = 1;
psoldier[1]->can_delete = 1;
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << "blue " << soldier::names[psoldier[1]->sort_nm] << " " << psoldier[1]->num << " used a bomb and killed red " << soldier::names[psoldier[0]->sort_nm] << " " << psoldier[0]->num << endl;
}
}
}
}
else if (b <= 0) {
for (int i = 0; i < 3; i++) {
if (psoldier[0]->pweapon[i]!=NULL&&psoldier[0]->pweapon[i]->kind_no1 == 1) {
psoldier[0]->pweapon[i]->fight_num++;
psoldier[0]->pweapon[i]->exist = 0;
psoldier[0]->lifev = 0;
psoldier[1]->lifev = 0;
psoldier[0]->can_delete = 1;
psoldier[1]->can_delete = 1;
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << "red " << soldier::names[psoldier[0]->sort_nm] << " " << psoldier[0]->num << " used a bomb and killed blue " << soldier::names[psoldier[1]->sort_nm] << " " << psoldier[1]->num << endl;


}


}
}
}
}
}


void city::printing_red() {
if (psoldier[0] != NULL&& psoldier[0]->can_delete!=1) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " red ";
cout << soldier::names[psoldier[0]->sort_nm] << " " << psoldier[0]->num << " has ";
if (psoldier[0]->sort_nm == 4) {
if (psoldier[0]->pweapon[2] != NULL&&psoldier[0]->pweapon[2]->exist == 1) {
cout << "arrow(" << (3 - psoldier[0]->pweapon[2]->fight_num) << ")";
if (psoldier[0]->pweapon[1] != NULL&&psoldier[0]->pweapon[1]->exist == 1 || psoldier[0]->pweapon[0] != NULL&&psoldier[0]->pweapon[0]->exist == 1)
{
cout << ",";
}
}
if (psoldier[0]->pweapon[1] != NULL&&psoldier[0]->pweapon[1]->exist == 1) {
cout << "bomb";


if (psoldier[0]->pweapon[0] != NULL&&psoldier[0]->pweapon[0]->exist == 1)
cout << ",";
}
if (psoldier[0]->pweapon[0] != NULL&&psoldier[0]->pweapon[0]->exist == 1) {
cout << "sword(" << psoldier[0]->pweapon[0]->power << ")";
}
if ((psoldier[0]->pweapon[0] == NULL || psoldier[0]->pweapon[0]->exist == 0) && (psoldier[0]->pweapon[1] == NULL || psoldier[0]->pweapon[1]->exist == 0) && (psoldier[0]->pweapon[2] == NULL || psoldier[0]->pweapon[2]->exist == 0))
cout << "no weapon";
cout << endl;
}


if (psoldier[0]->sort_nm == 1) {
if (psoldier[0]->pweapon[1] != NULL&&psoldier[0]->pweapon[1]->exist == 1) {


if (psoldier[0]->pweapon[1]->kind_no1 == 2) {
cout << "arrow(" << (3 - psoldier[0]->pweapon[1]->fight_num) << ")";
}
if (psoldier[0]->pweapon[1]->kind_no1 == 1) {
cout << "bomb";
}
if (psoldier[0]->pweapon[0] != NULL&&psoldier[0]->pweapon[0]->exist == 1)
cout << ",";
}
if (psoldier[0]->pweapon[0] != NULL&&psoldier[0]->pweapon[0]->exist == 1) {
if (psoldier[0]->pweapon[0]->kind_no1 == 1) {
cout << "bomb";
}
if (psoldier[0]->pweapon[0]->kind_no1 == 0) {
cout << "sword(" << psoldier[0]->pweapon[0]->power << ")";
}


}
if ((psoldier[0]->pweapon[0] == NULL || psoldier[0]->pweapon[0]->exist == 0) && (psoldier[0]->pweapon[1] == NULL || psoldier[0]->pweapon[1]->exist == 0))
cout << "no weapon";
cout << endl;
}


if (psoldier[0]->sort_nm == 0 || psoldier[0]->sort_nm == 2) {
if (psoldier[0]->pweapon[0] != NULL&&psoldier[0]->pweapon[0]->exist == 1) {
if (psoldier[0]->pweapon[0]->kind_no1 == 2) {
cout << "arrow(" << (3 - psoldier[0]->pweapon[0]->fight_num) << ")";
}
if (psoldier[0]->pweapon[0]->kind_no1 == 1) {
cout << "bomb";
}
if (psoldier[0]->pweapon[0]->kind_no1 == 0) {
cout << "sword(" << psoldier[0]->pweapon[0]->power << ")";
}


}
if (psoldier[0]->pweapon[0] == NULL || psoldier[0]->pweapon[0]->exist == 0)
cout << "no weapon";
cout << endl;
}
if (psoldier[0]->sort_nm == 3) {
cout << "no weapon" << endl;
}
}


}
void city::printing_blue() {
if (psoldier[1] != NULL&&psoldier[1]->can_delete!=1) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " blue ";
cout << soldier::names[psoldier[1]->sort_nm] << " " << psoldier[1]->num << " has ";
if (psoldier[1]->sort_nm == 4) {
if (psoldier[1]->pweapon[2] != NULL&&psoldier[1]->pweapon[2]->exist == 1) {
cout << "arrow(" << (3 - psoldier[1]->pweapon[2]->fight_num) << ")";
if (psoldier[1]->pweapon[1] != NULL&&psoldier[1]->pweapon[1]->exist == 1 || psoldier[1]->pweapon[0] != NULL&&psoldier[1]->pweapon[0]->exist == 1)
{
cout << ",";
}
}
if (psoldier[1]->pweapon[1] != NULL&&psoldier[1]->pweapon[1]->exist == 1) {
cout << "bomb";


if (psoldier[1]->pweapon[0] != NULL&&psoldier[1]->pweapon[0]->exist == 1)
cout << ",";
}
if (psoldier[1]->pweapon[0] != NULL&&psoldier[1]->pweapon[0]->exist == 1) {
cout << "sword(" << psoldier[1]->pweapon[0]->power << ")";
}
if ((psoldier[1]->pweapon[0] == NULL || psoldier[1]->pweapon[0]->exist == 0) && (psoldier[1]->pweapon[1] == NULL || psoldier[1]->pweapon[1]->exist == 0) && (psoldier[1]->pweapon[2] == NULL || psoldier[1]->pweapon[2]->exist == 0))
cout << "no weapon";
cout << endl;
}


if (psoldier[1]->sort_nm == 1) {
if (psoldier[1]->pweapon[1] != NULL&&psoldier[1]->pweapon[1]->exist == 1) {


if (psoldier[1]->pweapon[1]->kind_no1 == 2) {
cout << "arrow(" << (3 - psoldier[1]->pweapon[1]->fight_num) << ")";
}
if (psoldier[1]->pweapon[1]->kind_no1 == 1) {
cout << "bomb";
}
if (psoldier[1]->pweapon[0] != NULL&&psoldier[1]->pweapon[0]->exist == 1)
cout << ",";
}
if (psoldier[1]->pweapon[0] != NULL&&psoldier[1]->pweapon[0]->exist == 1) {
if (psoldier[1]->pweapon[0]->kind_no1 == 1) {
cout << "bomb";
}
if (psoldier[1]->pweapon[0]->kind_no1 == 0) {
cout << "sword(" << psoldier[1]->pweapon[0]->power << ")";
}


}
if ((psoldier[1]->pweapon[0] == NULL || psoldier[1]->pweapon[0]->exist == 0) && (psoldier[1]->pweapon[1] == NULL || psoldier[1]->pweapon[1]->exist == 0))
cout << "no weapon";
cout << endl;
}


if (psoldier[1]->sort_nm == 0 || psoldier[1]->sort_nm == 2){
if (psoldier[1]->pweapon[0] != NULL&&psoldier[1]->pweapon[0]->exist == 1) {
if (psoldier[1]->pweapon[0]->kind_no1 == 2) {
cout << "arrow(" << (3 - psoldier[1]->pweapon[0]->fight_num) << ")";
}
if (psoldier[1]->pweapon[0]->kind_no1 == 1) {
cout << "bomb";
}
if (psoldier[1]->pweapon[0]->kind_no1 == 0) {
cout << "sword(" << psoldier[1]->pweapon[0]->power << ")";
}


}
if (psoldier[1]->pweapon[0] == NULL || psoldier[1]->pweapon[0]->exist == 0)
cout << "no weapon";
cout << endl;
}
if (psoldier[1]->sort_nm == 3) {
cout << "no weapon" << endl;
}
}
}


void army::remove (){//阵营所有的武士进行移动。
if (this->color == 0)
for (int i = 0; i < this->total_num; i++) {
if (this->psoldier[i]->can_delete==0) {
this->psoldier[i]->remv = 1;
this->psoldier[i]->position++;
if (this->psoldier[i]->position < Num + 1) {
this->psoldier[i]->pcity = &ct[this->psoldier[i]->position];
ct[this->psoldier[i]->position].psoldier[0] = this->psoldier[i];
}
else if (this->psoldier[i]->position = Num + 1) {
this->psoldier[i]->pcity = NULL;
}

if (this->psoldier[i]->position >= 2) {
ct[this->psoldier[i]->position - 1].psoldier[0] = NULL;
}
if (this->psoldier[i]->position % 2 == 0 && this->psoldier[i]->sort_nm == 2) {
if (this->psoldier[i]->lifev>9) {
this->psoldier[i]->lifev -= 9;
}
else
this->psoldier[i]->lifev = 1;
this->psoldier[i]->power += 20;
}

}
}
else
for (int i = 0; i < this->total_num; i++) {
if (this->psoldier[i]->can_delete==0) {
this->psoldier[i]->remv = 1;
this->psoldier[i]->position--;
if (this->psoldier[i]->position > 0) {
this->psoldier[i]->pcity = &ct[this->psoldier[i]->position];
ct[this->psoldier[i]->position].psoldier[1] = this->psoldier[i];
}
else if (this->psoldier[i]->position == 0) {
this->psoldier[i]->pcity = NULL;
}

if (this->psoldier[i]->position <=Num-1) {
ct[this->psoldier[i]->position + 1].psoldier[1] = NULL;
}


if (Num % 2 == 1) {
if (this->psoldier[i]->position % 2 == 0 && this->psoldier[i]->sort_nm == 2) {
if (this->psoldier[i]->lifev>9) {
this->psoldier[i]->lifev -= 9;
}
else
this->psoldier[i]->lifev = 1;
this->psoldier[i]->power += 20;
}
}
else {
if (this->psoldier[i]->position % 2 == 1 && this->psoldier[i]->sort_nm == 2) {
if (this->psoldier[i]->lifev > 9) {
this->psoldier[i]->lifev -= 9;
}
else
this->psoldier[i]->lifev = 1;
this->psoldier[i]->power += 20;
}
}

}
}
}


void army::shoot() {
if (color == 0)
if (this->psoldier[total_num] != NULL&&this->psoldier[total_num]->position == 0 && ct[1].psoldier[1] != NULL&&ct[1].psoldier[1]->can_delete == 0) {
for (int i = 0; i < 3; i++)
if (this->psoldier[total_num]->pweapon[i]->kind_no1 == 2 && this->psoldier[total_num]->pweapon[i]->exist == 1) {
ct[1].psoldier[1]->lifev -= psoldier[total_num]->pweapon[i]->power;
if (ct[1].psoldier[1]->lifev > 0) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << "red " << soldier::names[psoldier[total_num]->sort_nm] << " " << psoldier[total_num]->num << " shot" << endl;
}
psoldier[total_num]->pweapon[i]->update();
if (ct[1].psoldier[1]->lifev <= 0) {
ct[1].psoldier[1]->can_delete = 1;
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << "red " << soldier::names[psoldier[total_num]->sort_nm] << " " << psoldier[total_num]->num << " shot and killed blue " << soldier::names[ct[1].psoldier[1]->sort_nm] << " " << ct[1].psoldier[1]->num << endl;


}
}
}


if (color == 1)
if (this->psoldier[total_num] != NULL&&this->psoldier[total_num]->position == Num + 1 && ct[Num].psoldier[0] != NULL&&ct[1].psoldier[0]->can_delete == 0) {
for (int i = 0; i < 3; i++)
if (this->psoldier[total_num]->pweapon[i]->kind_no1 == 2 && this->psoldier[total_num]->pweapon[i]->exist == 1) {
ct[Num].psoldier[0]->lifev -= psoldier[total_num]->pweapon[i]->power;
if (ct[Num].psoldier[0]->lifev > 0) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << "blue " << soldier::names[psoldier[total_num]->sort_nm] << " " << psoldier[total_num]->num << " shot" << endl;
}
psoldier[total_num]->pweapon[i]->update();
if (ct[Num].psoldier[0]->lifev <= 0) {
ct[Num].psoldier[0]->can_delete = 1;
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << "blue " << soldier::names[psoldier[total_num]->sort_nm] << " " << psoldier[total_num]->num << " shot and killed red " << soldier::names[ct[Num].psoldier[0]->sort_nm] << " " << ct[Num].psoldier[0]->num << endl;


}
}
}


}


int main() {
int n, M, j,N,T;
cin >> n;
for (j = 1; j <= n; j++) {
flag1 =flag2 =t = minu = 0;
Num = 0;
cin >> M>>N>>R>>K>>T;
Num = N;
for (int i = 1; i <= Num; i++) {
ct[i].init(i);
}

army *redarmy = new army(0, M);
army *bluearmy = new army(1, M);
for (int i = 0; i < 5; i++)
cin >> soldier::lifevalue[i];
for (int i = 0; i < 5; i++)
cin >> soldier::powerary[i];
cout << "Case " << j <<":"<< endl;
while (true) {
redarmy->produce(t, N);//N个城市
bluearmy->produce(t, N);
minu += 5;
if (t * 60 + minu > T)
break;
if (redarmy->total_num >= 1) {
if (redarmy->psoldier[redarmy->total_num - 1] != NULL&&redarmy->psoldier[redarmy->total_num - 1]->sort_nm == 3) {
if (redarmy->psoldier[redarmy->total_num - 1]->devote <= 0 && redarmy->psoldier[redarmy->total_num - 1]->escape == 0) {
redarmy->psoldier[redarmy->total_num - 1]->can_delete = 1;
if (redarmy->psoldier[redarmy->total_num - 1]->escape == 0) {
redarmy->psoldier[redarmy->total_num - 1]->escape = 1;
}
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << "red " << soldier::names[redarmy->psoldier[redarmy->total_num - 1]->sort_nm] << " " << redarmy->total_num << " ran away" << endl;


}
}
}
for (int i = 1; i <= Num; i++) {
if (ct[i].psoldier[0]!=NULL&&ct[i].psoldier[0]->sort_nm == 3) {
if (ct[i].psoldier[0]->escape == 1) {
ct[i].psoldier[0]->can_delete = 1;
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << "red " << soldier::names[ct[i].psoldier[0]->sort_nm] << " " << ct[i].psoldier[0]->num << " ran away" << endl;


}
}
if (ct[i].psoldier[1]!=NULL&&ct[i].psoldier[1]->sort_nm == 3) {
if (ct[i].psoldier[1]->escape == 1 ) {
ct[i].psoldier[1]->can_delete = 1;
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << "blue " << soldier::names[ct[i].psoldier[1]->sort_nm] << " " << ct[i].psoldier[1]->num << " ran away" << endl;


}
}
}
if (bluearmy->total_num >= 1) {
if (bluearmy->psoldier[bluearmy->total_num - 1] != NULL&&bluearmy->psoldier[bluearmy->total_num - 1]->sort_nm == 3) {
if (bluearmy->psoldier[bluearmy->total_num - 1]->devote <= 0 && bluearmy->psoldier[bluearmy->total_num - 1]->escape == 0) {
bluearmy->psoldier[bluearmy->total_num - 1]->can_delete = 1;
if (bluearmy->psoldier[bluearmy->total_num - 1]->escape == 0) {
bluearmy->psoldier[bluearmy->total_num - 1]->escape = 1;
}
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << "blue " << soldier::names[bluearmy->psoldier[bluearmy->total_num - 1]->sort_nm] << " " << bluearmy->total_num << " ran away" << endl;


}
}
}
minu += 5;
if (t * 60 + minu > T)
break;
redarmy->remove();
bluearmy->remove();




for (int i = 0; i < bluearmy->total_num; i++)
if (bluearmy->psoldier[i]->position == 0 && bluearmy->psoldier[i]->can_delete == 0) {
flag2++;
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << bluearmy->getcolor() << " " << soldier::names[bluearmy->psoldier[i]->sort_nm] << " " << bluearmy->psoldier[i]->num << " reached red headquarter with ";
cout << bluearmy->psoldier[i]->lifev << " elements and force " << bluearmy->psoldier[i]->power << endl;
bluearmy->psoldier[i]->can_delete = 1;
}


if (flag2 == 2) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << "red headquarter was taken" << endl;


}


for (int i = 1; i <= Num; i++) {
ct[i].printing();
}
for (int i = 0; i < redarmy->total_num; i++)
if (redarmy->psoldier[i]->position == Num + 1 && redarmy->psoldier[i]->can_delete == 0) {
flag1++;
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << redarmy->getcolor() << " " << soldier::names[redarmy->psoldier[i]->sort_nm] << " " << redarmy->psoldier[i]->num << " reached blue headquarter with ";
cout << redarmy->psoldier[i]->lifev << " elements and force " << redarmy->psoldier[i]->power << endl;
redarmy->psoldier[i]->can_delete = 1;
}






if (flag1 == 2) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " ";
cout << "blue headquarter was taken" << endl;
break;
}
if (flag2 == 2) {
break;
}


minu += 10;
if (t * 60 + minu > T)
break;
for (int i = 1; i <= Num; i++) {
ct[i].produce_life();
}
minu += 10;
if (t * 60 + minu > T)
break;
for (int i = 1; i <= Num; i++) {
ct[i].supply_life();
}
minu += 5;

if (t * 60 + minu > T)
break;
redarmy->shoot();
for (int i = 1; i <= Num; i++) {
ct[i].shoot();
}
bluearmy->shoot();
minu += 3;
if (t * 60 + minu > T)
break;
for (int i = 1; i <= Num; i++) {
ct[i].judge();
}


minu += 2;
if (t * 60 + minu > T)
break;
for (int i = 1; i <= Num; i++) {
ct[i].battle();


}
for (int i = 1; i <= Num; i++) {
for (int j = 0; j < 3; j++) {
if (ct[i].psoldier[0] != NULL&&ct[i].psoldier[0]->pweapon[j] != NULL)
ct[i].psoldier[0]->pweapon[j]->check();
if (ct[i].psoldier[1] != NULL&& ct[i].psoldier[1]->pweapon[j] != NULL)
ct[i].psoldier[1]->pweapon[j]->check();
if (ct[i].psoldier[0] != NULL&& ct[i].psoldier[0]->pweapon[j] != NULL&&ct[i].psoldier[0]->pweapon[j]->exist == 0) {
ct[i].psoldier[0]->weapon_num--;

ct[i].psoldier[0]->pweapon[j] = NULL;
}
if (ct[i].psoldier[1] != NULL&&ct[i].psoldier[1]->pweapon[j] != NULL&&ct[i].psoldier[1]->pweapon[j]->exist == 0) {
ct[i].psoldier[1]->weapon_num--;

ct[i].psoldier[1]->pweapon[j] = NULL;
}
}


}


for (int i = Num; i >= 1; i--) {
if (ct[i].psoldier[0]!=NULL&&ct[i].psoldier[0]->kill_ == 1&&ct[i].psoldier[0]->parmy->total_life>=8) {

ct[i].psoldier[0]->parmy->total_life -= 8;
ct[i].psoldier[0]->lifev += 8;
soldier::no1--;
}
if (ct[i].psoldier[0] != NULL&&soldier::no1 == 0 || (ct[i].psoldier[0] != NULL&&ct[i].psoldier[0]->parmy->total_life < 8))
break;
}
for (int i = 1; i <= Num; i++) {
if (ct[i].psoldier[0] != NULL&&ct[i].psoldier[0]->kill_ == 1) {
ct[i].psoldier[0]->parmy->total_life += ct[i].life;
ct[i].life = 0;
}
}
for (int i = 1; i <= Num; i++) {
if (ct[i].psoldier[1] != NULL&&ct[i].psoldier[1]->kill_ == 1 && ct[i].psoldier[1]->parmy->total_life >= 8) {
ct[i].psoldier[1]->parmy->total_life -= 8;
ct[i].psoldier[1]->lifev += 8;
soldier::no2--;
}
if (ct[i].psoldier[1] != NULL&&soldier::no2 == 0|| (ct[i].psoldier[1] != NULL&&ct[i].psoldier[1]->parmy->total_life < 8))
break;
}
for (int i = 1; i <= Num; i++) {
if (ct[i].psoldier[1] != NULL&&ct[i].psoldier[1]->kill_ == 1) {
ct[i].psoldier[1]->parmy->total_life += ct[i].life;
ct[i].life = 0;
}
}


for (int i = 1; i <= Num; i++) {
if (ct[i].psoldier[0] != NULL&&ct[i].psoldier[0]->kill_ == 1) {
ct[i].psoldier[0]->kill_ = 0;
}
if (ct[i].psoldier[1] != NULL&&ct[i].psoldier[1]->kill_ == 1) {
ct[i].psoldier[1]->kill_ = 0;
}


}
minu += 10;
if (t * 60 + minu > T)
break;
redarmy->printing();
bluearmy->printing();
minu += 5;
if (t * 60 + minu > T)
break;



for (int i = 1; i <= Num; i++) {
ct[i].printing_red();
}
for (int i = 0; i < redarmy->total_num; i++) {
if (redarmy->psoldier[i]->position == Num + 1) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " red ";
cout << soldier::names[redarmy->psoldier[i]->sort_nm] << " " << redarmy->psoldier[i]->num << " has ";
if (redarmy->psoldier[i]->sort_nm == 4) {
if (redarmy->psoldier[i]->pweapon[2] != NULL&&redarmy->psoldier[i]->pweapon[2]->exist == 1) {
cout << "arrow(" << (3 - redarmy->psoldier[i]->pweapon[2]->fight_num) << ")";
if (redarmy->psoldier[i]->pweapon[1] != NULL&&redarmy->psoldier[i]->pweapon[1]->exist == 1 || redarmy->psoldier[i]->pweapon[0] != NULL&&redarmy->psoldier[i]->pweapon[0]->exist == 1)
{
cout << ",";
}
}
if (redarmy->psoldier[i]->pweapon[1] != NULL&&redarmy->psoldier[i]->pweapon[1]->exist == 1) {
cout << "bomb";


if (redarmy->psoldier[i]->pweapon[0] != NULL&&redarmy->psoldier[i]->pweapon[0]->exist == 1)
cout << ",";
}
if (redarmy->psoldier[i]->pweapon[0] != NULL&&redarmy->psoldier[i]->pweapon[0]->exist == 1) {
cout << "sword(" << redarmy->psoldier[i]->pweapon[0]->power << ")";
}
if ((redarmy->psoldier[i]->pweapon[0] == NULL || redarmy->psoldier[i]->pweapon[0]->exist == 0) && (redarmy->psoldier[i]->pweapon[1] == NULL || redarmy->psoldier[i]->pweapon[1]->exist == 0) && (redarmy->psoldier[i]->pweapon[2] == NULL || redarmy->psoldier[i]->pweapon[2]->exist == 0))
cout << "no weapon";
cout << endl;
}


if (redarmy->psoldier[i]->sort_nm == 1) {
if (redarmy->psoldier[i]->pweapon[1] != NULL&&redarmy->psoldier[i]->pweapon[1]->exist == 1) {


if (redarmy->psoldier[i]->pweapon[1]->kind_no1 == 2) {
cout << "arrow(" << (3 - redarmy->psoldier[i]->pweapon[1]->fight_num) << ")";
}
if (redarmy->psoldier[i]->pweapon[1]->kind_no1 == 1) {
cout << "bomb";
}
if (redarmy->psoldier[i]->pweapon[0] != NULL&&redarmy->psoldier[i]->pweapon[0]->exist == 1)
cout << ",";
}
if (redarmy->psoldier[i]->pweapon[0] != NULL&&redarmy->psoldier[i]->pweapon[0]->exist == 1) {
if (redarmy->psoldier[i]->pweapon[0]->kind_no1 == 1) {
cout << "bomb";
}
if (redarmy->psoldier[i]->pweapon[0]->kind_no1 == 0) {
cout << "sword(" << redarmy->psoldier[i]->pweapon[0]->power << ")";
}


}
if ((redarmy->psoldier[i]->pweapon[0] == NULL || redarmy->psoldier[i]->pweapon[0]->exist == 0) && (redarmy->psoldier[i]->pweapon[1] == NULL || redarmy->psoldier[i]->pweapon[1]->exist == 0))
cout << "no weapon";
cout << endl;
}


if (redarmy->psoldier[i]->sort_nm == 0 || redarmy->psoldier[i]->sort_nm == 2) {
if (redarmy->psoldier[i]->pweapon[0] != NULL&&redarmy->psoldier[i]->pweapon[0]->exist == 1) {
if (redarmy->psoldier[i]->pweapon[0]->kind_no1 == 2) {
cout << "arrow(" << (3 - redarmy->psoldier[i]->pweapon[0]->fight_num) << ")";
}
if (redarmy->psoldier[i]->pweapon[0]->kind_no1 == 1) {
cout << "bomb";
}
if (redarmy->psoldier[i]->pweapon[0]->kind_no1 == 0) {
cout << "sword(" << redarmy->psoldier[i]->pweapon[0]->power << ")";
}


}
if (redarmy->psoldier[i]->pweapon[0] == NULL || redarmy->psoldier[i]->pweapon[0]->exist == 0)
cout << "no weapon";
cout << endl;
}
if (redarmy->psoldier[i]->sort_nm == 3) {
cout << "no weapon" << endl;
}
}
}
for (int i = 0; i < bluearmy->total_num; i++) {
{
if (bluearmy->psoldier[i]->position == 0) {
cout << setw(3) << setfill('0') << t << ":";
cout << setw(2) << minu << " blue ";
cout << soldier::names[bluearmy->psoldier[i]->sort_nm] << " " << bluearmy->psoldier[i]->num << " has ";
if (bluearmy->psoldier[i]->sort_nm == 4) {
if (bluearmy->psoldier[i]->pweapon[2] != NULL&&bluearmy->psoldier[i]->pweapon[2]->exist == 1) {
cout << "arrow(" << (3 - bluearmy->psoldier[i]->pweapon[2]->fight_num) << ")";
if (bluearmy->psoldier[i]->pweapon[1] != NULL&&bluearmy->psoldier[i]->pweapon[1]->exist == 1 || bluearmy->psoldier[i]->pweapon[0] != NULL&&bluearmy->psoldier[i]->pweapon[0]->exist == 1)
{
cout << ",";
}
}
if (bluearmy->psoldier[i]->pweapon[1] != NULL&&bluearmy->psoldier[i]->pweapon[1]->exist == 1) {
cout << "bomb";


if (bluearmy->psoldier[i]->pweapon[0] != NULL&&bluearmy->psoldier[i]->pweapon[0]->exist == 1)
cout << ",";
}
if (bluearmy->psoldier[i]->pweapon[0] != NULL&&bluearmy->psoldier[i]->pweapon[0]->exist == 1) {
cout << "sword(" << bluearmy->psoldier[bluearmy->total_num - 1]->pweapon[0]->power << ")";
}
if ((bluearmy->psoldier[i]->pweapon[0] == NULL || bluearmy->psoldier[i]->pweapon[0]->exist == 0) && (bluearmy->psoldier[i]->pweapon[1] == NULL || bluearmy->psoldier[i]->pweapon[1]->exist == 0) && (bluearmy->psoldier[i]->pweapon[2] == NULL || bluearmy->psoldier[i]->pweapon[2]->exist == 0))
cout << "no weapon";
cout << endl;
}


if (bluearmy->psoldier[i]->sort_nm == 1) {
if (bluearmy->psoldier[i]->pweapon[1] != NULL&&bluearmy->psoldier[i]->pweapon[1]->exist == 1) {


if (bluearmy->psoldier[i]->pweapon[1]->kind_no1 == 2) {
cout << "arrow(" << (3 - bluearmy->psoldier[i]->pweapon[1]->fight_num) << ")";
}
if (bluearmy->psoldier[i]->pweapon[1]->kind_no1 == 1) {
cout << "bomb";
}
if (bluearmy->psoldier[i]->pweapon[0] != NULL&&bluearmy->psoldier[i]->pweapon[0]->exist == 1)
cout << ",";
}
if (bluearmy->psoldier[i]->pweapon[0] != NULL&&bluearmy->psoldier[i]->pweapon[0]->exist == 1) {
if (bluearmy->psoldier[i]->pweapon[0]->kind_no1 == 1) {
cout << "bomb";
}
if (bluearmy->psoldier[i]->pweapon[0]->kind_no1 == 0) {
cout << "sword(" << bluearmy->psoldier[i]->pweapon[0]->power << ")";
}


}
if ((bluearmy->psoldier[i]->pweapon[0] == NULL || bluearmy->psoldier[i]->pweapon[0]->exist == 0) && (bluearmy->psoldier[i]->pweapon[1] == NULL || bluearmy->psoldier[i]->pweapon[1]->exist == 0))
cout << "no weapon";
cout << endl;
}


if (bluearmy->psoldier[i]->sort_nm == 0 || bluearmy->psoldier[i]->sort_nm == 2) {
if (bluearmy->psoldier[i]->pweapon[0] != NULL&&bluearmy->psoldier[i]->pweapon[0]->exist == 1) {
if (bluearmy->psoldier[i]->pweapon[0]->kind_no1 == 2) {
cout << "arrow(" << (3 - bluearmy->psoldier[i]->pweapon[0]->fight_num) << ")" ;
if (bluearmy->psoldier[i]->pweapon[0]->kind_no1 == 1) {
cout << "bomb";
}
if (bluearmy->psoldier[i]->pweapon[0]->kind_no1 == 0) {
cout << "sword(" << bluearmy->psoldier[i]->pweapon[0]->power << ")";
}


}
if (bluearmy->psoldier[i]->pweapon[0] == NULL || bluearmy->psoldier[i]->pweapon[0]->exist == 0)
cout << "no weapon";
cout << endl;
}
}


if (bluearmy->psoldier[i]->sort_nm == 3) {
cout << "no weapon" << endl;
}
}
}
}
for (int i = 1; i <= Num; i++) {
ct[i].printing_blue();
}





minu += 5;

for (int i = 0; i < redarmy->total_num; i++) {
redarmy->psoldier[i]->remv = 0;
if (redarmy->psoldier[i]->can_delete == 1&& redarmy->psoldier[i]->position!=Num+1) {
ct[redarmy->psoldier[i]->position].psoldier[0] = NULL;
}
}
for (int i = 0; i < bluearmy->total_num; i++) {
bluearmy->psoldier[i]->remv = 0;
if (bluearmy->psoldier[i]->can_delete == 1 && bluearmy->psoldier[i]->position != Num + 1) {
ct[bluearmy->psoldier[i]->position].psoldier[1] = NULL;
}
}




if (minu == 60) {
minu = 0;
t++;
}
if (t * 60 + minu > T)
break;

}
delete redarmy;
delete bluearmy;
for (int i = 0; i < 100; i++) {
ct[i].initial();
}
}
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、付费专栏及课程。

余额充值