【程设の旅】魔兽世界 Part3:开战
这次写完累得半死
不用类与对象的是DSB
魔兽世界 Part3:开战
描述
魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部。两个司令部之间是依次排列的若干城市,城市从西向东依次编号为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。
sword的攻击力是使用者当前攻击力的20%(去尾取整)。
bomb的攻击力是使用者当前攻击力的40%(去尾取整),但是也会导致使用者受到攻击,对使用者的攻击力是对敌人取整后的攻击力的1/2(去尾取整)。Bomb一旦使用就没了。
arrow的攻击力是使用者当前攻击力的30%(去尾取整)。一个arrow用两次就没了。
武士降生后就朝对方司令部走,在经过的城市如果遇到敌人(同一时刻每个城市最多只可能有1个蓝武士和一个红武士),就会发生战斗。战斗的规则是:
在奇数编号城市,红武士先发起攻击
在偶数编号城市,蓝武士先发起攻击
战斗开始前,双方先对自己的武器排好使用顺序,然后再一件一件地按顺序使用。编号小的武器,排在前面。若有多支arrow,用过的排在前面。排好序后,攻击者按此排序依次对敌人一件一件地使用武器。如果一种武器有多件,那就都要用上。每使用一件武器,被攻击者生命值要减去武器攻击力。如果任何一方生命值减为0或小于0即为死去。有一方死去,则战斗结束。
双方轮流使用武器,甲用过一件,就轮到乙用。某一方把自己所有的武器都用过一轮后,就从头开始再用一轮。如果某一方没有武器了,那就挨打直到死去或敌人武器用完。武器排序只在战斗前进行,战斗中不会重新排序。
如果双方武器都用完且都还活着,则战斗以平局结束。如果双方都死了,也算平局。
有可能由于武士自身攻击力太低,而导致武器攻击力为0。攻击力为0的武器也要使用。如果战斗中双方的生命值和武器的状态都不再发生变化,则战斗结束,算平局。
战斗的胜方获得对方手里的武器。武士手里武器总数不超过10件。缴获武器时,按照武器种类编号从小到大缴获。如果有多件arrow,优先缴获没用过的。
如果战斗开始前双方都没有武器,则战斗视为平局。如果先攻击方没有武器,则由后攻击方攻击。
不同的武士有不同的特点。
编号为n的dragon降生时即获得编号为n%3 的武器。dragon在战斗结束后,如果还没有战死,就会欢呼。
编号为n的ninjia降生时即获得编号为n%3 和(n+1)%3的武器。ninja 使用bomb不会让自己受伤。
编号为n的iceman降生时即获得编号为n%3 的武器。iceman每前进一步,生命值减少10%(减少的量要去尾取整)。
编号为n的lion降生时即获得编号为n%3 的武器。lion 有“忠诚度”这个属性,其初始值等于它降生之后其司令部剩余生命元的数目。每前进一步忠诚度就降低K。忠诚度降至0或0以下,则该lion逃离战场,永远消失。但是已经到达敌人司令部的lion不会逃跑。lion在己方司令部可能逃跑。
wolf降生时没有武器,但是在战斗开始前会抢到敌人编号最小的那种武器。如果敌人有多件这样的武器,则全部抢来。Wolf手里武器也不能超过10件。如果敌人arrow太多没法都抢来,那就先抢没用过的。如果敌人也是wolf,则不抢武器。
以下是不同时间会发生的不同事件:
在每个整点,即每个小时的第0分, 双方的司令部中各有一个武士降生。
红方司令部按照iceman、lion、wolf、ninja、dragon 的顺序制造武士。
蓝方司令部按照lion、dragon、ninja、iceman、wolf 的顺序制造武士。
制造武士需要生命元。
制造一个初始生命值为m 的武士,司令部中的生命元就要减少m 个。
如果司令部中的生命元不足以制造某本该造的武士,那就从此停止制造武士。
在每个小时的第5分,该逃跑的lion就在这一时刻逃跑了。
在每个小时的第10分:所有的武士朝敌人司令部方向前进一步。即从己方司令部走到相邻城市,或从一个城市走到下一个城市。或从和敌军司令部相邻的城市到达敌军司令部。
在每个小时的第35分:在有wolf及其敌人的城市,wolf要抢夺对方的武器。
在每个小时的第40分:在有两个武士的城市,会发生战斗。
在每个小时的第50分,司令部报告它拥有的生命元数量。
在每个小时的第55分,每个武士报告其拥有的武器情况。
武士到达对方司令部后就算完成任务了,从此就呆在那里无所事事。
任何一方的司令部里若是出现了敌人,则认为该司令部已被敌人占领。
任何一方的司令部被敌人占领,则战争结束。战争结束之后就不会发生任何事情了。
给定一个时间,要求你将从0点0分开始到此时间为止的所有事件按顺序输出。事件及其对应的输出样例如下:
1) 武士降生
输出样例:000:00 blue dragon 1 born
表示在0点0分,编号为1的蓝魔dragon武士降生
如果造出的是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) wolf抢敌人的武器
000:35 blue wolf 2 took 3 bomb from red dragon 2 in city 4
表示在0点35分,4号城市中,红魔1号武士wolf 抢走蓝魔2号武士dragon 3个bomb。为简单起见,武器不写复数形式
5) 报告战斗情况
战斗只有3种可能的输出结果:
000:40 red iceman 1 killed blue lion 12 in city 2 remaining 20 elements
表示在0点40分,1号城市中,红魔1号武士iceman 杀死蓝魔12号武士lion后,剩下生命值20
000:40 both red iceman 1 and blue lion 12 died in city 2
注意,把红武士写前面
000:40 both red iceman 1 and blue lion 12 were alive in city 2
注意,把红武士写前面
6) 武士欢呼
输出样例:003:40 blue dragon 2 yelled in city 4
7) 武士抵达敌军司令部
输出样例:001:10 red iceman 1 reached blue headquarter with 20 elements and force 30
(此时他生命值为20,攻击力为30)对于iceman,输出的生命值和攻击力应该是变化后的数值
8) 司令部被占领
输出样例:003:10 blue headquarter was taken
9)司令部报告生命元数量
000:50 100 elements in red headquarter
000:50 120 elements in blue headquarter
表示在0点50分,红方司令部有100个生命元,蓝方有120个
10)武士报告情况
000:55 blue wolf 2 has 2 sword 3 bomb 0 arrow and 7 elements
为简单起见,武器都不写复数形式。elements一律写复数,哪怕只有1个
交代武器情况时,次序依次是:sword,bomb, arrow。
输出事件时:
首先按时间顺序输出;
同一时间发生的事件,按发生地点从西向东依次输出. 武士前进的事件, 算是发生在目的地。
在一次战斗中有可能发生上面的 5 至 6 号事件。这些事件都算同时发生,其时间就是战斗开始时间。一次战斗中的这些事件,序号小的应该先输出。
两个武士同时抵达同一城市,则先输出红武士的前进事件,后输出蓝武士的。
对于同一城市,同一时间发生的事情,先输出红方的,后输出蓝方的。
显然,8号事件发生之前的一瞬间一定发生了7号事件。输出时,这两件事算同一时间发生,但是应先输出7号事件
虽然任何一方的司令部被占领之后,就不会有任何事情发生了。但和司令部被占领同时发生的事件,全都要输出。
输入
第一行是t,代表测试数据组数
每组样例共三行。
第一行,4个整数 M,N,K, T。其含义为:
每个司令部一开始都有M个生命元( 1 <= M <= 100000)
两个司令部之间一共有N个城市( 1 <= N <= 20 )
lion每前进一步,忠诚度就降低K。(0<=K<=100)
要求输出从0时0分开始,到时间T为止(包括T) 的所有事件。T以分钟为单位,0 <= T <= 6000
第二行:五个整数,依次是 dragon 、ninja、iceman、lion、wolf 的初始生命值。它们都大于0小于等于200
第三行:五个整数,依次是 dragon 、ninja、iceman、lion、wolf 的攻击力。它们都大于0小于等于200
输出
对每组数据,先输出一行:
Case n:
如对第一组数据就输出 Case 1:
然后按恰当的顺序和格式输出到时间T为止发生的所有事件。每个事件都以事件发生的时间开头,时间格式是“时: 分”,“时”有三位,“分”有两位。
样例输入
1
20 1 10 400
20 20 30 10 20
5 5 5 5 5
样例输出
Case 1:
000:00 blue lion 1 born
Its loyalty is 10
000:10 blue lion 1 marched to city 1 with 10 elements and force 5
000:50 20 elements in red headquarter
000:50 10 elements in blue headquarter
000:55 blue lion 1 has 0 sword 1 bomb 0 arrow and 10 elements
001:05 blue lion 1 ran away
001:50 20 elements in red headquarter
001:50 10 elements in blue headquarter
002:50 20 elements in red headquarter
002:50 10 elements in blue headquarter
003:50 20 elements in red headquarter
003:50 10 elements in blue headquarter
004:50 20 elements in red headquarter
004:50 10 elements in blue headquarter
005:50 20 elements in red headquarter
005:50 10 elements in blue headquarter
提示
请注意浮点数精度误差问题。OJ上的编译器编译出来的可执行程序,在这方面和你电脑上执行的程序很可能会不一致。5 * 0.3 的结果,有的机器上可能是 15.00000001,去尾取整得到15,有的机器上可能是14.9999999,去尾取整后就变成14。因此,本题不要写 5 * 0.3,要写 5 * 3 / 10。
直接放代码吧
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int m,n,k,t,z;
int rm,bm;
struct node{
int bloo,atta;
string s;
};
node q[6];
int tim,proces;
int rcnt,bcnt;
int rwin,bwin;
int r_warrior_num,b_warrior_num;//两个阵营的士兵数
int rnum[6],bnum[6];//各个种族产生的人数
int r[6]={0,3,4,5,2,1},b[6]={0,4,1,2,3,5};
int step[8]={0,5,5,25,5,10,5,5};
int rflag=0,bflag=0;
int city[25][2];//表示该城市是否有红/蓝阵营,第二维的数字表示红蓝士兵编号
struct warrior{
int cnt_sword,cnt_bomb,cnt_arrow;//剑、炸弹、箭的数量
int cnt_used_arrow,cnt_never_used_arrow;//使用过的箭的数量
int cnt_total_weapon;//总武器的数量
int bloo,atta;//士兵的生命值和攻击力
int catagory;//这个士兵是哪个种类的
int walk_city;//到达哪个城市
int loyalty;//忠诚度
int pd_if_live;//死了没
int id;//这是该种的第几只
int weapon[11];
};
warrior red_warrior[105],blue_warrior[105];
void trans(int k){
if(k>=0&&k<=9) cout<<"00"<<k;
else if(k>=10&&k<=99) cout<<'0'<<k;
else cout<<k;
return ;
}
void output(int x){
if(x>=0&&x<=9) cout<<"000:0"<<x<<' ';
else if(x>=10&&x<=59) cout<<"000:"<<x<<' ';
else{
int k=x/60,j=x%60;
trans(k);
if(j>=0&&j<=9) cout<<":0"<<j<<' ';
else cout<<':'<<j<<' ';
}
return ;
}
void r_making_weapon_dragon(int number){
if(number%3==0){
red_warrior[r_warrior_num].cnt_total_weapon++;
red_warrior[r_warrior_num].cnt_sword++;
}
else if(number%3==1){
red_warrior[r_warrior_num].cnt_total_weapon++;
red_warrior[r_warrior_num].cnt_bomb++;
}
else if(number%3==2){
red_warrior[r_warrior_num].cnt_total_weapon++;
red_warrior[r_warrior_num].cnt_arrow++;
red_warrior[r_warrior_num].cnt_never_used_arrow++;
}
}
void b_making_weapon_dragon(int number){
if(number%3==0){
blue_warrior[b_warrior_num].cnt_total_weapon++;
blue_warrior[b_warrior_num].cnt_sword++;
}
else if(number%3==1){
blue_warrior[b_warrior_num].cnt_total_weapon++;
blue_warrior[b_warrior_num].cnt_bomb++;
}
else if(number%3==2){
blue_warrior[b_warrior_num].cnt_total_weapon++;
blue_warrior[b_warrior_num].cnt_arrow++;
blue_warrior[b_warrior_num].cnt_never_used_arrow++;
}
}
void r_making_weapon_ninja(int number){
if(number%3==0){
red_warrior[r_warrior_num].cnt_total_weapon++;
red_warrior[r_warrior_num].cnt_sword++;
red_warrior[r_warrior_num].cnt_bomb++;
red_warrior[r_warrior_num].cnt_total_weapon++;
}
else if(number%3==1){
red_warrior[r_warrior_num].cnt_total_weapon++;
red_warrior[r_warrior_num].cnt_arrow++;
red_warrior[r_warrior_num].cnt_bomb++;
red_warrior[r_warrior_num].cnt_total_weapon++;
red_warrior[r_warrior_num].cnt_never_used_arrow++;
}
else if(number%3==2){
red_warrior[r_warrior_num].cnt_total_weapon++;
red_warrior[r_warrior_num].cnt_sword++;
red_warrior[r_warrior_num].cnt_arrow++;
red_warrior[r_warrior_num].cnt_total_weapon++;
red_warrior[r_warrior_num].cnt_never_used_arrow++;
}
}
void b_making_weapon_ninja(int number){
if(number%3==0){
blue_warrior[b_warrior_num].cnt_total_weapon++;
blue_warrior[b_warrior_num].cnt_sword++;
blue_warrior[b_warrior_num].cnt_bomb++;
blue_warrior[b_warrior_num].cnt_total_weapon++;
}
else if(number%3==1){
blue_warrior[b_warrior_num].cnt_total_weapon++;
blue_warrior[b_warrior_num].cnt_arrow++;
blue_warrior[b_warrior_num].cnt_bomb++;
blue_warrior[b_warrior_num].cnt_total_weapon++;
blue_warrior[b_warrior_num].cnt_never_used_arrow++;
}
else if(number%3==2){
blue_warrior[b_warrior_num].cnt_total_weapon++;
blue_warrior[b_warrior_num].cnt_sword++;
blue_warrior[b_warrior_num].cnt_arrow++;
blue_warrior[b_warrior_num].cnt_total_weapon++;
blue_warrior[b_warrior_num].cnt_never_used_arrow++;
}
}
void r_making_weapon_iceman(int number){
if(number%3==0){
red_warrior[r_warrior_num].cnt_total_weapon++;
red_warrior[r_warrior_num].cnt_sword++;
}
else if(number%3==1){
red_warrior[r_warrior_num].cnt_total_weapon++;
red_warrior[r_warrior_num].cnt_bomb++;
}
else if(number%3==2){
red_warrior[r_warrior_num].cnt_total_weapon++;
red_warrior[r_warrior_num].cnt_arrow++;
red_warrior[r_warrior_num].cnt_never_used_arrow++;
}
}
void b_making_weapon_iceman(int number){
if(number%3==0){
blue_warrior[b_warrior_num].cnt_total_weapon++;
blue_warrior[b_warrior_num].cnt_sword++;
}
else if(number%3==1){
blue_warrior[b_warrior_num].cnt_total_weapon++;
blue_warrior[b_warrior_num].cnt_bomb++;
}
else if(number%3==2){
blue_warrior[b_warrior_num].cnt_total_weapon++;
blue_warrior[b_warrior_num].cnt_arrow++;
blue_warrior[b_warrior_num].cnt_never_used_arrow++;
}
}
void r_making_weapon_lion(int number){
if(number%3==0){
red_warrior[r_warrior_num].cnt_total_weapon++;
red_warrior[r_warrior_num].cnt_sword++;
}
else if(number%3==1){
red_warrior[r_warrior_num].cnt_total_weapon++;
red_warrior[r_warrior_num].cnt_bomb++;
}
else if(number%3==2){
red_warrior[r_warrior_num].cnt_total_weapon++;
red_warrior[r_warrior_num].cnt_arrow++;
red_warrior[r_warrior_num].cnt_never_used_arrow++;
}
red_warrior[r_warrior_num].loyalty=rm;
}
void b_making_weapon_lion(int number){
if(number%3==0){
blue_warrior[b_warrior_num].cnt_total_weapon++;
blue_warrior[b_warrior_num].cnt_sword++;
}
else if(number%3==1){
blue_warrior[b_warrior_num].cnt_total_weapon++;
blue_warrior[b_warrior_num].cnt_bomb++;
}
else if(number%3==2){
blue_warrior[b_warrior_num].cnt_total_weapon++;
blue_warrior[b_warrior_num].cnt_arrow++;
blue_warrior[b_warrior_num].cnt_never_used_arrow++;
}
blue_warrior[b_warrior_num].loyalty=bm;
}
void r_birth(){
if(rm>=q[r[rcnt]].bloo){
rm-=q[r[rcnt]].bloo;
rnum[r[rcnt]]++;
r_warrior_num++;
red_warrior[r_warrior_num].bloo=q[r[rcnt]].bloo;
red_warrior[r_warrior_num].catagory=r[rcnt];
red_warrior[r_warrior_num].pd_if_live=1;
red_warrior[r_warrior_num].atta=q[r[rcnt]].atta;
red_warrior[r_warrior_num].cnt_used_arrow=0;
red_warrior[r_warrior_num].walk_city=0;
red_warrior[r_warrior_num].id=r_warrior_num;
city[0][0]=1;
if(r[rcnt]==1) r_making_weapon_dragon(r_warrior_num);
else if(r[rcnt]==2) r_making_weapon_ninja(r_warrior_num);
else if(r[rcnt]==3) r_making_weapon_iceman(r_warrior_num);
else if(r[rcnt]==4) r_making_weapon_lion(r_warrior_num);
output(tim);
cout<<"red "<<q[r[rcnt]].s<<' '<<red_warrior[r_warrior_num].id<<" born"<<endl;
if(r[rcnt]==4){
cout<<"Its loyalty is "<<red_warrior[r_warrior_num].loyalty<<endl;
}
return ;
}
else if(rm<q[r[rcnt]].bloo){
rflag=1;
return ;
}
}
void b_birth(){
if(bm>=q[b[bcnt]].bloo){
bm-=q[b[bcnt]].bloo;
bnum[b[bcnt]]++;
b_warrior_num++;
blue_warrior[b_warrior_num].id=b_warrior_num;
blue_warrior[b_warrior_num].bloo=q[b[bcnt]].bloo;
blue_warrior[b_warrior_num].catagory=b[bcnt];
blue_warrior[b_warrior_num].pd_if_live=1;
blue_warrior[b_warrior_num].atta=q[b[bcnt]].atta;
blue_warrior[b_warrior_num].cnt_used_arrow=0;
blue_warrior[b_warrior_num].walk_city=n+1;
city[n+1][1]=1;
if(b[bcnt]==1) b_making_weapon_dragon(b_warrior_num);
else if(b[bcnt]==2) b_making_weapon_ninja(b_warrior_num);
else if(b[bcnt]==3) b_making_weapon_iceman(b_warrior_num);
else if(b[bcnt]==4) b_making_weapon_lion(b_warrior_num);
output(tim);
cout<<"blue "<<q[b[bcnt]].s<<' '<<blue_warrior[b_warrior_num].id<<" born"<<endl;
if(b[bcnt]==4){
cout<<"Its loyalty is "<<blue_warrior[b_warrior_num].loyalty<<endl;
}
return ;
}
else if(bm<q[b[bcnt]].bloo){
bflag=1;
return ;
}
}
void r_check_lion(int t){
for(int i=1;i<=r_warrior_num;i++){
if(red_warrior[i].catagory==4&&red_warrior[i].loyalty<=0&&red_warrior[i].pd_if_live==1){
red_warrior[i].pd_if_live=0;
city[red_warrior[i].walk_city][0]=0;
output(t);
cout<<"red lion "<<red_warrior[i].id<<" ran away"<<endl;
}
}
}
void b_check_lion(int t){
for(int i=1;i<=b_warrior_num;i++){
if(blue_warrior[i].catagory==4&&blue_warrior[i].loyalty<=0&&blue_warrior[i].pd_if_live==1){
blue_warrior[i].pd_if_live=0;
city[blue_warrior[i].walk_city][1]=0;
output(t);
cout<<"blue lion "<<blue_warrior[i].id<<" ran away"<<endl;
}
}
}
void r_move(int t){
for(int i=1;i<=r_warrior_num;i++){
if(!red_warrior[i].pd_if_live) continue;
if(red_warrior[i].catagory==3){
int temp=red_warrior[i].bloo/10;
red_warrior[i].bloo-=temp;
if(red_warrior[i].bloo<=0){
red_warrior[i].pd_if_live=0;
city[red_warrior[i].walk_city][0]=0;
continue;
}
}
city[red_warrior[i].walk_city][0]=0;
red_warrior[i].walk_city++;
city[red_warrior[i].walk_city][0]=i;
if(red_warrior[i].catagory==4){
red_warrior[i].loyalty-=k;
}
}
}
void b_move(int t){
for(int i=1;i<=b_warrior_num;i++){
if(!blue_warrior[i].pd_if_live) continue;
if(blue_warrior[i].catagory==3){
int temp=blue_warrior[i].bloo/10;
blue_warrior[i].bloo-=temp;
if(blue_warrior[i].bloo<=0){
blue_warrior[i].pd_if_live=0;
city[blue_warrior[i].walk_city][1]=0;
continue;
}
}
city[blue_warrior[i].walk_city][1]=0;
blue_warrior[i].walk_city--;
city[blue_warrior[i].walk_city][1]=i;
if(blue_warrior[i].catagory==4){
blue_warrior[i].loyalty-=k;
}
}
}
void move_output(int t){
if(city[0][1]){
output(t);
int k=city[0][1];
cout<<"blue "<<q[blue_warrior[k].catagory].s<<' '<<blue_warrior[k].id;
cout<<" reached red headquarter with "<<blue_warrior[k].bloo;
cout<<" elements and force "<<blue_warrior[k].atta<<endl;
output(t);
cout<<"red headquarter was taken"<<endl;
bwin=1;
}
for(int i=1;i<=n;i++){
if(city[i][0]){
int k=city[i][0];
if(red_warrior[k].pd_if_live){
output(t);
cout<<"red "<<q[red_warrior[k].catagory].s<<' '<<red_warrior[k].id;
cout<<" marched to city "<<i<<' '<<"with "<<red_warrior[k].bloo;
cout<<" elements and force "<<red_warrior[k].atta<<endl;
}
}
if(city[i][1]){
int k=city[i][1];
if(blue_warrior[k].pd_if_live){
output(t);
cout<<"blue "<<q[blue_warrior[k].catagory].s<<' '<<blue_warrior[k].id;
cout<<" marched to city "<<i<<' '<<"with "<<blue_warrior[k].bloo;
cout<<" elements and force "<<blue_warrior[k].atta<<endl;
}
}
}
if(city[n+1][0]){
output(t);
int k=city[n+1][0];
cout<<"red "<<q[red_warrior[k].catagory].s<<' '<<red_warrior[k].id;
cout<<" reached blue headquarter with "<<red_warrior[k].bloo;
cout<<" elements and force "<<red_warrior[k].atta<<endl;
output(t);
cout<<"blue headquarter was taken"<<endl;
rwin=1;
}
return ;
}
void r_steal(int x,int y,int city,int t){
int res=10-red_warrior[x].cnt_total_weapon;
int steal=0;
if(blue_warrior[y].cnt_sword!=0){
if(res>=blue_warrior[y].cnt_sword){
steal=blue_warrior[y].cnt_sword;
red_warrior[x].cnt_sword+=blue_warrior[y].cnt_sword;
red_warrior[x].cnt_total_weapon+=blue_warrior[y].cnt_sword;
blue_warrior[y].cnt_total_weapon-=blue_warrior[y].cnt_sword;
blue_warrior[y].cnt_sword=0;
}
else{
red_warrior[x].cnt_sword+=res;
red_warrior[x].cnt_total_weapon+=res;
blue_warrior[y].cnt_sword-=res;
blue_warrior[y].cnt_total_weapon-=res;
steal=res;
}
output(t);
cout<<"red wolf "<<red_warrior[x].id<<" took "<<steal<<" sword from blue ";
cout<<q[blue_warrior[y].catagory].s<<' '<<blue_warrior[y].id<<" in city "<<city<<endl;
return ;
}
else if(blue_warrior[y].cnt_bomb!=0){
if(res>=blue_warrior[y].cnt_bomb){
steal=blue_warrior[y].cnt_bomb;
red_warrior[x].cnt_bomb+=blue_warrior[y].cnt_bomb;
red_warrior[x].cnt_total_weapon+=blue_warrior[y].cnt_bomb;
blue_warrior[y].cnt_total_weapon-=blue_warrior[y].cnt_bomb;
blue_warrior[y].cnt_bomb=0;
}
else{
red_warrior[x].cnt_bomb+=res;
red_warrior[x].cnt_total_weapon+=res;
blue_warrior[y].cnt_bomb-=res;
blue_warrior[y].cnt_total_weapon-=res;
steal=res;
}
output(t);
cout<<"red wolf "<<red_warrior[x].id<<" took "<<steal<<" bomb from blue ";
cout<<q[blue_warrior[y].catagory].s<<' '<<blue_warrior[y].id<<" in city "<<city<<endl;
return ;
}
else if(blue_warrior[y].cnt_arrow!=0){
if(res<=blue_warrior[y].cnt_never_used_arrow){
red_warrior[x].cnt_never_used_arrow+=res;
red_warrior[x].cnt_arrow+=res;
red_warrior[x].cnt_total_weapon+=res;
blue_warrior[y].cnt_never_used_arrow-=res;
blue_warrior[y].cnt_arrow-=res;
blue_warrior[y].cnt_total_weapon-=res;
steal=res;
}
else if(res>blue_warrior[y].cnt_never_used_arrow&&res<=blue_warrior[y].cnt_arrow){
red_warrior[x].cnt_never_used_arrow+=blue_warrior[y].cnt_never_used_arrow;
red_warrior[x].cnt_used_arrow+=res-blue_warrior[y].cnt_never_used_arrow;
red_warrior[x].cnt_arrow+=res;
red_warrior[x].cnt_total_weapon+=res;
blue_warrior[y].cnt_arrow-=res;
blue_warrior[y].cnt_used_arrow-=res-blue_warrior[y].cnt_never_used_arrow;
blue_warrior[y].cnt_never_used_arrow=0;
blue_warrior[y].cnt_total_weapon-=res;
steal=res;
}
else if(res>blue_warrior[y].cnt_arrow){
steal=blue_warrior[y].cnt_arrow;
red_warrior[x].cnt_arrow+=blue_warrior[y].cnt_arrow;
red_warrior[x].cnt_never_used_arrow+=blue_warrior[y].cnt_never_used_arrow;
red_warrior[x].cnt_used_arrow+=blue_warrior[y].cnt_used_arrow;
red_warrior[x].cnt_total_weapon+=blue_warrior[y].cnt_arrow;
blue_warrior[y].cnt_never_used_arrow=0;
blue_warrior[y].cnt_used_arrow=0;
blue_warrior[y].cnt_total_weapon-=blue_warrior[y].cnt_arrow;
blue_warrior[y].cnt_arrow=0;
}
output(t);
cout<<"red wolf "<<red_warrior[x].id<<" took "<<steal<<" arrow from blue ";
cout<<q[blue_warrior[y].catagory].s<<' '<<blue_warrior[y].id<<" in city "<<city<<endl;
return ;
}
}
void b_steal(int x,int y,int city,int t){
int res=10-blue_warrior[x].cnt_total_weapon;
int steal=0;
if(red_warrior[y].cnt_sword!=0){
if(res>=red_warrior[y].cnt_sword){
steal=red_warrior[y].cnt_sword;
blue_warrior[x].cnt_sword+=red_warrior[y].cnt_sword;
blue_warrior[x].cnt_total_weapon+=red_warrior[y].cnt_sword;
red_warrior[y].cnt_total_weapon-=red_warrior[y].cnt_sword;
red_warrior[y].cnt_sword=0;
}
else{
blue_warrior[x].cnt_sword+=res;
blue_warrior[x].cnt_total_weapon+=res;
red_warrior[y].cnt_sword-=res;
red_warrior[y].cnt_total_weapon-=res;
steal=res;
}
output(t);
cout<<"blue wolf "<<blue_warrior[x].id<<" took "<<steal<<" sword from red ";
cout<<q[red_warrior[y].catagory].s<<' '<<red_warrior[y].id<<" in city "<<city<<endl;
return ;
}
else if(red_warrior[y].cnt_bomb!=0){
if(res>=red_warrior[y].cnt_bomb){
steal=red_warrior[y].cnt_bomb;
blue_warrior[x].cnt_bomb+=red_warrior[y].cnt_bomb;
blue_warrior[x].cnt_total_weapon+=red_warrior[y].cnt_bomb;
red_warrior[y].cnt_total_weapon-=red_warrior[y].cnt_bomb;
red_warrior[y].cnt_bomb=0;
}
else{
blue_warrior[x].cnt_bomb+=res;
blue_warrior[x].cnt_total_weapon+=res;
red_warrior[y].cnt_bomb-=res;
red_warrior[y].cnt_total_weapon-=res;
steal=res;
}
output(t);
cout<<"blue wolf "<<blue_warrior[x].id<<" took "<<steal<<" bomb from red ";
cout<<q[red_warrior[y].catagory].s<<' '<<red_warrior[y].id<<" in city "<<city<<endl;
return ;
}
else if(blue_warrior[y].cnt_arrow!=0){
if(res<=red_warrior[y].cnt_never_used_arrow){
blue_warrior[x].cnt_never_used_arrow+=res;
blue_warrior[x].cnt_arrow+=res;
blue_warrior[x].cnt_total_weapon+=res;
red_warrior[y].cnt_never_used_arrow-=res;
red_warrior[y].cnt_arrow-=res;
red_warrior[y].cnt_total_weapon-=res;
steal=res;
}
else if(res>red_warrior[y].cnt_never_used_arrow&&res<=red_warrior[y].cnt_arrow){
blue_warrior[x].cnt_never_used_arrow+=red_warrior[y].cnt_never_used_arrow;
blue_warrior[x].cnt_used_arrow+=res-red_warrior[y].cnt_never_used_arrow;
blue_warrior[x].cnt_arrow+=res;
blue_warrior[x].cnt_total_weapon+=res;
red_warrior[y].cnt_arrow-=res;
red_warrior[y].cnt_used_arrow-=res-red_warrior[y].cnt_never_used_arrow;
red_warrior[y].cnt_never_used_arrow=0;
red_warrior[y].cnt_total_weapon-=res;
steal=res;
}
else if(res>red_warrior[y].cnt_arrow){
steal=red_warrior[y].cnt_arrow;
blue_warrior[x].cnt_arrow+=red_warrior[y].cnt_arrow;
blue_warrior[x].cnt_never_used_arrow+=red_warrior[y].cnt_never_used_arrow;
blue_warrior[x].cnt_used_arrow+=red_warrior[y].cnt_used_arrow;
blue_warrior[x].cnt_total_weapon+=red_warrior[y].cnt_arrow;
red_warrior[y].cnt_never_used_arrow=0;
red_warrior[y].cnt_used_arrow=0;
red_warrior[y].cnt_total_weapon-=red_warrior[y].cnt_arrow;
red_warrior[y].cnt_arrow=0;
}
output(t);
cout<<"blue wolf "<<blue_warrior[x].id<<" took "<<steal<<" arrow from red ";
cout<<q[red_warrior[y].catagory].s<<' '<<red_warrior[y].id<<" in city "<<city<<endl;
return ;
}
}
void wolf_try_to_steal(int t){
for(int i=1;i<=n;i++){
if(!(city[i][0]&&city[i][1])) continue;
int x=city[i][0],y=city[i][1];
if(red_warrior[x].catagory==5&&blue_warrior[y].catagory==5) continue;
if(red_warrior[x].catagory==5){
r_steal(x,y,i,t);
}
else if(blue_warrior[y].catagory==5){
b_steal(y,x,i,t);
}
}
}
void r_announce_blood(int t){
output(t);
cout<<rm<<" elements in red headquarter"<<endl;
}
void b_announce_blood(int t){
output(t);
cout<<bm<<" elements in blue headquarter"<<endl;
}
void output_warrior(int t){
for(int i=1;i<=n;i++){
if(city[i][0]){
int k=city[i][0];
if(red_warrior[k].pd_if_live){
output(t);
cout<<"red "<<q[red_warrior[k].catagory].s<<' '<<red_warrior[k].id<<" has ";
cout<<red_warrior[k].cnt_sword<<" sword ";
cout<<red_warrior[k].cnt_bomb<<" bomb ";
cout<<red_warrior[k].cnt_arrow<<" arrow and ";
cout<<red_warrior[k].bloo<<" elements"<<endl;
}
}
if(city[i][1]){
int k=city[i][1];
if(blue_warrior[k].pd_if_live){
output(t);
cout<<"blue "<<q[blue_warrior[k].catagory].s<<' '<<blue_warrior[k].id<<" has ";
cout<<blue_warrior[k].cnt_sword<<" sword ";
cout<<blue_warrior[k].cnt_bomb<<" bomb ";
cout<<blue_warrior[k].cnt_arrow<<" arrow and ";
cout<<blue_warrior[k].bloo<<" elements"<<endl;
}
}
}
}
void red_sword_attack(int x,int y,int number){
int temp=red_warrior[x].atta*2/10;
blue_warrior[y].bloo-=temp;
}
void red_bomb_attack(int x,int y,int number){
int temp=red_warrior[x].atta*4/10;
blue_warrior[y].bloo-=temp;
if(red_warrior[x].catagory==2){
return ;
}
else{
int tem=temp/2;
red_warrior[x].bloo-=tem;
return ;
}
}
void red_used_arrow_attack(int x,int y,int number){
int temp=red_warrior[x].atta*3/10;
blue_warrior[y].bloo-=temp;
return ;
}
void red_not_used_arrow_attack(int x,int y,int number){
int temp=red_warrior[x].atta*3/10;
blue_warrior[y].bloo-=temp;
return ;
}
void blue_sword_attack(int x,int y,int number){
int temp=blue_warrior[x].atta*2/10;
red_warrior[y].bloo-=temp;
}
void blue_bomb_attack(int x,int y,int number){
int temp=blue_warrior[x].atta*4/10;
red_warrior[y].bloo-=temp;
if(blue_warrior[x].catagory==2){
return ;
}
else{
int tem=temp/2;
blue_warrior[x].bloo-=tem;
return ;
}
}
void blue_used_arrow_attack(int x,int y,int number){
int temp=blue_warrior[x].atta*3/10;
red_warrior[y].bloo-=temp;
return ;
}
void blue_not_used_arrow_attack(int x,int y,int number){
int temp=blue_warrior[x].atta*3/10;
red_warrior[y].bloo-=temp;
return ;
}
void r_trans(int x,int number){
int temp=red_warrior[x].weapon[number];
if(temp==1) return ;
else if(temp==2) red_warrior[x].weapon[number]=0;
else if(temp==3) red_warrior[x].weapon[number]=0;
else if(temp==4) red_warrior[x].weapon[number]=3;
}
void b_trans(int x,int number){
int temp=blue_warrior[x].weapon[number];
if(temp==1) return ;
else if(temp==2) blue_warrior[x].weapon[number]=0;
else if(temp==3) blue_warrior[x].weapon[number]=0;
else if(temp==4) blue_warrior[x].weapon[number]=3;
}
void update(int x,int pd){
if(pd==0){
int temp=0;
red_warrior[x].cnt_sword=0;red_warrior[x].cnt_bomb=0;
red_warrior[x].cnt_never_used_arrow=0;red_warrior[x].cnt_used_arrow=0;
red_warrior[x].cnt_arrow=0;
for(int i=1;i<=red_warrior[x].cnt_total_weapon;i++){
if(!red_warrior[x].weapon[i]) continue;
else if(red_warrior[x].weapon[i]==1){
temp++;
red_warrior[x].cnt_sword++;
}
else if(red_warrior[x].weapon[i]==2){
temp++;
red_warrior[x].cnt_bomb++;
}
else if(red_warrior[x].weapon[i]==3){
temp++;
red_warrior[x].cnt_used_arrow++;red_warrior[x].cnt_arrow++;
}
else if(red_warrior[x].weapon[i]==4){
temp++;
red_warrior[x].cnt_never_used_arrow++;red_warrior[x].cnt_arrow++;
}
}
red_warrior[x].cnt_total_weapon=temp;
return ;
}
else if(pd==1){
int temp=0;
blue_warrior[x].cnt_sword=0;blue_warrior[x].cnt_bomb=0;
blue_warrior[x].cnt_never_used_arrow=0;blue_warrior[x].cnt_used_arrow=0;
blue_warrior[x].cnt_arrow=0;
for(int i=1;i<=blue_warrior[x].cnt_total_weapon;i++){
if(!blue_warrior[x].weapon[i]) continue;
else if(blue_warrior[x].weapon[i]==1){
temp++;
blue_warrior[x].cnt_sword++;
}
else if(blue_warrior[x].weapon[i]==2){
temp++;
blue_warrior[x].cnt_bomb++;
}
else if(blue_warrior[x].weapon[i]==3){
temp++;
blue_warrior[x].cnt_used_arrow++;blue_warrior[x].cnt_arrow++;
}
else if(blue_warrior[x].weapon[i]==4){
temp++;
blue_warrior[x].cnt_never_used_arrow++;blue_warrior[x].cnt_arrow++;
}
}
blue_warrior[x].cnt_total_weapon=temp;
return ;
}
}
void get(int x,int y,int pd){
if(pd==1){
int res=10-blue_warrior[x].cnt_total_weapon;
if(res<=red_warrior[y].cnt_sword){
blue_warrior[x].cnt_total_weapon+=res;
blue_warrior[x].cnt_sword+=res;
return ;
}
else if(res>red_warrior[y].cnt_sword&&res<=red_warrior[y].cnt_sword+red_warrior[y].cnt_bomb){
blue_warrior[x].cnt_total_weapon+=res;
blue_warrior[x].cnt_sword+=red_warrior[y].cnt_sword;
blue_warrior[x].cnt_bomb+=res-red_warrior[y].cnt_sword;
return ;
}
else if(res>red_warrior[y].cnt_sword+red_warrior[y].cnt_bomb&&res<=red_warrior[y].cnt_sword+red_warrior[y].cnt_bomb+red_warrior[y].cnt_never_used_arrow){
blue_warrior[x].cnt_sword+=red_warrior[y].cnt_sword;
blue_warrior[x].cnt_bomb+=red_warrior[y].cnt_bomb;
blue_warrior[x].cnt_never_used_arrow+=res-red_warrior[y].cnt_sword-red_warrior[y].cnt_bomb;
blue_warrior[x].cnt_arrow+=res-red_warrior[y].cnt_sword-red_warrior[y].cnt_bomb;
blue_warrior[x].cnt_total_weapon+=res;
return ;
}
else if(res>red_warrior[y].cnt_sword+red_warrior[y].cnt_bomb+red_warrior[y].cnt_never_used_arrow&&res<=red_warrior[y].cnt_total_weapon){
blue_warrior[x].cnt_total_weapon+=res;
blue_warrior[x].cnt_sword+=red_warrior[y].cnt_sword;
blue_warrior[x].cnt_bomb+=red_warrior[y].cnt_bomb;
blue_warrior[x].cnt_never_used_arrow+=red_warrior[y].cnt_never_used_arrow;
blue_warrior[x].cnt_used_arrow+=res-red_warrior[y].cnt_sword-red_warrior[y].cnt_bomb-red_warrior[y].cnt_never_used_arrow;
blue_warrior[x].cnt_arrow+=res-red_warrior[y].cnt_sword-red_warrior[y].cnt_bomb;
return ;
}
else if(res>red_warrior[y].cnt_total_weapon){
blue_warrior[x].cnt_total_weapon+=red_warrior[y].cnt_total_weapon;
blue_warrior[x].cnt_sword+=red_warrior[y].cnt_sword;
blue_warrior[x].cnt_bomb+=red_warrior[y].cnt_bomb;
blue_warrior[x].cnt_never_used_arrow+=red_warrior[y].cnt_never_used_arrow;
blue_warrior[x].cnt_used_arrow+=red_warrior[y].cnt_used_arrow;
blue_warrior[x].cnt_arrow+=red_warrior[y].cnt_arrow;
return ;
}
}
else if(pd==0){
int res=10-red_warrior[x].cnt_total_weapon;
if(res<=blue_warrior[y].cnt_sword){
red_warrior[x].cnt_total_weapon+=res;
red_warrior[x].cnt_sword+=res;
return ;
}
else if(res>blue_warrior[y].cnt_sword&&res<=blue_warrior[y].cnt_sword+blue_warrior[y].cnt_bomb){
red_warrior[x].cnt_total_weapon+=res;
red_warrior[x].cnt_sword+=blue_warrior[y].cnt_sword;
red_warrior[x].cnt_bomb+=res-blue_warrior[y].cnt_sword;
return ;
}
else if(res>blue_warrior[y].cnt_sword+blue_warrior[y].cnt_bomb&&res<=blue_warrior[y].cnt_sword+blue_warrior[y].cnt_bomb+blue_warrior[y].cnt_never_used_arrow){
red_warrior[x].cnt_sword+=blue_warrior[y].cnt_sword;
red_warrior[x].cnt_bomb+=blue_warrior[y].cnt_bomb;
red_warrior[x].cnt_never_used_arrow+=res-blue_warrior[y].cnt_sword-blue_warrior[y].cnt_bomb;
red_warrior[x].cnt_arrow+=res-blue_warrior[y].cnt_sword-blue_warrior[y].cnt_bomb;
red_warrior[x].cnt_total_weapon+=res;
return ;
}
else if(res>blue_warrior[y].cnt_sword+blue_warrior[y].cnt_bomb+blue_warrior[y].cnt_never_used_arrow&&res<=blue_warrior[y].cnt_total_weapon){
red_warrior[x].cnt_total_weapon+=res;
red_warrior[x].cnt_sword+=blue_warrior[y].cnt_sword;
red_warrior[x].cnt_bomb+=blue_warrior[y].cnt_bomb;
red_warrior[x].cnt_never_used_arrow+=blue_warrior[y].cnt_never_used_arrow;
red_warrior[x].cnt_used_arrow+=res-blue_warrior[y].cnt_sword-blue_warrior[y].cnt_bomb-blue_warrior[y].cnt_never_used_arrow;
red_warrior[x].cnt_arrow+=res-blue_warrior[y].cnt_sword-blue_warrior[y].cnt_bomb;
return ;
}
else if(res>blue_warrior[y].cnt_total_weapon){
red_warrior[x].cnt_total_weapon+=blue_warrior[y].cnt_total_weapon;
red_warrior[x].cnt_sword+=blue_warrior[y].cnt_sword;
red_warrior[x].cnt_bomb+=blue_warrior[y].cnt_bomb;
red_warrior[x].cnt_never_used_arrow+=blue_warrior[y].cnt_never_used_arrow;
red_warrior[x].cnt_used_arrow+=blue_warrior[y].cnt_used_arrow;
red_warrior[x].cnt_arrow+=blue_warrior[y].cnt_arrow;
return ;
}
}
}
bool r_check_attack(int x){
bool f=true;
for(int i=1;i<=red_warrior[x].cnt_total_weapon;i++){
int temp=0;
if(red_warrior[x].weapon[i]==1) temp=red_warrior[x].atta*2/10;
else if(red_warrior[x].weapon[i]==2) temp=red_warrior[x].atta*4/10;
else if(red_warrior[x].weapon[i]==3||red_warrior[x].weapon[i]==4) temp=red_warrior[x].atta*3/10;
if(temp>0){
f=false;
break;
}
}
return f;
}
bool b_check_attack(int x){
bool f=true;
for(int i=1;i<=blue_warrior[x].cnt_total_weapon;i++){
int temp=0;
if(blue_warrior[x].weapon[i]==1) temp=blue_warrior[x].atta*2/10;
else if(blue_warrior[x].weapon[i]==2) temp=blue_warrior[x].atta*4/10;
else if(blue_warrior[x].weapon[i]==3||blue_warrior[x].weapon[i]==4) temp=blue_warrior[x].atta*3/10;
if(temp>0){
f=false;
break;
}
}
return f;
}
bool r_check_if_only_sword(int x){
bool f=true;int k=0;
for(int i=1;i<=red_warrior[x].cnt_total_weapon;i++){
if(red_warrior[x].weapon[i]==1) k++;
else if(red_warrior[x].weapon[i]==2||red_warrior[x].weapon[i]==3||red_warrior[x].weapon[i]==4){
f=false;
break;
}
}
return f;
}
bool b_check_if_only_sword(int x){
bool f=true;int k=0;
for(int i=1;i<=blue_warrior[x].cnt_total_weapon;i++){
if(blue_warrior[x].weapon[i]==1) k++;
else if(blue_warrior[x].weapon[i]==2||blue_warrior[x].weapon[i]==3||blue_warrior[x].weapon[i]==4){
f=false;
break;
}
}
return f;
}//这两个函数的意义是防止有哑弹/哑箭就跳出 因此要检验这两种情况 1.无哑弹哑箭 2.只有剑?
void actual_fight(int x,int y,int c,int t,int pd){
int flag;
if(pd==1) flag=1;
else flag=0;
int red_weapon=1,blue_weapon=1;//红蓝方目前使用的武器
int rfight=1,bfight=1;//表示是否有战斗能力
int rpd=0,bpd=0;
memset(red_warrior[x].weapon,0,sizeof(red_warrior[x].weapon));
memset(blue_warrior[y].weapon,0,sizeof(blue_warrior[y].weapon));
for(int i=1;i<=red_warrior[x].cnt_total_weapon;i++){
if(i>=1&&i<=red_warrior[x].cnt_sword) red_warrior[x].weapon[i]=1;
else if(i>red_warrior[x].cnt_sword&&i<=red_warrior[x].cnt_sword+red_warrior[x].cnt_bomb){
red_warrior[x].weapon[i]=2;
}
else if(i>red_warrior[x].cnt_sword+red_warrior[x].cnt_bomb&&i<=red_warrior[x].cnt_total_weapon-red_warrior[x].cnt_never_used_arrow){
red_warrior[x].weapon[i]=3;
}
else{
red_warrior[x].weapon[i]=4;
}
}
for(int i=1;i<=blue_warrior[y].cnt_total_weapon;i++){
if(i>=1&&i<=blue_warrior[y].cnt_sword) blue_warrior[y].weapon[i]=1;
else if(i>blue_warrior[y].cnt_sword&&i<=blue_warrior[y].cnt_sword+blue_warrior[y].cnt_bomb){
blue_warrior[y].weapon[i]=2;
}
else if(i>blue_warrior[y].cnt_sword+blue_warrior[y].cnt_bomb&&i<=blue_warrior[y].cnt_total_weapon-blue_warrior[y].cnt_never_used_arrow){
blue_warrior[y].weapon[i]=3;
}
else{
blue_warrior[y].weapon[i]=4;
}
}
while(1){
if(r_check_attack(x)&&rfight==1&&r_check_if_only_sword(x)) rfight=0;
if(b_check_attack(y)&&bfight==1&&b_check_if_only_sword(y)) bfight=0;
if(rfight==0&&bfight==0) break;
if(flag==1){
if(rfight){
for(int i=0;i<=red_warrior[x].cnt_total_weapon-1;i++){
if(rpd==0&&i==0){
rpd=1;
int temp=red_weapon+i;
temp=(temp-1)%red_warrior[x].cnt_total_weapon+1;
if(red_warrior[x].weapon[temp]){
red_weapon=temp;
break;
}
}
if(rpd==1&&i==0) continue;
int temp=red_weapon+i;
temp=(temp-1)%red_warrior[x].cnt_total_weapon+1;
if(red_warrior[x].weapon[temp]){
red_weapon=temp;
break;
}
}
if(red_warrior[x].weapon[red_weapon]==1) red_sword_attack(x,y,red_weapon);
else if(red_warrior[x].weapon[red_weapon]==2) red_bomb_attack(x,y,red_weapon);
else if(red_warrior[x].weapon[red_weapon]==3) red_used_arrow_attack(x,y,red_weapon);
else if(red_warrior[x].weapon[red_weapon]==4) red_not_used_arrow_attack(x,y,red_weapon);
r_trans(x,red_weapon);
}
}
else if(flag==0){
if(bfight){
for(int i=0;i<=blue_warrior[y].cnt_total_weapon-1;i++){
if(bpd==0&&i==0){
bpd=1;
int temp=blue_weapon+i;
temp=(temp-1)%blue_warrior[y].cnt_total_weapon+1;
if(blue_warrior[y].weapon[temp]){
blue_weapon=temp;
break;
}
}
if(bpd==1&&i==0) continue;
int temp=blue_weapon+i;
temp=(temp-1)%blue_warrior[y].cnt_total_weapon+1;
if(blue_warrior[y].weapon[temp]){
blue_weapon=temp;
break;
}
}
if(blue_warrior[y].weapon[blue_weapon]==1) blue_sword_attack(y,x,blue_weapon);
else if(blue_warrior[y].weapon[blue_weapon]==2) blue_bomb_attack(y,x,blue_weapon);
else if(blue_warrior[y].weapon[blue_weapon]==3) blue_used_arrow_attack(y,x,blue_weapon);
else if(blue_warrior[y].weapon[blue_weapon]==4) blue_not_used_arrow_attack(y,x,blue_weapon);
b_trans(y,blue_weapon);
}
}
if(flag==1) flag=0;
else if(flag==0) flag=1;
if(red_warrior[x].bloo<=0||blue_warrior[y].bloo<=0) break;
}
if(red_warrior[x].bloo<=0&&blue_warrior[y].bloo<=0){
red_warrior[x].pd_if_live=0;
blue_warrior[y].pd_if_live=0;
city[c][0]=0;
city[c][1]=0;
output(t);
cout<<"both red "<<q[red_warrior[x].catagory].s<<' '<<red_warrior[x].id<<' ';
cout<<"and blue "<<q[blue_warrior[y].catagory].s<<' '<<blue_warrior[y].id;
cout<<" died in city "<<c<<endl;
return ;
}
else if(red_warrior[x].bloo<=0){
red_warrior[x].pd_if_live=0;
city[c][0]=0;
update(x,0);
update(y,1);
get(y,x,1);
output(t);
cout<<"blue "<<q[blue_warrior[y].catagory].s<<' '<<blue_warrior[y].id;
cout<<" killed red "<<q[red_warrior[x].catagory].s<<' '<<red_warrior[x].id;
cout<<" in city "<<c<<" remaining "<<blue_warrior[y].bloo<<" elements"<<endl;
}
else if(blue_warrior[y].bloo<=0){
blue_warrior[y].pd_if_live=0;
city[c][1]=0;
update(x,0);
update(y,1);
get(x,y,0);
output(t);
cout<<"red "<<q[red_warrior[x].catagory].s<<' '<<red_warrior[x].id;
cout<<" killed blue "<<q[blue_warrior[y].catagory].s<<' '<<blue_warrior[y].id;
cout<<" in city "<<c<<" remaining "<<red_warrior[x].bloo<<" elements"<<endl;
return ;
}
else if(red_warrior[x].bloo>0&&blue_warrior[y].bloo>0){
output(t);
update(x,0);
update(y,1);
cout<<"both red "<<q[red_warrior[x].catagory].s<<' '<<red_warrior[x].id;
cout<<" and blue "<<q[blue_warrior[y].catagory].s<<' '<<blue_warrior[y].id;
cout<<" were alive in city "<<c<<endl;
return ;
}
}
void red_yell(int x,int city,int t){
output(t);
cout<<"red dragon "<<red_warrior[x].id<<" yelled in city "<<city<<endl;
}
void blue_yell(int x,int city,int t){
output(t);
cout<<"blue dragon "<<blue_warrior[x].id<<" yelled in city "<<city<<endl;
}
void fight(int t){
for(int i=1;i<=n;i++){
if(!(city[i][1]&&city[i][0])) continue;
int x=city[i][0],y=city[i][1];
if(i%2==1){
actual_fight(x,y,i,t,1);
}
if(i%2==0){
actual_fight(x,y,i,t,0);
}
if(red_warrior[x].catagory==1&&red_warrior[x].pd_if_live==1){
red_yell(x,i,t);
}
if(blue_warrior[y].catagory==1&&blue_warrior[y].pd_if_live==1){
blue_yell(y,i,t);
}
}
}
int main(){
scanf("%d",&z);
for(int v=1;v<=z;v++){
scanf("%d%d%d%d",&m,&n,&k,&t);
rm=m,bm=m;tim=0;rflag=0,bflag=0;
rcnt=0,bcnt=0;rwin=0,bwin=0;
memset(rnum,0,sizeof(rnum));
memset(bnum,0,sizeof(bnum));
memset(red_warrior,0,sizeof(red_warrior));
memset(blue_warrior,0,sizeof(blue_warrior));
memset(city,0,sizeof(city));
r_warrior_num=0,b_warrior_num=0;
city[0][0]=1;city[n+1][1]=1;
proces=0;
for(int i=1;i<=5;i++){
scanf("%d",&q[i].bloo);
}
for(int i=1;i<=5;i++){
scanf("%d",&q[i].atta);
}
printf("Case %d:\n",v);
q[1].s="dragon",q[2].s="ninja",q[3].s="iceman",q[4].s="lion",q[5].s="wolf";
for(int i=0;i<=10005;i++){
if(tim>t) break;
if(tim%60==0){
rcnt++;bcnt++;
rcnt=(rcnt-1)%5+1;
bcnt=(bcnt-1)%5+1;
if(rflag==0) r_birth();
if(bflag==0) b_birth();
}
if(tim%60==5){
r_check_lion(tim);
b_check_lion(tim);
}
if(tim%60==10){
r_move(tim);
b_move(tim);
move_output(tim);
if(rwin||bwin) break;
}
if(tim%60==35){
wolf_try_to_steal(tim);
}
if(tim%60==40){
fight(tim);
}
if(tim%60==50){
r_announce_blood(tim);
b_announce_blood(tim);
}
if(tim%60==55){
output_warrior(tim);
}
proces++;
proces=(proces-1)%7+1;
tim+=step[proces];
}
}
system("pause");
return 0;
}

浙公网安备 33010602011771号