魔兽世界 - PKU[课程作业]程序设计与算法(三)C++面向对象程序设计/coursera C++程序设计_World of warcraft Project

这篇博客记录了作者在完成魔兽世界系列项目——包括备战、装备和修订版——中使用C++进行面向对象程序设计的过程。作者建议耐心理解题意,适时修改设计,并分享了调试WA问题的方法。通过 UltraCompare 软件比较输出,找到了错误所在。虽然过程中遇到困难,但作者认为这是一种宝贵的经验。
摘要由CSDN通过智能技术生成

 

 

感觉写得挺差;代码纯原创,没有半点参考;

以后若有空打算看看老师的代码,再来修改此文,先多花点时间再别的上面

建议:

1. 耐心点,仔细理解题意

2. 做到后面,前面若有设计得不好的地方,别犹豫,赶快改吧,改完了才知道甜头

3. 以下reference: https://blog.csdn.net/ckcz123/article/details/8734954

    如果你是直接从装备跳到终极版的话,建议你先去做一做行军

    传送门:http://poj.org/problem?id=3760

    难度较小。

4. 同样reference: https://blog.csdn.net/ckcz123/article/details/8734954

    第三,如果你总是总是WA的话,给你一个方法。

    去下一个UltraCompare软件,

    下载地址 ------> http://www.huacolor.com/soft/69625.html

    这个东西可以将两个文本文档进行比较。

    将你的所有输出保存在一个txt文件中 (fprintf总会吧)

    然后复制下面我AC的代码,也保存在一个文件中,直接相比较,就能找到问题在哪。

    多试几组数据,随便输入,找个几次一定可以找到问题所在。

 

感想:

第一次写这么长的程序,也算是一种体验。

写备战还是很快,一个晚上就立刻搞定;

装备稍微麻烦一点,由于备战的类的设计不太好,改半天;

最痛苦的还是修订版,折腾了一个下午晚上外加熬夜才写完,debug总共加起来也快一天了,仔细读题也没懂,硬是对着测试数据和正确输出结果才理解题意;

终极版有了修订版的折磨,也就不足为道......

 

注意:

修订版和终极版也有不同

1. wolf少了“在一个 wolf 通过主动攻击杀死敌人的次数达到偶数的时刻(次数从1开始算),在战斗完成后,该 wolf 生命值和攻击力都增加1倍。如果其杀死的敌人是lion,则攻击力和生命值先加倍,然后才吸取lion的生命值。获取总部的生命元奖励,发生在加倍之后。只有在主动攻击杀死敌人时才能有加倍的事情,反击杀死敌人则不不会发生加倍。”的特性

2. case的输出格式......

3. 升旗方面感觉也不同,可能是修订版测试数据还弱了点??

修订版中我的理解:

 

【假设一】
情形一:
Flag = -1, cnt = 2 -> Flag = red, cnt = 0(red刚连胜两轮,插上旗帜)
...
Flag = red, cnt = -1(blue胜)
Flag = red, cnt = -2 -> Flag = -1, cnt = 0(blue连胜两轮)
...
Flag = -1, cnt = -1(blue胜)
Flag = -1, cnt = -2 -> Flag = blue, cnt = 0(blue连胜两轮)
情形二:
Flag = -1, cnt = 2 -> Flag = red, cnt = 0(red刚连胜两轮,插上旗帜)
...
Flag = red, cnt = -1(blue胜)
Flag = red, cnt = -2 -> Flag = -1, cnt = 0(blue连胜两轮)
...
Flag = -1, cnt = 1(red胜)
Flag = -1, cnt = 2 -> Flag = red, cnt = 0(red连胜两轮)
情形三:
Flag = -1, cnt = 2 -> Flag = red, cnt = 0(red刚连胜两轮,插上旗帜)
...
Flag = red, cnt = -1(blue胜)
Flag = red, cnt = 0(red胜)

 

在终极版中结果发现是这样的:

【假设二】
情形一:
Flag = -1, cnt = 2 -> Flag = red, cnt = 0(red刚连胜两轮,插上旗帜)
...
Flag = red, cnt = -1(blue胜)
Flag = red, cnt = -2 -> Flag = blue, cnt = 0(blue连胜两轮)
情形二:
Flag = -1, cnt = 2 -> Flag = red, cnt = 0(red刚连胜两轮,插上旗帜)
...
Flag = red, cnt = -1(blue胜)
Flag = red, cnt = 0(red胜)

 

 

 

不多说了,上代码

 

