魔兽三就不说了,因为我感觉魔兽三与四并无本质的区别,真要说起来的话,就是魔兽三的武士夺取武器这一操作比较复杂些。
需要运用大量的虚函数......第一遍不用虚函数把我做的要死。总体来说我写的这个比较长,实现方法比较容易理解,不像一些大神短短三四百行代码就能搞定。不过我的是一看就懂的类型啊~
代码如下:
#include <iostream> #include <cstdio> #include <algorithm> #include <stdlib.h> #include <string> #include <memory> #include<iomanip> #include<math.h> #include<cmath> using namespace std; //定义各种变量 int iflag=0; int citystr[30] = { 0 };//用数组定义城市中产出的生命元 int RED = 0, BLUE = 0;//定义一种flag,判断到达司令部的人数 int M, N, R, K, T;//每个司令部的初始生命元数量,城市数量,arrow的攻击力,忠诚衰减量,截止时间量 int r_n, b_n, r_w = 1, b_w = 1;//红蓝双方的生命元数,红蓝双方要制造的武士类型 int d_str, n_str, i_str, l_str, w_str;//初始生命值 int d_for, n_for, i_for, l_for, w_for;//攻击力 int strmin;//几种武士中最小的生命值 int hour, minute, _hour, _minute;//没有_是现在时间,有_是限定时间 int flag_redcreate, flag_bluecreate, flag_redtaken, flag_bluetaken; //武器 class weapon { public: int num=0; int wornarrow;//定义耐久度 string name; }; //司令部 class base { public: string type; int warriors; int locat;//所处地 int d_n, n_n, i_n, l_n, w_n; int source;//生命元 void getelements(int&);//定义司令部获取生命元 }; //武士 class warrior { public: int str;//生命值 int id;//编号 int forcew[3] = { 0 };//武器的攻击值 string type;//种类 weapon weapons[3];//三种类型的武器的数量 int force;//战力 int posi;//当前所在地点编号 base*mast;//司令部 int state;//状态0:逃逸或死亡 1:存活 int loyalty;//忠诚值 double morale;//士气 //总体初始化 int flag = 0;//计算iceman的步数 void mainset(base*a) { mast = a; id = (*a).warriors; posi = (*a).locat; state = 1; loyalty = 0; morale = 0; for (int i = 0; i <= 3; i++) { weapons[i].num = 0; } } void subset2() { for (int i = 0; i < 3; i++) switch (i) { case 0: {weapons[i].name = "sword"; forcew[i] = force * 2 / 10; break; } case 1: {weapons[i].name = "bomb"; break; } case 2: {weapons[i].name = "arrow"; weapons[i].wornarrow = 3; forcew[i] = R; break; } } }//修改后的武器情况 //细化初始化 virtual void rob(warrior*sb) {} virtual void subset() = 0; virtual void yell() {}; virtual void attackback(warrior*sb) //定义虚函数反击 { sb->str -= weapons[0].num*forcew[0] + force / 2; forcew[0] *= 0.8; if (forcew[0] <1) { weapons[0].num = 0; } } virtual void attack(warrior*sb) //武士主动攻击 { sb->str -= weapons[0].num*forcew[0] + force; forcew[0] = (int)forcew[0] * 8 / 10; int t = 0; if (forcew[0] <1) { weapons[0].num = 0; } } virtual void toescape() {} //行军 void march(); void die(); void getweapon(warrior*sb)//抢夺武器 { for (int i = 0; i <= 2; i++) { if (weapons[i].num == 0) { if (sb->weapons[i].num != 0) { weapons[i] = sb->weapons[i]; forcew[i] = sb->forcew[i]; } } } } }; //城市 class city { public: int soldier_n;//判断一座城市的士兵数量 warrior* red;//指向红方武士的指针 warrior* blue;//指向蓝方武士的指针 int redwin = 0;//判断红方在一座城市赢得次数 int bluewin = 0;//判断蓝方在一座城市赢得次数 bool redflag = false;//判断一座城市是否拥有红方旗帜 bool blueflag = false;//判断一座城市是否拥有蓝方旗帜 bool redarrowmatk = false;//判断一座城市是否曾经有过被红方射死而留下的红方箭痕 bool bluearrowmark = false;//判断一座城市是否曾经有过被蓝方射死而留下的蓝方箭痕 bool redif = false;//判断在此城市红方是否胜利,红方司令部分配生命元时要用 bool blueif = false;//判断在此城市蓝方是否胜利,蓝方司令部分配生命元时要用 }allcity[30]; city redbase[5];//定义红方司令部,以容纳更多的武士 city bluebase[5];//定义蓝方司令部,以容纳更多的武士 //行军 void warrior::march() { if (type == "iceman")//重新定义iceman的走路掉血问题 { flag++; if (flag % 2 == 0) { flag = 0; if (str > 9) { str -= 9; force += 20; } else { str = 1; force += 20; } } } if ((*mast).type == "red"&&state) posi++; else if ((*mast).type == "blue"&&state) posi--; } void warrior::die() { allcity[posi].soldier_n--; if ((*mast).type == "red") allcity[posi].red = NULL; if ((*mast).type == "blue") allcity[posi].blue = NULL; posi = -1; state = 0; } //武士-dragon class dragon :public warrior { public: void subset() { str = d_str; type = "dragon"; force = d_for; weapons[id % 3].num++; morale = (double)(*mast).source / d_str;//士气 } void attackback() { } void yell() { printf("%03d:%02d %s dragon %d yelled in city %d\n", hour, minute, (*mast).type.c_str(), id, posi); } }; //武士-ninja class ninja :public warrior { public: void subset() { str = n_str; type = "ninja"; force = n_for; weapons[id % 3].num++; weapons[(id+1) % 3].num++; } void attackback(warrior*sb) {}; void attack(warrior*sb, int weaponid) { weapons[weaponid].num--; switch (weaponid) { case 0: {sb->str -= force * 2 / 10; weapons[weaponid].num++; break; } case 1: {sb->str -= force * 4 / 10; break; } case 2: {sb->str -= force * 3 / 10; weapons[3].num++; break; } case 3: {sb->str -= force * 3 / 10; break; } } } }; //武士-iceman class iceman :public warrior { public: void subset() { str = i_str; type = "iceman"; force = i_for; weapons[id % 3].num++; } void yell() {} }; //武士-wolf class wolf :public warrior { public: void subset() { str = w_str; type = "wolf"; force = w_for; } void rob(warrior*sb)//抢夺武器 { } void yell() {} }; //武士-lion class lion :public warrior { public: void subset() { str = l_str; type = "lion"; force = l_for; loyalty = (*mast).source; } //逃跑 void toescape() { state = 0; if (posi <= N && posi >= 1) { if ((*mast).type == "red") allcity[posi].red = NULL; else if ((*mast).type == "blue") allcity[posi].blue = NULL; allcity[posi].soldier_n--; } posi = -1; printf("%03d:%02d ", hour, minute); cout << (*mast).type; printf(" lion %d ran away\n", id); } void yell() {} }; //循环链表:制造武士 struct node { char type; node*next; }; //又一波定义 warrior*redwaror[1000]; warrior*bluewaror[1000]; dragon d_r[100], d_b[100]; ninja n_r[100], n_b[100]; iceman i_r[100], i_b[100]; lion l_r[100], l_b[100]; wolf w_r[100], w_b[100]; base r; base b; node*red, *blue; node redline, redline1, redline2, redline3, redline4, blueline, blueline1, blueline2, blueline3, blueline4; void lineset() { redline.type = 'i'; redline1.type = 'l'; redline2.type = 'w'; redline3.type = 'n'; redline4.type = 'd'; redline.next = &redline1; redline1.next = &redline2; redline2.next = &redline3; redline3.next = &redline4; redline4.next = &redline; blueline.type = 'l'; blueline1.type = 'd'; blueline2.type = 'n'; blueline3.type = 'i'; blueline4.type = 'w'; blueline.next = &blueline1; blueline1.next = &blueline2; blueline2.next = &blueline3; blueline3.next = &blueline4; blueline4.next = &blueline; red = &redline; blue = &blueline; } //初始化 void mem() { //司令部初始化 red = &redline; blue = &blueline; flag_bluecreate = 1, flag_redcreate = 1; r.type = "red", b.type = "blue"; r.warriors = 0, b.warriors = 0; r.locat = 0, b.locat = N + 1; r.d_n = 0, r.i_n = 0, r.l_n = 0, r.n_n = 0, r.w_n = 0; b.d_n = 0, b.i_n = 0, b.l_n = 0, b.n_n = 0, b.w_n = 0; r.source = M, b.source = M; flag_bluetaken = 0, flag_redtaken = 0; //最小初始生命值初始化 strmin = min(d_str, i_str); strmin = min(strmin, n_str); strmin = min(strmin, l_str); strmin = min(strmin, w_str); //城市初始化 for (int i = 0; i <= N + 1; i++) { allcity[i].soldier_n = 0; allcity[i].red = NULL; allcity[i].blue = NULL; } for (int i = 0; i < 5; i++) { redbase[i].soldier_n = 0; bluebase[i].soldier_n = 0; redbase[i].blue = NULL; bluebase[i].red = NULL; } for (int i = 0; i < 100; i++) { i_r[i].flag = 0; i_b[i].flag = 0; } //时间初始化 hour = 0, minute = 0; _hour = T / 60, _minute = T % 60; } void base::getelements(int&i)//获取生命元 { source += i; i = 0; } //输入 void init() { cin >> M >> N >> R >> K >> T; cin >> d_str >> n_str >> i_str >> l_str >> w_str; cin >> d_for >> n_for >> i_for >> l_for >> w_for; } //制造武士 void createwarriors() { if (flag_redcreate) { int flag = 0; switch ((*red).type) { case 'i': if (r.source >= i_str) { flag = 1; r.source -= i_str; r.i_n++; r.warriors++; i_r[r.i_n].mainset(&r); i_r[r.i_n].subset(); i_r[r.i_n].subset2(); if (i_r[r.i_n].weapons[0].num != 0 && i_r[r.i_n].forcew[0] < 1) { i_r[r.i_n].weapons[0].num--; } redwaror[r.warriors] = &i_r[r.i_n]; printf("%03d:%02d red iceman %d born\n", hour, minute, r.warriors); allcity[0].soldier_n = 1; allcity[0].red = &i_r[r.i_n]; break; } else { flag = 0; break; } case 'l': if (r.source >= l_str) { flag = 1; r.source -= l_str; r.l_n++; r.warriors++; l_r[r.l_n].mainset(&r); l_r[r.l_n].subset(); l_r[r.l_n].subset2(); redwaror[r.warriors] = &l_r[r.l_n]; printf("%03d:%02d red lion %d born\n", hour, minute, r.warriors); printf("Its loyalty is %d\n", l_r[r.l_n].loyalty); allcity[0].soldier_n = 1; allcity[0].red = &l_r[r.l_n]; break; } else { flag = 0; break; } case 'w': if (r.source >= w_str) { flag = 1; r.source -= w_str; r.w_n++; r.warriors++; w_r[r.w_n].mainset(&r); w_r[r.w_n].subset(); w_r[r.w_n].subset2(); redwaror[r.warriors] = &w_r[r.w_n]; printf("%03d:%02d red wolf %d born\n", hour, minute, r.warriors); allcity[0].soldier_n = 1; allcity[0].red = &w_r[r.w_n]; break; } else { flag = 0; break; } case 'n': if (r.source >= n_str) { flag = 1; r.source -= n_str; r.n_n++; r.warriors++; n_r[r.n_n].mainset(&r); n_r[r.n_n].subset(); n_r[r.n_n].subset2(); if (n_r[r.n_n].weapons[0].num != 0 && n_r[r.n_n].forcew[0] < 1) { n_r[r.n_n].weapons[0].num--; } redwaror[r.warriors] = &n_r[r.n_n]; printf("%03d:%02d red ninja %d born\n", hour, minute, r.warriors); allcity[0].soldier_n = 1; allcity[0].red = &n_r[r.n_n]; break; } else { flag = 0; break; } case 'd': if (r.source >= d_str) { flag = 1; r.source -= d_str; r.d_n++; r.warriors++; d_r[r.d_n].mainset(&r); d_r[r.d_n].subset(); d_r[r.d_n].subset2(); if (d_r[r.d_n].weapons[0].num != 0 && d_r[r.d_n].forcew[0] < 1) { d_r[r.d_n].weapons[0].num--; } redwaror[r.warriors] = &d_r[r.d_n]; allcity[0].soldier_n = 1; allcity[0].red = &d_r[r.d_n]; printf("%03d:%02d red dragon %d born\n", hour, minute, r.warriors); cout << "Its morale is " << setiosflags(ios::fixed) << setprecision(2) << d_r[r.d_n].morale << endl;//生成士气 break; } else { flag = 0; break; } } if (flag == 1) { red = red->next; flag = 0; } } if (flag_bluecreate) { int flag = 0; switch ((*blue).type) { case 'i': if (b.source >= i_str) { flag = 1; b.source -= i_str; b.i_n++; b.warriors++; i_b[b.i_n].mainset(&b); i_b[b.i_n].subset(); i_b[b.i_n].subset2(); if (i_b[b.i_n].weapons[0].num != 0 && i_b[b.i_n].forcew[0] < 1) { i_b[b.i_n].weapons[0].num--; } bluewaror[b.warriors] = &i_b[b.i_n]; printf("%03d:%02d blue iceman %d born\n", hour, minute, b.warriors); allcity[N + 1].soldier_n = 1; allcity[N + 1].blue = &i_b[b.i_n]; break; } else { flag = 0; break; } case 'l': if (b.source >= l_str) { flag = 1; b.source -= l_str; b.l_n++; b.warriors++; l_b[b.l_n].mainset(&b); l_b[b.l_n].subset(); l_b[b.l_n].subset2(); bluewaror[b.warriors] = &l_b[b.l_n]; printf("%03d:%02d blue lion %d born\n", hour, minute, b.warriors); printf("Its loyalty is %d\n", l_b[b.l_n].loyalty); allcity[N + 1].soldier_n = 1; allcity[N + 1].blue = &l_b[b.l_n]; break; } else { flag = 0; break; } case 'w': if (b.source >= w_str) { flag = 1; b.source -= w_str; b.w_n++; b.warriors++; w_b[b.w_n].mainset(&b); w_b[b.w_n].subset(); w_b[b.w_n].subset2(); bluewaror[b.warriors] = &w_b[b.w_n]; printf("%03d:%02d blue wolf %d born\n", hour, minute, b.warriors); allcity[N + 1].soldier_n = 1; allcity[N + 1].blue = &w_b[b.w_n]; break; } else { flag = 0; break; } case 'n': if (b.source >= n_str) { flag = 1; b.source -= n_str; b.n_n++; b.warriors++; n_b[b.n_n].mainset(&b); n_b[b.n_n].subset(); n_b[b.n_n].subset2(); if (n_b[b.n_n].weapons[0].num != 0 && n_b[b.n_n].forcew[0] < 1) { n_b[b.n_n].weapons[0].num--; } bluewaror[b.warriors] = &n_b[b.n_n]; printf("%03d:%02d blue ninja %d born\n", hour, minute, b.warriors); allcity[N + 1].soldier_n = 1; allcity[N + 1].blue = &n_b[b.n_n]; break; } else { flag = 0; break; } case 'd': if (b.source >= d_str) { flag = 1; b.source -= d_str; b.d_n++; b.warriors++; d_b[b.d_n].mainset(&b); d_b[b.d_n].subset(); d_b[b.d_n].subset2(); if (d_b[b.d_n].weapons[0].num != 0 && d_b[b.d_n].forcew[0] < 1) { d_b[b.d_n].weapons[0].num--; } bluewaror[b.warriors] = &d_b[b.d_n]; printf("%03d:%02d blue dragon %d born\n", hour, minute, b.warriors); cout << "Its morale is " << setiosflags(ios::fixed) << setprecision(2) << d_b[b.d_n].morale << endl;//生成士气 allcity[N + 1].soldier_n = 1; allcity[N + 1].blue = &d_b[b.d_n]; break; } else { flag = 0; break; } } if (flag == 1) { blue = blue->next; flag = 0; } } } //狮子逃跑 void lionsescape() { for (int i = 0; i <= N + 1; i++) { if (allcity[i].red != NULL) { if ((*allcity[i].red).type == "lion" && (*allcity[i].red).loyalty <= 0) (*allcity[i].red).toescape(); } if (allcity[i].blue != NULL) { if ((*allcity[i].blue).type == "lion" && (*allcity[i].blue).loyalty <= 0) (*allcity[i].blue).toescape(); } } } //行军 void marching() { for (int i = 0; i <= N + 1; i++) { if (allcity[i].red) allcity[i].red->march(); if (allcity[i].blue) allcity[i].blue->march(); } //清空城市指针 for (int i = 0; i <= N + 1; i++) allcity[i].soldier_n = 0, allcity[i].blue = NULL, allcity[i].red = NULL, allcity[i].redarrowmatk = false, allcity[i].bluearrowmark = false; for (int i = 1; i <= r.warriors; i++) { allcity[redwaror[i]->posi].soldier_n++; allcity[redwaror[i]->posi].red = redwaror[i]; } for (int i = 1; i <= b.warriors; i++) { allcity[bluewaror[i]->posi].soldier_n++; allcity[bluewaror[i]->posi].blue = bluewaror[i]; } for (int i = 0; i <= N + 1; i++) { if (i == 0 && allcity[i].soldier_n) { BLUE++; printf("%03d:%02d blue %s %d reached red headquarter with %d elements and force %d\n", hour, minute, allcity[i].blue->type.c_str(), allcity[i].blue->id, allcity[i].blue->str, allcity[i].blue->force); redbase[BLUE] = allcity[i]; if (BLUE == 2) { printf("%03d:%02d red headquarter was taken\n", hour, minute); } } else if (i == N + 1 && allcity[i].soldier_n) { RED++; printf("%03d:%02d red %s %d reached blue headquarter with %d elements and force %d\n", hour, minute, allcity[i].red->type.c_str(), allcity[i].red->id, allcity[i].red->str, allcity[i].red->force); bluebase[RED] = allcity[i]; if (RED == 2) { printf("%03d:%02d blue headquarter was taken\n", hour, minute); } } else { if (allcity[i].red) printf("%03d:%02d red %s %d marched to city %d with %d elements and force %d\n", hour, minute, allcity[i].red->type.c_str(), allcity[i].red->id, i, allcity[i].red->str, allcity[i].red->force); if (allcity[i].blue) printf("%03d:%02d blue %s %d marched to city %d with %d elements and force %d\n", hour, minute, allcity[i].blue->type.c_str(), allcity[i].blue->id, i, allcity[i].blue->str, allcity[i].blue->force); } } } //城市生产生命元 void productstr() { for (int i = 1; i <= N; i++) { citystr[i] += 10; } } //武士单人时获得生命元 void aloneget() { for (int i = 1; i <= N; i++) { if (allcity[i].soldier_n == 1) { if (allcity[i].red) { cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " red " << allcity[i].red->type << " " << allcity[i].red->id << " earned " << citystr[i] << " elements for his headquarter" << endl; r.getelements(citystr[i]); } else { if (allcity[i].blue) { cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " blue " << allcity[i].blue->type << " " << allcity[i].blue->id << " earned " << citystr[i] << " elements for his headquarter" << endl; b.getelements(citystr[i]); } } } } } //武士放箭 void shoot() { if (allcity[1].red) { if (allcity[1+ 1].blue) { if (allcity[1].red->weapons[2].num != 0) { allcity[1 + 1].blue->str -= R; if (allcity[1 + 1].blue->str <= 0) { allcity[1 + 1].soldier_n--; allcity[1 + 1].redarrowmatk = true; cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " red " << allcity[1].red->type << " " << allcity[1].red->id << " shot and killed blue " << allcity[1 + 1].blue->type << " " << allcity[1 + 1].blue->id << endl; } else { cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " red " << allcity[1].red->type << " " << allcity[1].red->id << " shot" << endl; } allcity[1].red->weapons[2].wornarrow--; if (allcity[1].red->weapons[2].wornarrow <= 0) { allcity[1].red->weapons[2].num = 0; } } } } for (int i = 2; i < N; i++) { if (allcity[i].red) { if (allcity[i + 1].blue) { if (allcity[i].red->weapons[2].num != 0) { allcity[i + 1].blue->str -= R; if (allcity[i + 1].blue->str <= 0) { allcity[i + 1].soldier_n--; allcity[i + 1].redarrowmatk = true; cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " red " << allcity[i].red->type << " " << allcity[i].red->id << " shot and killed blue " << allcity[i + 1].blue->type << " " << allcity[i + 1].blue->id << endl; } else { cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " red " << allcity[i].red->type << " " << allcity[i].red->id << " shot" << endl; } allcity[i].red->weapons[2].wornarrow--; if (allcity[i].red->weapons[2].wornarrow <= 0) { allcity[i].red->weapons[2].num = 0; } } } } if (allcity[i].blue) { if (allcity[i - 1].red) { if (allcity[i].blue->weapons[2].num != 0) { allcity[i - 1].red->str -= R; if (allcity[i - 1].red->str <= 0) { allcity[i - 1].soldier_n--; allcity[i - 1].bluearrowmark = true; cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " blue " << allcity[i].blue->type << " " << allcity[i].blue->id << " shot and killed red " << allcity[i - 1].red->type << " " << allcity[i - 1].red->id << endl; } else { cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " blue " << allcity[i].blue->type << " " << allcity[i].blue->id << " shot" << endl; } allcity[i].blue->weapons[2].wornarrow--; if (allcity[i].blue->weapons[2].wornarrow <= 0) { allcity[i].blue->weapons[2].num = 0; } } } } } if (allcity[N].blue) { int i = N; if (allcity[i - 1].red) { if (allcity[i].blue->weapons[2].num != 0) { allcity[i - 1].red->str -= R; if (allcity[i - 1].red->str <= 0) { allcity[i - 1].soldier_n--; allcity[i - 1].bluearrowmark = true; cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " blue " << allcity[i].blue->type << " " << allcity[i].blue->id << " shot and killed red " << allcity[i - 1].red->type << " " << allcity[i - 1].red->id << endl; } else { cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " blue " << allcity[i].blue->type << " " << allcity[i].blue->id << " shot" << endl; } allcity[i].blue->weapons[2].wornarrow--; if (allcity[i].blue->weapons[2].wornarrow <= 0) { allcity[i].blue->weapons[2].num = 0; } } } } } //武士使用bomb void explode() { for (int i = 1; i <= N; i++) { int flag = 0; if (allcity[i].soldier_n == 2) { if (allcity[i].red->weapons[1].num != 0) { if (allcity[i].redflag || (i % 2 != 0 && allcity[i].redflag == false && allcity[i].blueflag == false)) { if (allcity[i].blue->str > (allcity[i].red->force + allcity[i].red->forcew[0] * allcity[i].red->weapons[0].num)) { if (allcity[i].blue->type != "ninja") { if (allcity[i].red->str <= ( allcity[i].blue->force*1/2 + allcity[i].blue->weapons[0].num*allcity[i].blue->forcew[0])) { cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " red " << allcity[i].red->type << " " << allcity[i].red->id << " used a bomb and killed blue " << allcity[i].blue->type << " " << allcity[i].blue->id << endl; flag = 1; allcity[i].red->die(); allcity[i].blue->die(); } } } } else { if (allcity[i].blueflag || (i % 2 == 0 && allcity[i].redflag == false && allcity[i].blueflag == false)) { if (allcity[i].red->str <= (allcity[i].blue->force + allcity[i].blue->weapons[0].num*allcity[i].blue->forcew[0])) { cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " red " << allcity[i].red->type << " " << allcity[i].red->id << " used a bomb and killed blue " << allcity[i].blue->type << " " << allcity[i].blue->id << endl; flag = 1; allcity[i].red->die(); allcity[i].blue->die(); } } } } if (flag == 0) { if (allcity[i].blue->weapons[1].num != 0) { if (allcity[i].blueflag || (i % 2 == 0 && allcity[i].redflag == false && allcity[i].blueflag == false)) { if (allcity[i].red->str > (allcity[i].blue->force + allcity[i].blue->forcew[0] * allcity[i].blue->weapons[0].num)) { if (allcity[i].red->type != "ninja") { if (allcity[i].blue->str <= ( allcity[i].red->force*1/2 + allcity[i].red->weapons[0].num*allcity[i].red->forcew[0])) { cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " blue " << allcity[i].blue->type << " " << allcity[i].blue->id << " used a bomb and killed red " << allcity[i].red->type << " " << allcity[i].red->id << endl; flag = 1; allcity[i].red->die(); allcity[i].blue->die(); } } } } else { if (allcity[i].redflag || (i % 2 != 0 && allcity[i].redflag == false && allcity[i].blueflag == false)) { if (allcity[i].blue->str <= (allcity[i].red->force + allcity[i].red->weapons[0].num*allcity[i].red->forcew[0])) { cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " blue " << allcity[i].blue->type << " " << allcity[i].blue->id << " used a bomb and killed red " << allcity[i].red->type << " " << allcity[i].red->id << endl; flag = 1; allcity[i].red->die(); allcity[i].blue->die(); } } } } } } } } //武士主动出击或反击 void activeattack() { for (int i = 1; i <= N; i++) { if (allcity[i].soldier_n == 2) { if ((allcity[i].blueflag == false && allcity[i].redflag == false && i % 2 != 0) || (allcity[i].redflag == true))//红方先进攻 { int bb = allcity[i].blue->str; allcity[i].red->attack(allcity[i].blue); cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " red " << allcity[i].red->type << " " << allcity[i].red->id << " attacked blue " << allcity[i].blue->type << " " << allcity[i].blue->id << " in city " << i << " with " << allcity[i].red->str << " elements and force " << allcity[i].red->force << endl; if (allcity[i].blue->str <= 0)//红方主场,红方赢了 { if (allcity[i].red->type == "wolf") { allcity[i].red->getweapon(allcity[i].blue); } cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " blue " << allcity[i].blue->type << " " << allcity[i].blue->id << " was killed in city " << i << endl; if (allcity[i].blue->type == "lion") { allcity[i].red->str += bb; } if (allcity[i].red->type == "dragon") { allcity[i].red->morale += 0.2; if (allcity[i].red->morale > 0.8) { allcity[i].red->yell(); } } //只是输出而已,并没有进行实际的操作 allcity[i].redif = true; allcity[i].blueif = false; cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " red " << allcity[i].red->type << " " << allcity[i].red->id << " earned " << citystr[i] << " elements for his headquarter" << endl; allcity[i].redwin++; allcity[i].bluewin = 0; if (allcity[i].redflag == false) { if (allcity[i].redwin >= 2) { allcity[i].redflag = true; allcity[i].blueflag = false; cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " red flag raised in city " << i << endl; } } allcity[i].blue->die(); } else { int rr = allcity[i].red->str; if (allcity[i].blue->type != "ninja") { allcity[i].blue->attackback(allcity[i].red); cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " blue " << allcity[i].blue->type << " " << allcity[i].blue->id << " fought back against red " << allcity[i].red->type << " " << allcity[i].red->id << " in city " << i << endl; } if (allcity[i].red->str <= 0)//红方主场,但是蓝方赢了 { if (allcity[i].blue->type == "wolf") { allcity[i].blue->getweapon(allcity[i].red); } cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " red " << allcity[i].red->type << " " << allcity[i].red->id << " was killed in city " << i << endl; if (allcity[i].red->type == "lion") { allcity[i].blue->str += rr; } if (allcity[i].blue->type == "dragon") { allcity[i].blue->morale += 0.2; } //只是输出而已,不进行实际的运算 allcity[i].blueif = true; allcity[i].redif = false; cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " blue " << allcity[i].blue->type << " " << allcity[i].blue->id << " earned " << citystr[i] << " elements for his headquarter" << endl; allcity[i].bluewin++; allcity[i].redwin = 0; if (allcity[i].blueflag == false) { if (allcity[i].bluewin >= 2) { allcity[i].blueflag = true; allcity[i].redflag = false; cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " blue flag raised in city " << i << endl; } } allcity[i].red->die(); } else//红方主场,平局 { if (allcity[i].red->type == "dragon") { allcity[i].red->morale -= 0.2; if (allcity[i].red->morale > 0.8) { allcity[i].red->yell(); } } if (allcity[i].blue->type == "dragon") { allcity[i].blue->morale -= 0.2; } if (allcity[i].red->type == "lion") { allcity[i].red->loyalty -= K; } if (allcity[i].blue->type == "lion") { allcity[i].blue->loyalty -= K; } allcity[i].blueif = false; allcity[i].redif = false; if (allcity[i].redflag) { allcity[i].bluewin = 0; } else { allcity[i].redwin = 0; allcity[i].bluewin = 0; } } } } else//从此变为蓝方主场 { int bb = allcity[i].red->str; allcity[i].blue->attack(allcity[i].red); cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " blue " << allcity[i].blue->type << " " << allcity[i].blue->id << " attacked red " << allcity[i].red->type << " " << allcity[i].red->id << " in city " << i << " with " << allcity[i].blue->str << " elements and force " << allcity[i].blue->force << endl; if (allcity[i].red->str <= 0)//蓝方主场,蓝方赢了 { if (allcity[i].blue->type == "wolf") { allcity[i].blue->getweapon(allcity[i].red); } cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " red " << allcity[i].red->type << " " << allcity[i].red->id << " was killed in city " << i << endl; if (allcity[i].red->type == "lion") { allcity[i].blue->str += bb; } if (allcity[i].blue->type == "dragon") { allcity[i].blue->morale += 0.2; if (allcity[i].blue->morale > 0.8) { allcity[i].blue->yell(); } } //只是输出而已,不进行实际的操作 allcity[i].blueif = true; allcity[i].redif = false; cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " blue " << allcity[i].blue->type << " " << allcity[i].blue->id << " earned " << citystr[i] << " elements for his headquarter" << endl; allcity[i].bluewin++; allcity[i].redwin = 0; if (allcity[i].blueflag == false) { if (allcity[i].bluewin >= 2) { allcity[i].blueflag = true; allcity[i].redflag = false; cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " blue flag raised in city " << i << endl; } } allcity[i].red->die(); } else { int rr = allcity[i].blue->str; if (allcity[i].red->type != "ninja") { allcity[i].red->attackback(allcity[i].blue); cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " red " << allcity[i].red->type << " " << allcity[i].red->id << " fought back against blue " << allcity[i].blue->type << " " << allcity[i].blue->id << " in city " << i << endl; } if (allcity[i].blue->str <= 0)//蓝方主场,但是红方赢了 { if (allcity[i].red->type == "wolf") { allcity[i].red->getweapon(allcity[i].blue); } if (allcity[i].red->type == "dragon") { allcity[i].red->morale += 0.2; } cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " blue " << allcity[i].blue->type << " " << allcity[i].blue->id << " was killed in city " << i << endl; if (allcity[i].blue->type == "lion") { allcity[i].red->str += rr; } //只是输出而已,不进行实际的操作 allcity[i].blueif = false; allcity[i].redif = true; cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " red " << allcity[i].red->type << " " << allcity[i].red->id << " earned " << citystr[i] << " elements for his headquarter" << endl; allcity[i].redwin++; allcity[i].bluewin = 0; if (allcity[i].redflag == false) { if (allcity[i].redwin >= 2) { allcity[i].redflag = true; allcity[i].blueflag = false; cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " red flag raised in city " << i << endl; } } allcity[i].blue->die(); } else//蓝方主场,平局 { if (allcity[i].red->type == "dragon") { allcity[i].red->morale -= 0.2; } if (allcity[i].blue->type == "dragon") { allcity[i].blue->morale -= 0.2; if (allcity[i].blue->morale > 0.8) { allcity[i].blue->yell(); } } if (allcity[i].red->type == "lion") { allcity[i].red->loyalty -= K; } if (allcity[i].blue->type == "lion") { allcity[i].blue->loyalty -= K; } allcity[i].blueif = false; allcity[i].redif = false; if (allcity[i].blueflag) { allcity[i].redwin = 0; } else { allcity[i].redwin = 0; allcity[i].bluewin = 0; } } } } } else { if (allcity[i].red&&allcity[i].soldier_n == 1) { if (allcity[i].redarrowmatk)//红方用箭射死了蓝方 { allcity[i].redwin++; allcity[i].bluewin = 0; if (allcity[i].red->type == "dragon") { allcity[i].red->morale += 0.2; if ((allcity[i].blueflag == false && allcity[i].redflag == false && i % 2 != 0) || (allcity[i].redflag == true))//红方先进攻 { if (allcity[i].red->morale > 0.8) { allcity[i].red->yell(); } } } if (allcity[i].red->type == "wolf") { allcity[i].red->getweapon(allcity[i].blue); } //只是输出而已,什么也不做 allcity[i].blueif = false; allcity[i].redif = true; allcity[i].blue->die(); allcity[i].soldier_n++; cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " red " << allcity[i].red->type << " " << allcity[i].red->id << " earned " << citystr[i] << " elements for his headquarter" << endl; if ((allcity[i].redflag == false && allcity[i].blueflag == false) || allcity[i].blueflag == true) { if (allcity[i].redwin >= 2) { allcity[i].redflag = true; allcity[i].blueflag = false; cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " red flag raised in city " << i << endl; } } } } if (allcity[i].blue&&allcity[i].soldier_n == 1) { if (allcity[i].bluearrowmark)//蓝方用箭射死了红方 { if (allcity[i].blue->type == "dragon") { allcity[i].blue->morale += 0.2; if ((allcity[i].blueflag == false && allcity[i].redflag == false && i % 2 == 0) || (allcity[i].blueflag == true))//蓝方先进攻 { if (allcity[i].blue->morale > 0.8) { allcity[i].blue->yell(); } } } if (allcity[i].blue->type == "wolf") { allcity[i].blue->getweapon(allcity[i].red); } allcity[i].bluewin++; allcity[i].redwin = 0; //只是输出而已,什么也不做 allcity[i].blueif = true; allcity[i].redif = false; allcity[i].red->die(); allcity[i].soldier_n++; cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " blue " << allcity[i].blue->type << " " << allcity[i].blue->id << " earned " << citystr[i] << " elements for his headquarter" << endl; if ((allcity[i].redflag == false && allcity[i].blueflag == false) || allcity[i].redflag == true) { if (allcity[i].bluewin >= 2) { allcity[i].blueflag = true; allcity[i].redflag = false; cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " blue flag raised in city " << i << endl; } } } } if (allcity[i].soldier_n == 0) { if (allcity[i].redarrowmatk&&allcity[i].bluearrowmark==false) { allcity[i].soldier_n++; allcity[i].blue->die(); } if (allcity[i].bluearrowmark&&allcity[i].redarrowmatk==false) { allcity[i].soldier_n++; allcity[i].red->die(); } } if (allcity[i].soldier_n == 0 && allcity[i].redarrowmatk==true&&allcity[i].bluearrowmark==true)//同时被射死的情况 { allcity[i].redif = false; allcity[i].blueif = false; allcity[i].red->die(); allcity[i].soldier_n++; allcity[i].blue->die(); allcity[i].soldier_n++; } } } } //司令部奖励武士生命元 void award() { for (int i = 1; i <= N; i++)//从距红方司令部近的开始 { if (r.source >= 8 && allcity[i].redif == true) { r.source -= 8; allcity[i].red->str += 8; } if (r.source < 8) { break; } } for (int i = N; i >= 1; i--)//从距蓝方司令部近的开始 { if (b.source >= 8 && allcity[i].blueif == true) { b.source -= 8; allcity[i].blue->str += 8; } if (b.source < 8) { break; } } } //武士实际从城市获取生命元 void geteletments() { for (int i = 1; i <= N; i++) { if (allcity[i].redif == true) { r.getelements(citystr[i]); } if (allcity[i].blueif == true) { b.getelements(citystr[i]); } } } //司令部报告生命元数 void reportsource() { printf("%03d:%02d %d elements in red headquarter\n", hour, minute, r.source); printf("%03d:%02d %d elements in blue headquarter\n", hour, minute, b.source); } //武士报告武器情况 void reportwaror() { for (int i = 1; i <= N + 1; i++) { if (i >= 1 && i <= N) { int flag = 0; if (allcity[i].red) { cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " red " << allcity[i].red->type << " " << allcity[i].red->id << " has "; flag = 0; for (int j = 2; j >= 0; j--) { if (allcity[i].red->weapons[j].num != 0) { flag = 1; if (j == 0) { if (allcity[i].red->forcew[j] >= 1) { cout << allcity[i].red->weapons[j].name; cout << "(" << allcity[i].red->forcew[j] << ")"; } } if (j == 1) { cout << allcity[i].red->weapons[j].name; if (allcity[i].red->weapons[j - 1].num != 0) { cout << ","; } } if (j == 2) { cout << allcity[i].red->weapons[j].name; cout << "(" << allcity[i].red->weapons[j].wornarrow << ")"; if (allcity[i].red->weapons[j - 1].num != 0 || allcity[i].red->weapons[j - 2].num != 0) { cout << ","; } } } } if (flag == 0) { cout << "no weapon" << endl; } else { cout << endl; } } } else { for (int i = 1; i <= 2; i++) { int flag = 0; if (bluebase[i].red) { cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " red " << bluebase[i].red->type << " " << bluebase[i].red->id << " has "; flag = 0; for (int j = 2; j >= 0; j--) { if (bluebase[i].red->weapons[j].num != 0) { flag = 1; if (j == 0) { if (allcity[i].blue->forcew[j] >= 1) { cout << bluebase[i].red->weapons[j].name; cout << "(" << bluebase[i].red->forcew[j] << ")"; } } if (j == 1) { cout << bluebase[i].red->weapons[j].name; if (bluebase[i].red->weapons[j - 1].num != 0) { cout << ","; } } if (j == 2) { cout << bluebase[i].red->weapons[j].name; cout << "(" << bluebase[i].red->weapons[j].wornarrow << ")"; if (bluebase[i].red->weapons[j - 1].num != 0 || bluebase[i].red->weapons[j - 2].num != 0) { cout << ","; } } } } if (flag == 0) { cout << "no weapon" << endl; } else { cout << endl; } } } } } for (int i = 0; i <= N; i++) { if (i >= 1 && i <= N) { int flag = 0; if (allcity[i].blue) { cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " blue " << allcity[i].blue->type << " " << allcity[i].blue->id << " has "; flag = 0; for (int j = 2; j >= 0; j--) { if (allcity[i].blue->weapons[j].num != 0) { flag = 1; cout << allcity[i].blue->weapons[j].name; if (j == 0) { cout << "(" << allcity[i].blue->forcew[j] << ")"; } if (j == 1) { if (allcity[i].blue->weapons[j - 1].num != 0) { cout << ","; } } if (j == 2) { cout << "(" << allcity[i].blue->weapons[j].wornarrow << ")"; if (allcity[i].blue->weapons[j - 1].num != 0 || allcity[i].blue->weapons[j - 2].num != 0) { cout << ","; } } } } if (flag == 0) { cout << "no weapon" << endl; } else { cout << endl; } } } else { for (int i = 1; i <= 2; i++) { int flag = 0; if (redbase[i].blue) { cout << setfill('0') << setw(3) << hour << ":" << setfill('0') << setw(2) << minute << " blue " << redbase[i].blue->type << " " << redbase[i].blue->id << " has "; flag = 0; for (int j = 2; j >= 0; j--) { if (redbase[i].blue->weapons[j].num != 0) { flag = 1; cout << redbase[i].blue->weapons[j].name; if (j == 0) { cout << "(" << redbase[i].blue->forcew[j] << ")"; } if (j == 1) { if (redbase[i].blue->weapons[j - 1].num != 0) { cout << ","; } } if (j == 2) { cout << "(" << redbase[i].blue->weapons[j].wornarrow << ")"; if (redbase[i].blue->weapons[j - 1].num != 0 || redbase[i].blue->weapons[j - 2].num != 0) { cout << ","; } } } } if (flag == 0) { cout << "no weapon" << endl; } else { cout << endl; } } } } } } int main() { int n;//case数 cin >> n; lineset(); for (int c = 1; c <= n; c++) { for (int i = 1; i <= N; i++) { citystr[i] = 0; } BLUE = 0; RED = 0; int a = 1; init(); mem(); for (int i = 1; i <= N; i++) { for (int i = 1; i <= N; i++) { allcity[i].redwin = 0;//判断红方在一座城市赢得次数 allcity[i].bluewin = 0;//判断蓝方在一座城市赢得次数 allcity[i].redflag = false;//判断一座城市是否拥有红方旗帜 allcity[i].blueflag = false;//判断一座城市是否拥有蓝方旗帜 allcity[i].redarrowmatk = false;//判断一座城市是否曾经有过被红方射死而留下的红方箭痕 allcity[i].bluearrowmark = false;//判断一座城市是否曾经有过被蓝方射死而留下的蓝方箭痕 allcity[i].redif = false;//判断在此城市红方是否胜利,红方司令部分配生命元时要用 allcity[i].blueif = false;//判断在此城市蓝方是否胜利,蓝方司令部分配生命元时要用 } } printf("Case %d:\n", c); while (1) { for (int i = 1; i <= N; i++) { allcity[i].bluearrowmark = false; allcity[i].redarrowmatk = false; allcity[i].redif = false; allcity[i].blueif = false; } //0min minute = 0; if (hour == _hour && minute > _minute) break; createwarriors();//创造武士 //5min minute = 5; if (hour == _hour && minute > _minute) break; lionsescape();//狮子逃逸 //10min minute = 10; if (hour == _hour && minute > _minute) break; marching();//行军 if (BLUE == 2 || RED == 2) break; //20min minute = 20; if (hour == _hour && minute > _minute) break; productstr();//城市生产生命元 //30min minute = 30; if (hour == _hour && minute > _minute) break; aloneget();//单独的武士收获生命元 //35min minute = 35; if (hour == _hour && minute > _minute) break; shoot();//射箭 //38min minute = 38; if (hour == _hour && minute > _minute) break; explode();//武士用炸弹 //40min minute = 40; if (hour == _hour && minute > _minute) break; activeattack();//武士主动出击与反击 award();//司令部奖励得胜的武士 geteletments();//司令部收割战场生命元 //50min minute = 50; if (hour == _hour && minute > _minute) break; reportsource();//司令部报告 //55min minute = 55; if (hour == _hour && minute > _minute) break; reportwaror();//武士报告 hour++; } } system("pause"); return 0; }