【程设の旅】魔兽世界 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;
}
posted @ 2025-03-07 13:25  elainafan  阅读(35)  评论(0)    收藏  举报