魔兽世界之一:备战

#include<iostream>
using namespace std;
enum warriors {dragon, ninja, iceman, lion, wolf, NUMwarriors};
char str_warriors[NUMwarriors][7] = {"dragon", "ninja", "iceman", "lion", "wolf"};
enum colors {red, blue, NUMcolors};
char str_colors[NUMcolors][5] = {"red", "blue"};
class Warrior{
	private:
		int Strength[NUMwarriors];
		int Number[NUMwarriors];
		int WCSeq[NUMwarriors];	// Warrior Creating Sequence
	public:
		Warrior()	// constructor
		{
			for( int i = 0; i < NUMwarriors; i++ )
				Number[i] = 0;
		}
	friend class Headquarter;
}; // 如何联系class Headquarter 与 class Warrior? 
class Headquarter{
	private:
		int Strength;
		int Number;
		Warrior W;
		int Clk;
	public:
		Headquarter(int M, int N = 0, int C = 0) : Strength(M),Number(N),Clk(C) {};	// constructor
		void SetWarrior( int nw, int sw )
		{
			W.Strength[nw] = sw;
		}
		void SetWCSeq( int nc )
		{
			switch(nc){
				case red:
					W.WCSeq[0] = iceman; W.WCSeq[1] = lion; W.WCSeq[2] = wolf; W.WCSeq[3] = ninja; W.WCSeq[4] = dragon;
					break;
				case blue:
					W.WCSeq[0] = lion; W.WCSeq[1] = dragon; W.WCSeq[2] = ninja; W.WCSeq[3] = iceman; W.WCSeq[4] = wolf;
					break;
				default:
					break;
			}
		}
		int CreateWarrior( int nc, int last_cnt )
		{
			int cnt = last_cnt;
			int w, i;	// w - which warrior, i - iterator
			for( i = 0; i < NUMwarriors; i++ ){
				w = W.WCSeq[cnt%NUMwarriors];	// which warrior
				if( Strength-W.Strength[w] >= 0 ){
					Strength -= W.Strength[w];
					break;
				}
				else
					cnt++;
			}
			if( i >= NUMwarriors ){
				printf("%03d %s headquarter stops making warriors\n", Clk, str_colors[nc]);
				Clk = 0;
				return -1;				
			}
			else{
				W.Number[w]++;
				Number++;
				printf("%03d %s %s %d born with strength %d", Clk, str_colors[nc], str_warriors[w], Number, W.Strength[w]);
				printf(",%d %s in %s headquarter\n", W.Number[w], str_warriors[w], str_colors[nc]);
				cnt++;
				Clk++;
				return cnt;
			}
		}
		void PrintInfo();//
};
int main()
{
	int ntc;	// the number of test cases
	cin >> ntc;
	for( int tc = 1; tc <= ntc; tc++ )
	{
		cout << "Case:" << tc << endl;
		int M;	// initial strength of the two headquarters
		cin >> M;
		Headquarter Red(M), Blue(M);
		for( int i = 0; i < NUMwarriors; i++ )
		{
			int sw;
			cin >> sw;
			Red.SetWarrior(i, sw); Blue.SetWarrior(i, sw);
		}
		Red.SetWCSeq(red); Blue.SetWCSeq(blue);
//		Red.PrintInfo(); Blue.PrintInfo();
		int res1, res2;
		res1 = Red.CreateWarrior(red, 0); res2 = Blue.CreateWarrior(blue, 0);
		while( res1 > 0 && res2 > 0 ){
			res1 = Red.CreateWarrior(red, res1); res2 = Blue.CreateWarrior(blue, res2);
		}
		while( res1 > 0 )
			res1 = Red.CreateWarrior(red, res1);
		while( res2 > 0 )
			res2 = Blue.CreateWarrior(blue, res2);
	}
	return 0;
}
void Headquarter::PrintInfo()//
{
	cout << "Strength=" << Strength << "," << "Number=" << Number << endl;
	for( int i = 0; i < NUMwarriors; i++ )
		cout << W.Strength[i] << ",";
	cout << endl;
	for( int i = 0; i < NUMwarriors; i++ )
		cout << str_warriors[W.WCSeq[i]] << ",";
	cout << endl;
}//
/*
[Warning] extended initializer lists only available with -std=c++11 or -std=gnu++11
[Error] cannot convert '<brace-enclosed initializer list>' to 'int' in assignment
-- Arrays can only be initialized like that on definition, you can't do it afterwards.
Either move the initialization to the definition, or initialize each entry manually.
*/

 

