魔兽世界第二次的小作业,添加了soldier类和指针数组,为后面用多态做准备吧。算法上没有什么难度,因此直接贴代码吧。
#include<iostream> #include<cstring> #include<iomanip> #include<cstdio> using namespace std; int soldier_HP[5]; char soldier_name[5][20] = {"iceman", "lion", "wolf", "ninja", "dragon"}; char weapon_name[3][20] = {"sword", "bomb", "arrow"}; //different soldier class class csoldier { public: int HP; csoldier(int n = 0):HP(n){} ~csoldier(){} friend class player; }; class dragon:public csoldier { private: friend class player; int weapon; double morale; //constructor dragon(int n, int p_hp) { weapon = n % 3; morale = 1.0 * p_hp / soldier_HP[4]; // cout << morale << endl; printf("It has a %s,and it's morale is %.2f\n", weapon_name[weapon], morale); } //destructor ~dragon(){} }; class ninja:public csoldier { private: friend class player; int weapon[2]; ninja(int n) { weapon[0] = n % 3; weapon[1] = (n + 1) % 3; printf("It has a %s and a %s\n", weapon_name[weapon[0]], weapon_name[weapon[1]]); } ~ninja(){} }; class iceman:public csoldier { private: friend class player; int weapon; iceman(int n) { weapon = n % 3; printf("It has a %s\n", weapon_name[weapon]); } }; class lion:public csoldier { private: friend class player; int loyalty; lion(int p_hp) { loyalty = p_hp; printf("It's loyalty is %d\n", loyalty); } }; class wolf:public csoldier { private: friend class player; }; class player { private: int time, soldier_total, cur; int HP; char name[20]; bool produce_end;//if production is carrying on, it is false, if else it is true csoldier *head[10000]; int soldier[5];//in the order of iceman¡¢lion¡¢wolf¡¢ninja¡¢dragon public: int arr[5] = {0, 1, 2, 3, 4}; int arr2[5] = {1, 4, 3, 0, 2}; player(const char* p, int n):HP(n), time(-1), produce_end(true), soldier_total(0), cur(-1) { strcpy(name, p); if(strcmp(name, "blue") == 0) { for(int i = 0; i < 5; ++i) arr[i] = arr2[i]; } memset(soldier, 0, sizeof(soldier)); }; //player(): HP(0),time(-1), produce_end(true),soldier_total(0){memset(soldier, 0, sizeof(soldier));}; int gettime() { return time; } bool run() { if(produce_end == false) return false; ++time; cur = (cur + 1) % 5; int t = arr[cur]; if(HP >= soldier_HP[t]) { HP -= soldier_HP[t]; soldier[t]++; soldier_total++; cout << setfill('0') << setw(3) << time << ' ' << name << ' ' << soldier_name[t] << ' ' << soldier_total << " born with strength " << soldier_HP[t] << ',' << soldier[t] << ' ' << soldier_name[t] << " in " << name << " headquarter" << endl; switch(t) { case 0: head[soldier_total] = new iceman(soldier_total);break; case 1: head[soldier_total] = new lion(HP);break; case 2: head[soldier_total] = new wolf();break; case 3: head[soldier_total] = new ninja(soldier_total);break; case 4: head[soldier_total] = new dragon(soldier_total, HP);break; } return true; } else { int i, t; for(i = 1; i < 5; ++i) { cur++; t = arr[cur % 5]; if(HP >= soldier_HP[t]) { HP -= soldier_HP[t]; soldier[t]++; soldier_total++; cout << setfill('0') << setw(3) <<time << ' ' << name << ' ' << soldier_name[t] << ' ' << soldier_total << " born with strength " << soldier_HP[t] << ',' << soldier[t] << ' ' << soldier_name[t] << " in " << name << " headquarter" << endl; switch(t) { case 0: head[soldier_total] = new iceman(soldier_total);break; case 1: head[soldier_total] = new lion(HP);break; case 2: head[soldier_total] = new wolf();break; case 3: head[soldier_total] = new ninja(soldier_total);break; case 4: head[soldier_total] = new dragon(soldier_total, HP);break; } return true; } } if(i == 5) { cout << setfill('0') << setw(3) <<time << ' ' << name; cout << " headquarter stops making warriors" << endl; produce_end = false; return false; } } } }; int main() { int n, hp, cnt = 0; cin >> n; while(n--) { cin >> hp; // const char *p = "Hello world"; // cout << p << endl; player R("red", hp), B("blue", hp); cin >> soldier_HP[4] >> soldier_HP[3] >> soldier_HP[0] >> soldier_HP[1] >> soldier_HP[2]; bool f[2]; //f[0] = true; cout << "Case:" << ++cnt << endl; f[0] = R.run(); f[1] = B.run(); while(f[0] || f[1]) { f[0] = R.run(); f[1] = B.run(); } } return 0; }