#程设 魔兽世界三---开战!
--------
原以为会很容易ac,没想到写了好久,看来自己的水平还是亟待提高啊!
有几个比较有趣的点:
1. typeid(#include<typeinfo>)还是比较好用的,特别是本题当战士为wolf,iceman, dragon, ninja时有特殊技能,那么用typeid判断一下就很方便了。
2. 对于这种输出很复杂的问题,往往通过使用文件的输入输出再进行比较的做法debug。我在网上下了一个Beyond Compare进行比较,还是蛮好用的。
3. printf()在大多数情况下都比cout好用,我基本上都用cout处理的,感觉写的有点复杂。
代码如下,仅供参考
#include<iostream>
#include<cstring>
#include<iomanip>
#include<cstdio>
#include<typeinfo>
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"};
int soldier_force[5];
int city_number, time_limited;
//different soldier class
//model class
class csoldier
{
public:
int HP, force, locate, id;
int weapon[4];
int weapen_amount;
csoldier() { memset(weapon, 0, sizeof(weapon)); }
virtual ~csoldier(){}
//第n次交手应该使用的武器,n已经考虑过经过循环处理
int getweapon(int &n)
{
bool flag = false;
if (weapen_amount <= n) flag = true;
if (n <= weapon[0])
{
++n;
if(flag) n = 1;
return 0;
}
else if (n <= weapon[0] + weapon[1])
{
weapon[1]--;
weapen_amount--;
if(flag) n = 1;
return 1;
}
else if (n <= weapon[3] + weapon[0] + weapon[1])
{
weapon[3]--;
weapen_amount--;
if(flag) n = 1;
return 2;
}
else if (n <= weapen_amount)
{
weapon[2]--;
weapon[3]++;
++n;
if(flag) n = 1;
return 2;
}
cout << "wrong!" << endl;
}
virtual void out_name() = 0;
friend class battlefield;
};
class dragon:public csoldier
{
private:
friend class battlefield;
//constructor
dragon(int n, int color):csoldier()
{
weapon[n % 3] = 1;
weapen_amount = 1;
force = soldier_force[4];
locate = ((color == 0)? 0 : city_number + 1);
HP = soldier_HP[4];
id = n;
}
//destructor
~dragon(){}
virtual void out_name()
{
cout << "dragon " << id;
}
};
class ninja:public csoldier
{
private:
friend class battlefield;
ninja(int n, int color) :csoldier()
{
weapon[n % 3] = 1;
weapon[(n + 1) % 3] = 1;
weapen_amount = 2;
force = soldier_force[3];
locate = ((color == 0) ? 0 : city_number + 1);
HP = soldier_HP[3];
id = n;
}
~ninja(){}
virtual void out_name()
{
cout << "ninja " << id;
}
};
class iceman:public csoldier
{
private:
friend class battlefield;
iceman(int n, int color) :csoldier()
{
weapon[(n % 3)] = 1;
weapen_amount = 1;
force = soldier_force[0];
locate = ((color == 0) ? 0 : city_number + 1);
HP = soldier_HP[0];
id = n;
}
virtual void out_name()
{
cout << "iceman " << id;
}
};
class lion:public csoldier
{
private:
friend class battlefield;
int loyalty;
lion(int n, int color, int hp) :csoldier(), loyalty(hp)
{
weapon[n % 3] = 1;
weapen_amount = 1;
force = soldier_force[1];
locate = ((color == 0) ? 0 : city_number + 1);
HP = soldier_HP[1];
id = n;
cout << "Its loyalty is " << loyalty << endl;
}
virtual void out_name()
{
cout << "lion " << id;
}
public:
static int K;
};
int lion::K = 0;
class wolf:public csoldier
{
wolf(int n, int color) :csoldier()
{
weapen_amount = 0;
force = so