魔兽世界之二:装备

#include<iostream>
using namespace std;
enum warriors {dragon, ninja, iceman, lion, wolf, NUMwarriors};
char str_warriors[NUMwarriors][7] = {"dragon", "ninja", "iceman", "lion", "wolf"};
enum weapons {sword, bomb, arrow, NUMweapons};
char str_weapons[NUMweapons][6] = {"sword", "bomb", "arrow"};
enum colors {red, blue, NUMcolors};
char str_colors[NUMcolors][5] = {"red", "blue"};
int WCSeq[NUMcolors][NUMwarriors] = { {iceman,lion,wolf,ninja,dragon}, 
   /*Warrior Creating Sequence*/	  {lion,dragon,ninja,iceman,wolf} };
/* Headquarter与Warrior - 复合关系,Warrior与具体种类 - 继承关系 */
/*可以声明一个类而不定义它 --> 前向声明(forward declaration) --> 不完全类型(incompete type)
  只能以有限方式使用,不能定义该类型的对象,只能用于定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数*/
class Headquarter;
class Warrior{
	private:
		int Strength;
		int Number;
		int Attribute;
		Headquarter *H;
	public:
		Warrior( int a, int s, int N, Headquarter *h )	// constructor
		{
			Attribute = a; Strength = s; Number = N; H = h;
		}
};
class Dragon: public Warrior{
	private:
		int Weapon;
		double Morale;
	public:
		Dragon( int n, int S, int a, int s, int N, Headquarter *h ): Warrior(a,s,N,h)	// constructor
		{
			Weapon = n%3; Morale = (double)S/s;
			Dragon::AdditionalProperties();
		}
		void AdditionalProperties(){
			printf("It has a %s,and it's morale is %.2lf\n", str_weapons[Weapon], Morale);
		}
};
class Ninja: public Warrior{
	private:
		int Weapon[2];
	public:
		Ninja( int n, int a, int s, int N, Headquarter *h ): Warrior(a,s,N,h)	// constructor
		{
			Weapon[0] = n%3; Weapon[1] = (n+1)%3;
			Ninja::AdditionalProperties();
		}
		void AdditionalProperties(){
			printf("It has a %s and a %s\n", str_weapons[Weapon[0]], str_weapons[Weapon[1]]);
		}
};
class Iceman: public Warrior{
	private:
		int Weapon;
	public:
		Iceman( int n, int a, int s, int N, Headquarter *h ): Warrior(a,s,N,h)	// constructor
		{
			Weapon = n%3;
			Iceman::AdditionalProperties();
		}
		void AdditionalProperties(){
			printf("It has a %s\n", str_weapons[Weapon]);
		}
};
class Lion: public Warrior{
	private:
		int Loyalty;
	public:
		Lion( int n, int S, int a, int s, int N, Headquarter *h ): Warrior(a,s,N,h)	// constructor
		{
			Loyalty = S;
			Lion::AdditionalProperties();
		}
		void AdditionalProperties(){
			printf("It's loyalty is %d\n", Loyalty);
		}
};
class Headquarter{
	private:
		int Strength;
		int SW[NUMwarriors];	// Strength of Warriors
		int NW[NUMwarriors];	// Number of Warriors
		int Number;	// Number of Warriors in Total
		int Color;
		Warrior *W[10000];
		int Clk;
	public:
		Headquarter( int M, int nc, int sw[], int N = 0, int C = 0 )	// constructor
		{
			Strength = M; Color = nc; Number = N; Clk = C;
			for( int i = 0; i < NUMwarriors; i++ ){
				SW[i] = sw[i]; NW[i] = 0;				
			}
		}
		int CreateWarrior( int last_cnt )
		{
			int cnt = last_cnt;
			int a, i;	// a - which warrior, i - iterator
			for( i = 0; i < NUMwarriors; i++ ){
				a = WCSeq[Color][cnt%NUMwarriors];	// which warrior
				if( Strength-SW[a] >= 0 ){
					Strength -= SW[a];
					break;
				}
				else
					cnt++;
			}
			if( i >= NUMwarriors ){
				printf("%03d %s headquarter stops making warriors\n", Clk, str_colors[Color]);
				Clk = 0;
				return -1;
			}
			else{
				Number++; NW[a]++;
				printf("%03d %s %s %d born with strength %d", Clk, str_colors[Color], str_warriors[a], Number, SW[a]);
				printf(",%d %s in %s headquarter\n", NW[a], str
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值