魔兽世界第二次的小作业,添加了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;
}