【open judge】【程设】魔兽世界三开战!

这篇博客分享了在解决魔兽世界主题的程序设计问题时遇到的挑战和经验。作者提到typeid在处理特殊角色技能时非常有用,利用文件输入输出进行调试的技巧,以及在复杂输出场景中printf优于cout的观点。
摘要由CSDN通过智能技术生成

#程设 魔兽世界三---开战!

--------

原以为会很容易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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值