北大程序设计实习公开课编程作业,魔兽世界之二:装备

魔兽世界的第二个版本,装备。相较于版本一,武士已经不能直接用两个全局数据保存名称和初始生命值就可以搞定了。

这里先分析一下题目。武士有5个种类,每种都有自己的特征,但他们共有的特征是有名字和生命元这两个属性。所以把这两个共有属性抽象出来作为一个基类warrior。5种武士分别从这个基类派生。逻辑上,“一个XX武士就是一个warrior”,是合理的;所以的确是继承关系。由于wolf武士没有特殊特征,和基类一样,这里直接以基类处理。在司令部HeadQ这个类进行输出时,强烈感觉到多态的重要性,不然你看在输出的时候有多少很类似的代码。如果用到多态特征就很容易搞定。下个版本要改。

关于武器的话,有3种。由于这里只牵涉到武器的名称,所以只是用了一个全局数据来处理。目测下一版本武器也会有其他属性,到时要升级为类(就像版本二中,把武士由版本一的全局数据改为类实现一样)。

实现的时候,只是对版本一进行了修改,main 函数内部貌似没有修改,不需要修改。

另:因为我 take 这个课的时候,课程已经开到第八周了,这些作业已经不能提交。所以该代码没有提交通过 oj 判断,需要大家注意一下。如果以后有人拿此代码交了,没有AC,希望能告诉下。(另外,这里我想熟悉下 VS2013 环境,所以代码都是在 VS2013 里写的,提交之前可能需要注释掉 #include "stdafx.h",以及 main 函数的参数表和函数名可能需要修改下。)

欢迎大家参考,欢迎大家提出问题。

Code:

// W5-编程作业-魔兽世界之二:装备.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <string>

using std::cin;
using std::string;
using std::cout;
using std::endl;
using std::ios_base;
//using namespace std;

int wlf[5];//dragon 、ninja、iceman、lion、wolf 的初始生命值
//string wrname[5] = { "dragon", "ninja", "iceman", "lion", "wolf" };
string wpname[3] = { "sword","bomb","arrow" };//武器名

class Warrior
{
	int life;
	string name;

public:
	Warrior(int lf = 0, string nm="wolf") :life(lf),name(nm) {}

	string get_name()
	{
		return name;
	}

	int get_life()
	{
		return life;
	}
};

class Drag :public Warrior
{
	int wpno;//武器序号
	double morale;//士气

public:
	Drag() {}

	Drag(int lf, int no, double hd_sx_lf) :wpno(no%3), morale(hd_sx_lf/lf), Warrior(lf, "dragon") //第一个参数是它的生命元,第二个参数是编号,第三个参数是司令部剩余生命元
	{}

	void show()
	{
		cout << "It has a " << wpname[wpno] << ",and it's morale is ";
		cout.setf(ios_base::fixed, ios_base::floatfield);//设置使用定点表示法
		cout.precision(2);//对于定点表示法,精度为2表示小数点后有2位,一直有效
		cout<< morale << endl;
	}

};

class Nin :public Warrior
{
	int wpno1;
	int wpno2;

public:
	Nin(){}
	Nin(int lf, int no) :wpno1(no%3), wpno2((no+1)%3), Warrior(lf, "ninja") {}//第一个参数是武士的生命元,第二个参数是其编号

	void show()
	{
		cout << "It has a "<<wpname[wpno1]<<" and a "<<wpname[wpno2] << endl;
	}
};

class Ice :public Warrior
{
	int wpno;

public:
	Ice(){}
	Ice(int lf, int no) :wpno(no%3), Warrior(lf, "iceman") {}

	void show()
	{
		cout << "It has a "<<wpname[wpno] << endl;
	}
};

class Lion :public Warrior
{
	int loyalty;//忠诚度

public:
	Lion(){}
	Lion(int lf, int hd_sx_lf) :loyalty(hd_sx_lf), Warrior(lf, "lion") {}

	void show()
	{
		cout << "It's loyalty is "<<loyalty << endl;
	}
};

class HeadQ
{
	int lifen;//生命元
	int wno;//武士的最大编号
	int worrior[5];//5个武士依次的数量
	string name;
	bool stop;//是否停止制造武士

public:
	HeadQ(int lfn = 0, string snm = "") :lifen(lfn), wno(0), name(snm), stop(0)
	{
		memset(worrior, 0, sizeof(worrior));
	}

	bool gen_wr(int time, int k)//生成序号为k的武士
	{
		if (lifen < wlf[k])
		{
			return false;
		}
		wno++;
		worrior[k]++;
		lifen = lifen - wlf[k];//剩余生命元

		if (0 == k)
		{
			Drag drg(wlf[k],wno,lifen);
			cout.fill('0');//设置填充字符,一直有效
			cout.width(3);//设域宽为3,一次有效
			cout <<time << " " << name << " " << drg.get_name() << " " << wno << " born with strength " << drg.get_life()
				<<","<<worrior[k] <<" "<<drg.get_name()<<" in "<<name<<" headquarter" << endl;
			drg.show();
		}
		else if (1 == k)
		{
			Nin nnj(wlf[k],wno);
			cout.fill('0');//设置填充字符,一直有效
			cout.width(3);//设域宽为3,一次有效
			cout << time << " " << name << " " << nnj.get_name() << " " << wno << " born with strength " << nnj.get_life()
				<< "," << worrior[k] << " " << nnj.get_name() << " in " << name << " headquarter" << endl;
			nnj.show();
		}
		else if (2 == k)
		{
			Ice icm(wlf[k],wno);
			cout.fill('0');//设置填充字符,一直有效
			cout.width(3);//设域宽为3,一次有效
			cout << time << " " << name << " " << icm.get_name() << " " << wno << " born with strength " << icm.get_life()
				<< "," << worrior[k] << " " << icm.get_name() << " in " << name << " headquarter" << endl;
			icm.show();
		}
		else if (3 == k)
		{
			Lion lon(wlf[k],lifen);
			cout.fill('0');//设置填充字符,一直有效
			cout.width(3);//设域宽为3,一次有效
			cout << time << " " << name << " " << lon.get_name() << " " << wno << " born with strength " << lon.get_life()
				<< "," << worrior[k] << " " << lon.get_name() << " in " << name << " headquarter" << endl;
			lon.show();
		}
		else if (4 == k)
		{
			//没有特别的
			Warrior wlf(wlf[k]);
			cout.fill('0');//设置填充字符,一直有效
			cout.width(3);//设域宽为3,一次有效
			cout << time << " " << name << " " << wlf.get_name() << " " << wno << " born with strength " << wlf.get_life()
				<< "," << worrior[k] << " " << wlf.get_name() << " in " << name << " headquarter" << endl;
		}
		return true;
	}

	bool is_stop(int time)
	{
		bool flag = 0;//标志是否可以继续制造武士
		for (int i = 0; i < 5; ++i)
		{
			if (lifen >= wlf[i]) { flag = 1; break; }//只要还可以制造一个武士
		}
		if (flag == 0)
		{
			cout.fill('0');//设置填充字符,一直有效
			cout.width(3);//设域宽为3,一次有效
			cout << time << " " << name << " headquarter stops making warriors" << endl;
			stop = true;
			return true;
		}
		return false;
	}

	bool getstopflag(void)
	{
		return stop;
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	int n;
	cin >> n;
	for (int i = 1; i <= n; ++i)
	{
		cout << "Case:" << i << endl;
		int m;
		cin >> m;
		cin >> wlf[0] >> wlf[1] >> wlf[2] >> wlf[3] >> wlf[4];
		HeadQ redhq(m, "red");//红方按iceman、lion、wolf、ninja、dragon顺序:2,3,4,1,0
		HeadQ bluehq(m, "blue");//蓝方按lion、dragon、ninja、iceman、wolf顺序:3,0,1,2,4
		int redsx[5] = { 2, 3, 4, 1, 0 };
		int bluesx[5] = { 3, 0, 1, 2, 4 };

		int time = 0;
		int redk = 0;
		int bluek = 0;
		while (redhq.getstopflag() == false || bluehq.getstopflag() == false)
		{
			while (redhq.getstopflag() == false && redhq.is_stop(time) == false && redhq.gen_wr(time, redsx[redk]) == false)//当没有停止生成武士且生成武士失败时,生成下一个可生成的武士
			{
				redk = (redk + 1) % 5;
			}
			redk = (redk + 1) % 5;

			while (bluehq.getstopflag() == false && bluehq.is_stop(time) == false && bluehq.gen_wr(time, bluesx[bluek]) == false)//当没有停止生成武士且生成武士失败时,生成下一个可生成的武士
			{
				bluek = (bluek + 1) % 5;
			}
			bluek = (bluek + 1) % 5;

			time++;
		}
	}
	return 0;
}
时间: 2024-11-03 20:47:47

北大程序设计实习公开课编程作业,魔兽世界之二:装备的相关文章

北大程序设计实习公开课编程作业,魔兽世界之一:备战

魔兽世界的第一个版本,备战.比较简单. 因为我 take 这个课的时候,课程已经开到第八周了,这些作业已经不能提交.所以该代码没有提交通过 oj 判断,需要大家注意一下.如果以后有人拿此代码交了,没有AC,希望能告诉下.(另外,这里我想熟悉下 VS 环境,所以代码都是在 VS2013 里写的,提交之前可能需要注释掉 #include "stdafx.h",以及 main 函数的参数表和函数名可能需要修改下.) 欢迎大家参考,欢迎大家提出问题. Code: // W3-编程作业-魔兽世界

c语言程序设计第3周编程作业(数字特征)

题目内容: 对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值.对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推.这个整数在第n位上的数字记作x,如果x和n的奇偶性相同,则记下一个1,否则记下一个0.按照整数的顺序把对应位的表示奇偶性的0和1都记录下来,就形成了一个二进制数字.比如,对于342315,这个二进制数字就是001101. 这里的计算可以用下面的表格来表示: 数字 3 4 2 3 1 5 数位 6 5 4 3 2 1 数字奇偶 奇 偶 偶 奇 奇 奇

c语言程序设计第6周编程作业一(分解质因数)

分解质因数 题目内容: 每个非素数(合数)都可以写成几个素数(也可称为质数)相乘的形式,这几个素数就都叫做这个合数的质因数.比如,6可以被分解为2x3,而24可以被分解为2x2x2x3. 现在,你的程序要读入一个[2,100000]范围内的整数,然后输出它的质因数分解式:当读到的就是素数时,输出它本身. 提示:可以用一个函数来判断某数是否是素数. 输入格式: 一个整数,范围在[2,100000]内. 输出格式: 形如: n=axbxcxd 或 n=n 所有的符号之间都没有空格,x是小写字母x.a

Coursera公开课-Machine_learing:编程作业2

第三周编程作业:Logistic Regression 代码包在gitlab上:https://gitlab.com/luntai/Machine_Learning

Coursera公开课-Machine_learing:编程作业8(2016-10-06 20:49)

Anomaly Detection and Recommender Systems 本周编程作业分为两部分:异常检测和推荐系统. 异常检测:本质就是使用样本的到特种值的gaussian分布,来预估正确的特征值的范围.对于一些特殊情况可以使用,多元高斯分布. 要注意该方法与监督学习的不同的适用性特征. 推荐系统:本例程中使用了,预测用户对不同类型的电影评分来给用户推荐电影. 代码在gitlab.

机器人程序设计——之如何正确入门ROS | 硬创公开课(附视频/PPT)【转】

转自:http://blog.exbot.net/archives/2966 导语:本期公开课面向想入手ROS却又不知从何下手的小伙伴,为大家梳理好学习思路. ROS和Android一样是开源的,功能上也是相差无几,它可以提供硬件抽象,底层设备控制,常用功能实现,进程间消息以及数据包管理.其独特之处在于,能够支持多种语言,如C++.Python.Octave和LISP,甚至支持多种语言混合使用,这可以简化开发者的工作.因为它是基于Linux的系统,其可靠性也会更高,体积可以做到更小,适合嵌入式设

《斯坦福大学公开课:编程方法学》随笔

这是观看网易公开课 Mehran Sahami教授的<斯坦福大学公开课:编程方法学>后的随笔. 目前只看到第三次课,<Karel与Java>,我的收获有以下要点: 1.软件工程跟普通的写代码是不同的.软件应该考虑很多东西,比如:可移植性.便于升级维护等等,而不仅仅是写出代码实现功能那么简单. 2.代码是写给机器执行的,但更重要的是人要让人能看懂.(代码后期维护等等的工作量或者时间是写代码的10倍及更多,所以让代码更规范更易被人读懂很重要) 3.准确定义一个函数.一个类.一个包的功能

POJ C++程序设计 编程题#3 Set 编程作业—STL2

编程题#3:Set 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 5000ms 内存限制: 100000kB 描述 现有一整数集(允许有重复元素),初始为空.我们定义如下操作: add x 把x加入集合 del x 把集合中所有与x相等的元素删除 ask x 对集合中元素x的情况询问 对每种操作,我们要求进行如下输出. add 输出操作后集合中x的个数 del 输出操作前集合中x的个数 ask 先输出0或1表示x是否曾

POJ C++程序设计 编程题#2 魔兽世界之二:装备

编程题#2: 魔兽世界之二:装备 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部.两个司令部之间是依次排列的若干城市. 红司令部,City 1,City 2,……,City n,蓝司令部 两军的司令部都会制造武士.武士一共有 dragon .ninja.iceman.lion.wolf 五种.每种武士都有编号.生命值这两