北大MOOC第五周003:魔兽世界之二:装备

一个一个结果对比了,发现结果都对啊,但是没有通过。。。 

其实很简单,就是在原来魔兽世界一的基础上多加了一个武器的功能,然而自己还是搞了一个小时,两周前写的程序都忘完了,发现自己当时写的程序注释不够详细,所以才会导致程序中的变量好多都忘了。吸取教训,要注释的详细一点,你的遗忘速度真的很快!!!

原题地址http://cxsjsxmooc.openjudge.cn/2019t3sprintw5/003/

#include 
#include
#include
#include
#include
#include
using namespace std;
typedef map strintmap;
//每个战士的生命值
static strintmap strength;
//武器名
static vector weapon;
//map strength;
//14:30-16:30
//21:25
class Warcraft {
public:
	//司令部名
	string name_;
	//战士名
	vector nameSeq_;

	//生命值
	int lifeNum_;
	//正在构造的第几个
	
	//第几个战士索引
	int ith;
	//第几个战士的数量索引数组
	int countIth[5];
	//总战士人数
	int countSum;

	//是否已经输出构造完的消息了,构造结束标志
	bool hasCout;


	Warcraft(string name, const vector &nameSeq, int lifeNum) {
		name_ = name;
		nameSeq_ = nameSeq;
		lifeNum_ = lifeNum;
		ith = 0;
		countSum = 0;
		hasCout = false;
		for (int i = 0; i < 5; i++)
			countIth[i] = 0;
	}

	bool born(int time)
	{
		for (int i = 0; i < 5; i++)
		{
			//bug1  差点写出bug。。。卧槽
			if (hasCout)
			{
				return false;
			}
			//bug2 不能在这里用i++,因为这里+过后就会影响后面的i
			else if (strength[nameSeq_[ith]] > lifeNum_)
			{
				ith = (ith + 1) % 5;
				continue;
			}
			else
			{
				countIth[ith]++;
				countSum++;
				//bug 5  忘写这一句话了
				//bug 6 一开始把这句话写在ith=(ith+1)%5下面了。。。。
				lifeNum_ -= strength[nameSeq_[ith]];

				cout << setw(3) << setfill('0') << time << " " << name_ << " " << nameSeq_[ith] << " " << countSum << " born with strength " << strength[nameSeq_[ith]] << "," << countIth[ith] << " " << nameSeq_[ith] << " in " << name_ << " headquarter" << endl;
				//bug 4  ith=(ith++)%5为什么不行???

				if (nameSeq_[ith] == "dragon")
				{
					cout << "it has a " < redName;
	vector blueName;
	redName.push_back("iceman");
	redName.push_back("lion");
	redName.push_back("wolf");
	redName.push_back("ninja");
	redName.push_back("dragon");

	blueName.push_back("lion");
	blueName.push_back("dragon");
	blueName.push_back("ninja");
	blueName.push_back("iceman");
	blueName.push_back("wolf");

	char a[5][10] = { "dragon", "ninja", "iceman", "lion", "wolf" };
	int n, M;

	cin >> n;
	for (int ii = 0; ii < n; ii++)
	{
		cin >> M;
		cout << "Case:" << ii + 1 << endl;
		for (int i = 0; i < 5; i++)
		{
			int temp;
			cin >> temp;
			//bug 3 a[i]写成了a[0]。。。
			//strength[a[i]] = temp;
			strength[a[i]] = temp;
		}

		Warcraft wRed("red", redName, M);
		Warcraft wBlue("blue", blueName, M);

		int time = 0;
		//bug 7 这个是在上面while退出时,这一时刻输出了headquarter stops making warriors,但是time++没有执行,所以需要在while之外加上这句
		//bug 8 如果两者是同时退出的话,上面的&&只要第一个wRed不满足后,就不会再执行后面的wBlue了,所以此时不能time++
		//一定要确定谁先执行完,如果使用下面这种同时判断wRed和wBlue,则不能确定是谁先执行完了
		//while (wRed.born(time) && wBlue.born(time))
		//{
		//	time++;
		//}
		while (wRed.born(time))
		{
			wBlue.born(time);
			time++;
		}
		while (wBlue.born(time))
		{
			time++;
		}



		/////////////////////下面这种情况会遇到的问题是:
		//当输入为
		//5000
		//200 400 6 70 20 时,
		//wRed和wBlue同时到达了最终要输出stops making warriors。但是程序在判断了wRed.born(time)为false后就不会执行后面的了。
		//此时后面的语句不应该time++。  这样就和bug 7那里冲突了,不知道什么时候该time++,因为不知道两个谁先结束,所以最后的解决办法是上面的while (wRed.born(time))  {  }
		//while (wRed.born(time) && wBlue.born(time))
		//{
		//	time++;
		//}

		////bug 7 这个是在上面while退出时,这一时刻输出了headquarter stops making warriors,但是time++没有执行,所以需要在while之外加上这句
		//time++;
		//while (wBlue.born(time))
		//{
		//	time++;
		//}
		//while (wRed.born(time))
		//{
		//	time++;
		//}
		//return 0;
	}

	//n = 1, M = 20;
	//for (int i = 0; i < 5; i++)
	//{
	//	strength[a[i]] = i+3;
	//}




	return 0;
}

 

你可能感兴趣的:(MOOC,C++程序设计)