题目:

http://cxsjsxmooc.openjudge.cn/2021t3springall2/021/

分析:

本题主要是在 “ 魔兽世界之一 ” 的基础上增加了装备系统,需要新增一个武器类(包括基类和派生类),然后由于需要对每个武士的装备和状态进行输出,所以需要用到多态(virtual)。

下面给我写的代码以及郭炜老师的代码以供参考(我觉得参考他人特别是高手的代码不仅可以学习到其思想,还能学习到他人优秀的编码风格)。

参考代码(我的):

#include<iostream>
using namespace std;#define WarriorNum 5
#define WarriorsMax 10000 //武士数量上限
#define WeaponNum 3int WarriorLife[WarriorNum] ={};
char colors[2][5] = {"red", "blue"};
char WarriorsName[WarriorNum][10] ={"dragon" ,"ninja","iceman","lion","wolf"};
char WeaponName[WeaponNum][10] = {"sword", "bomb","arrow"};class Headquarters;
class Warrior;
class Dragon;
class Ninja;
class Iceman;
class Lion;
class Wolf;
class Weapon;
class sword;
class bomb;
class arrow;class Weapon{
private:int attack;int defend;int Type;
public:void Init(int _Type){Type = _Type;}int GetWeapon(){ return Type;}
};class Warrior{
protected:int Life;int Type; //武士类别,分别是dragon 、ninja、iceman、lion、wolfint ArrayNum; //武士队列编号Headquarters * team; //指针指回Head,省下很多参数
public:Warrior(Headquarters * p,int _ArrayNum):team(p),ArrayNum(_ArrayNum){}virtual void PrintProduce(int time) = 0;void PrintProduce(int time,int) ;virtual ~Warrior(){};
};class Headquarters{
private:int Life;int Color; //0是红,1是蓝。Warrior * WarriorsArray[WarriorsMax]; //武士队列int WarriorsArrayNum;int Warrior_MakeSeq[WarriorNum];//该司令部生产序列int MakeNum; //当前生产序列编号bool ProduceState;int WarriorsNums[WarriorNum]; //对应武士数量
public:Headquarters(int _Color, int _Life, int * _Warrior_MakeSeq):Color(_Color),Life(_Life){for(int i = 0; i < WarriorNum ;i++){Warrior_MakeSeq[i] = _Warrior_MakeSeq[i];WarriorsNums[i] = 0;}WarriorsArrayNum = 0;MakeNum = 0;ProduceState = true;}~Headquarters(){for(int i = 0; i < WarriorsArrayNum; i++) delete WarriorsArray[i];}bool produce(int time);int GetLife() { return Life; }int GetColor(){ return Color; }int GetWarriorsNums(int Type){ return WarriorsNums[Type]; }
};void Warrior::PrintProduce(int time,int) {int color = team->GetColor();printf("%03d %s %s %d born with strength %d,%d %s in %s headquarter\n",time,colors[color],WarriorsName[Type],ArrayNum,Life,team->GetWarriorsNums(Type),WarriorsName[Type],colors[color]);
};class Dragon:public Warrior{
private:Weapon wp;float Morale;
public:Dragon(Headquarters * p,int _ArrayNum):Warrior(p,_ArrayNum){Type = 0;Life = WarriorLife[Type];wp.Init(ArrayNum % WeaponNum);Morale = team->GetLife() * 1.0 / Life;}virtual void PrintProduce(int time){Warrior::PrintProduce(time,0);printf("It has a %s,and it's morale is %.02f\n",WeaponName[wp.GetWeapon()],Morale);}
//    virtual ~Dragon();
};class Ninja:public Warrior{
private:Weapon wp[2];
public:Ninja(Headquarters * p,int _ArrayNum):Warrior(p,_ArrayNum){Type = 1;Life = WarriorLife[Type];wp[0].Init(ArrayNum % WeaponNum);wp[1].Init((ArrayNum + 1) % WeaponNum);}virtual void PrintProduce(int time){Warrior::PrintProduce(time,0);printf("It has a %s and a %s\n",WeaponName[wp[0].GetWeapon()],WeaponName[wp[1].GetWeapon()]);}// virtual ~Ninja();
};class Iceman:public Warrior{
private:Weapon wp;
public:Iceman(Headquarters * p,int _ArrayNum):Warrior(p,_ArrayNum){Type = 2;Life = WarriorLife[Type];wp.Init(ArrayNum % WeaponNum);}virtual void PrintProduce(int time){Warrior::PrintProduce(time,0);printf("It has a %s\n",WeaponName[wp.GetWeapon()]);}//virtual ~Iceman();
};class Lion:public Warrior{
private:int loyalty;
public:Lion(Headquarters * p,int _ArrayNum):Warrior(p,_ArrayNum){Type = 3;Life = WarriorLife[Type];loyalty = team->GetLife();}virtual void PrintProduce(int time){Warrior::PrintProduce(time,0);printf("It's loyalty is %d\n",loyalty);}//virtual ~Lion();
};class Wolf:public Warrior{
public:Wolf(Headquarters * p,int _ArrayNum):Warrior(p,_ArrayNum){Type = 4;Life = WarriorLife[Type];}virtual void PrintProduce(int time){Warrior::PrintProduce(time,0);}
//    virtual ~Wolf();
};bool Headquarters::produce(int time){if(ProduceState == false) return false;for(int i = 0; i < WarriorNum ; i++){if(Life >= WarriorLife[Warrior_MakeSeq[(MakeNum + i) % WarriorNum]]){MakeNum = (MakeNum + i) % WarriorNum;ProduceState = true;Life -= WarriorLife[Warrior_MakeSeq[MakeNum]];switch (Warrior_MakeSeq[MakeNum]) { //{"dragon" ,"ninja","iceman","lion","wolf"};case 0:WarriorsArray[WarriorsArrayNum] = new Dragon(this,WarriorsArrayNum + 1);break;case 1:WarriorsArray[WarriorsArrayNum] = new Ninja(this,WarriorsArrayNum + 1);break;case 2:WarriorsArray[WarriorsArrayNum] = new Iceman(this,WarriorsArrayNum + 1);break;case 3:WarriorsArray[WarriorsArrayNum] = new Lion(this,WarriorsArrayNum + 1);break;case 4:WarriorsArray[WarriorsArrayNum] = new Wolf(this,WarriorsArrayNum + 1);break;}WarriorsNums[Warrior_MakeSeq[MakeNum]] ++;WarriorsArray[WarriorsArrayNum++]->PrintProduce(time);MakeNum = (MakeNum + 1) % WarriorNum;return true;}}//上面没有return true则说明已经无法制造士兵了ProduceState = false;printf("%03d %s headquarter stops making warriors\n",time,colors[Color]);return false;}int main(){int n,m;cin >> n;for(int i = 1 ;i <= n ;i++){cout << "Case:" << i <<endl;cin >> m;for(int i = 0; i < WarriorNum ; i++){cin >> WarriorLife[i];}int Head_Red_Warrior_MakeSeq[WarriorNum] = {2,3,4,1,0};int Head_Blue_Warrior_MakeSeq[WarriorNum] = {3,0,1,2,4};Headquarters Head_Red(0,m,Head_Red_Warrior_MakeSeq);Headquarters Head_Blue(1,m,Head_Blue_Warrior_MakeSeq);bool Red_flag = true , Blue_flag = true; //int time = 0;while(Red_flag == true || Blue_flag == true){Red_flag = Head_Red.produce(time);Blue_flag= Head_Blue.produce(time);time ++;}}return 0;
}

参考代码(郭炜老师):


// by Guo Wei
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;//下面这些东西都是常量,而且不止一个类都要用到,就声明为全局的较为简单
#define WARRIOR_NUM 5
#define WEAPON_NUM 3
enum { DRAGON,NINJA,ICEMAN,LION,WOLF };/*char * CWarrior::Names[WARRIOR_NUM] = { "dragon","ninja","iceman","lion","wolf" };红方司令部按照 iceman、lion、wolf、ninja、dragon 的顺序制造武士。
蓝方司令部按照 lion、dragon、ninja、iceman、wolf 的顺序制造武士。 */class CHeadquarter;
class CDragon;
class CNinja;
class CIceman;
class CLion;
class CWolf;
class CWeapon;
class CWarrior;class CWeapon {
public:int nKindNo;int nForce;static int InitialForce[WEAPON_NUM];static const char * Names[WEAPON_NUM];
};class CWarrior {
protected:CHeadquarter * pHeadquarter;int nNo;
public:static const char * Names[WARRIOR_NUM];static int InitialLifeValue [WARRIOR_NUM];CWarrior( CHeadquarter * p,int nNo_):pHeadquarter(p),nNo(nNo_) { }virtual void PrintResult(int nTime,int nKindNo);virtual void PrintResult(int nTime) = 0;virtual ~CWarrior() { }};class CHeadquarter {
private:static const int MAX_WARRIORS = 1000;int nTotalLifeValue;bool bStopped;int nColor;int nCurMakingSeqIdx;int anWarriorNum[WARRIOR_NUM];int nTotalWarriorNum;CWarrior * pWarriors[MAX_WARRIORS];
public:friend class CWarrior;static int MakingSeq[2][WARRIOR_NUM];void Init(int nColor_, int lv);~CHeadquarter () ;int Produce(int nTime);void GetColor( char * szColor);int GetTotalLifeValue() { return nTotalLifeValue; }
};void CWarrior::PrintResult(int nTime,int nKindNo) {char szColor[20];pHeadquarter->GetColor(szColor);printf("%03d %s %s %d born with strength %d,%d %s in %s headquarter\n",nTime, szColor, Names[nKindNo], nNo, InitialLifeValue[nKindNo],pHeadquarter->anWarriorNum[nKindNo],Names[nKindNo],szColor);}class CDragon:public CWarrior {
private:CWeapon wp;double fmorale;
public:void Countmorale(){fmorale = pHeadquarter -> GetTotalLifeValue() /(double)CWarrior::InitialLifeValue [0];}CDragon( CHeadquarter * p,int nNo_):CWarrior(p,nNo_) {wp.nKindNo = nNo % WEAPON_NUM;wp.nForce = CWeapon::InitialForce[wp.nKindNo ];Countmorale();}void PrintResult(int nTime) {CWarrior::PrintResult(nTime,DRAGON);printf("It has a %s,and it's morale is %.2f\n", CWeapon::Names[wp.nKindNo], fmorale); }
};class CNinja:public CWarrior {
private:CWeapon wps[2];
public:CNinja( CHeadquarter * p,int nNo_):CWarrior(p,nNo_) {wps[0].nKindNo = nNo % WEAPON_NUM;wps[0].nForce = CWeapon::InitialForce[wps[0].nKindNo];wps[1].nKindNo = ( nNo + 1) % WEAPON_NUM;wps[1].nForce = CWeapon::InitialForce[wps[1].nKindNo];}void PrintResult(int nTime) {CWarrior::PrintResult(nTime,NINJA);printf("It has a %s and a %s\n",CWeapon::Names[wps[0].nKindNo],CWeapon::Names[wps[1].nKindNo]);}};class CIceman:public CWarrior {
private:CWeapon wp;
public:CIceman( CHeadquarter * p,int nNo_):CWarrior(p,nNo_) {wp.nKindNo = nNo % WEAPON_NUM;wp.nForce = CWeapon::InitialForce[ wp.nKindNo ];}void PrintResult(int nTime) {CWarrior::PrintResult(nTime,ICEMAN);printf("It has a %s\n",CWeapon::Names[wp.nKindNo]);}};class CLion:public CWarrior {
private:int nLoyalty;
public:void CountLoyalty() {nLoyalty = pHeadquarter ->GetTotalLifeValue();}CLion( CHeadquarter * p,int nNo_):CWarrior(p,nNo_) {CountLoyalty(); }void PrintResult(int nTime) {CWarrior::PrintResult(nTime,LION);CountLoyalty();printf("It's loyalty is %d\n",nLoyalty);}};class CWolf:public CWarrior {
public:CWolf( CHeadquarter * p,int nNo_):CWarrior(p,nNo_) { }void PrintResult(int nTime) {CWarrior::PrintResult(nTime,WOLF); }
};void CHeadquarter::Init(int nColor_, int lv) {nColor = nColor_;nTotalLifeValue = lv;bStopped = false;nCurMakingSeqIdx = 0;nTotalWarriorNum = 0;for( int i = 0;i < WARRIOR_NUM;i ++ ) anWarriorNum[i] = 0;}CHeadquarter::~CHeadquarter () {int i;for( i = 0;i < nTotalWarriorNum; i ++ )  delete pWarriors[i];}
int CHeadquarter::Produce(int nTime) {int nSearchingTimes = 0;if( bStopped )return 0;while( CWarrior::InitialLifeValue[MakingSeq[nColor][nCurMakingSeqIdx]]> nTotalLifeValue &&nSearchingTimes < WARRIOR_NUM ){nCurMakingSeqIdx = ( nCurMakingSeqIdx + 1 ) % WARRIOR_NUM ;nSearchingTimes ++;}int nKindNo = MakingSeq[nColor][nCurMakingSeqIdx];if( CWarrior::InitialLifeValue[nKindNo] > nTotalLifeValue ) {bStopped = true;if( nColor == 0)printf("%03d red headquarter stops making warriors\n",nTime);elseprintf("%03d blue headquarter stops making warriors\n",nTime);return 0;}nTotalLifeValue -= CWarrior::InitialLifeValue[nKindNo];nCurMakingSeqIdx = ( nCurMakingSeqIdx + 1 ) % WARRIOR_NUM ;int nTmp = anWarriorNum[nKindNo];anWarriorNum[nKindNo] ++;switch( nKindNo ) {case DRAGON:pWarriors[nTotalWarriorNum] = new CDragon( this,nTotalWarriorNum+1);break;case NINJA:pWarriors[nTotalWarriorNum] = new CNinja( this,nTotalWarriorNum+1);break;case ICEMAN:pWarriors[nTotalWarriorNum] = new CIceman( this,nTotalWarriorNum+1);break;case LION:pWarriors[nTotalWarriorNum] = new CLion( this,nTotalWarriorNum+1);break;case WOLF:pWarriors[nTotalWarriorNum] = new CWolf( this,nTotalWarriorNum+1);break;}pWarriors[nTotalWarriorNum]->PrintResult(nTime);nTotalWarriorNum ++;return 1;}void CHeadquarter::GetColor( char * szColor) {if( nColor == 0)strcpy(szColor,"red");elsestrcpy(szColor,"blue");
}const char * CWeapon::Names[WEAPON_NUM] = {"sword","bomb","arrow" };
int CWeapon::InitialForce[WEAPON_NUM];
const char * CWarrior::Names[WARRIOR_NUM] = { "dragon","ninja","iceman","lion","wolf" };
int CWarrior::InitialLifeValue [WARRIOR_NUM];int CHeadquarter::MakingSeq[2][WARRIOR_NUM] = { { 2,3,4,1,0 },{3,0,1,2,4} };int main() {int t;int m;//freopen("war2.in","r",stdin);CHeadquarter RedHead,BlueHead;scanf("%d",&t);int nCaseNo = 1;while ( t -- ) {printf("Case:%d\n",nCaseNo++);scanf("%d",&m);int i;for(i = 0;i < WARRIOR_NUM;i ++ )scanf("%d", & CWarrior::InitialLifeValue[i]);RedHead.Init(0,m);BlueHead.Init(1,m);int nTime = 0;while(true) {int tmp1 = RedHead.Produce(nTime);int tmp2 = BlueHead.Produce(nTime);if( tmp1 == 0 && tmp2 == 0) break;nTime ++;}}return 0;
}

021:魔兽世界之二:装备相关推荐

  1. C++面向对象程序设计 021:魔兽世界之二:装备 ---- (北大Mooc)

    文章目录 专题博客链接 前引 他人博客优秀代码 我的代码(提交过不了 但是数据本地测试正常 一行一行的进行了对比 都不知道为什么AC不了) 闲聊 专题博客链接 北大C++ POJ课后习题博客全解记录 ...

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

    编程题#2: 魔兽世界之二:装备 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB ...

  3. C++ 程序设计 week5 魔兽世界二: 装备

    编程题#2: 魔兽世界之二:装备 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB ...

  4. 开源项目 OpenJudge-3:魔兽世界之二:装备

    开源项目 OpenJudge-3:魔兽世界之二:装备 程序说明文档 Github地址 项目主要使用的技术: MVC模式.单例模式.继承与多态.虚函数.STL库.文件流.I/O流.字符串流.智能指针.g ...

  5. 北大C++课后题系列:022:魔兽世界之二:装备

    C++ 022:魔兽世界之二:装备 北大程序设计与算法(三) 描述 魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部.两个司令部之间是依次排列的若干城市. 红司令部,City 1,City 2,- ...

  6. 程设作业:魔兽世界2:装备

    直接贴代码: #include <vector> #include <iostream> #include <iomanip> #include <strin ...

  7. 北大程序设计实习MOOC 编程作业 《魔兽世界之二:装备》

    这次作业是在第一次的基础上完成的,主要要求是完成五种武士的封装.这五种武士的特性(相应类的成员变量)不大相同,但可以从同一个基类派生.随着时间变化,生成相应的武士,并输出相关信息.OJ地址为:这里 解 ...

  8. C++ 魔兽世界之二:装备

    总时间限制: 1000ms 内存限制: 65536kB 描述 魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部.两个司令部之间是依次排列的若干城市. 红司令部,City 1,City 2,--,C ...

  9. MOOC编程题#2: 魔兽世界之二:装备

    描述 魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部.两个司令部之间是依次排列的若干城市. 红司令部,City 1,City 2,--,City n,蓝司令部 两军的司令部都会制造武士.武士一共 ...

最新文章

  1. js里面把密码encode_Python进阶最详细的JS加密登录X博
  2. python 编程一日一练-Python一日一练05----怒刷点击量
  3. 计算机网络运输层之多路复用与多路分解
  4. linux操作mysql的语法_MySQL数据库的基本操作命令
  5. python语言input和if else的嵌套使用_Linux平台下Python if、if..else、if..elif..else、嵌套if语句...
  6. c++中调用Com组件的方法详解
  7. 云际阔,总相连——Let's Connect!
  8. VS2008无法下断点调试的原因
  9. [转]从根上理解高性能、高并发:深入计算机底层,理解线程与线程池
  10. mysql搜索中文 有的匹配不出来_MYSQL-中文检索匹配与正则表达式
  11. 对 React 组件进行单元测试(unit testing)
  12. C++ 偏微分数值计算库_ESYSim仿真器介绍之一 C++库介绍
  13. 几何学五大公理_【欧几里德的平面几何五大公理是什么?】作业帮
  14. Cortex-M0学习
  15. 嵌入式开发:优化嵌入式软件的7个技巧
  16. 2023年全国最新二级建造师精选真题及答案25
  17. Win10/Win7 打印机 [有线局域网共享]
  18. 已经破解好的Quartus软件,license为什么会突然失效
  19. springboot集成elasticsearch6.8.23设置密码xpack连接,及遇到的None of the configured nodes are available
  20. MOOC《程序设计入门——C语言》错题集

热门文章

  1. go语言生成linux桌面快捷,使用Go语言在MacOS创建一个自定义的命令行工具
  2. Catia ProcessDesigner冲压工艺设计视频教程
  3. 回顾蹒跚学步的我(上)
  4. mysql5.7绿色版——我的安装姿势
  5. springboot项目使用swagger时拦截器需要放开哪些URL
  6. python京东自动签到_京东星推官自动领取京豆python脚本和软件
  7. 高薪招聘计算机教师,计算机教师(网络)
  8. 揭秘国内飞机wifi的真相一二
  9. 手机模拟续航测试软件,3D模拟+1080p视频 中兴星星1号续航测试
  10. DF是什么计算机语言,x86汇编语言中的CLD和STD是什么? DF做什么?