程序设计-魔兽世界系列大作业(一)

项目OJ提交:魔兽世界-备战
课程地址:程序设计与算法(三)-C++程序设计

思路与类架构

Warrior类

有五种武士,分别是dragon 、ninja、iceman、lion、wolf,那么就可以抽象出一个武士类,具体的再实例化出对应的武士对象。

每个武士类,都有几个属性:类别(姓名),所属阵营,在该阵营的编号,武力值。然后具备一个方法,就是出生,出生是每个武士必备的过程。而本题的出生,即播报一条武士出生的信息。请根据题目要求写好出生播报的打印语句,要注意:武力值和编号之间,仅一个逗号,没有空格!

类架构中,要注意的是:

  • 武力值和类别(姓名)是和阵营无关的;
  • 阵营和阵营内的编号是阵营有关的。
    因此,要先实例化阵营,后实例化武士,要在阵营中实现出生武士的方法,并且调用武士的出生过程。

Headquarter类

阵营类能被实例化成红蓝两个阵营,每个阵营都有的属性是:类别(姓名),生命元,武士出生顺序。

但是,为了能够生成武士,以及得到武士在阵营内的信息,还需要的属性是:当前武士的编号ID,统计武士在该阵营的数量。然后,红蓝两个阵营的生命元都是相同的。

在类架构中,需要注意的是:

  • 当生命元不足以生成当前武士时,要顺延,要么后面的武士中有能生成的,要么所有武士都无法生成,触发生成终止的播报,并不再生成武士;
  • 阵营和武士,是从属关系,是has的关系,阵营拥有武士,但是本题并未涉及到武士的动态变化,例如战斗,死亡等事件,因此未设计;
  • 如果要设计,则需要有武士相关的成员变量,例如武士列表等。

C++代码实现

#include <cstdio>
#include <string>
#include <vector>
#include <memory>
#include <unordered_map>static
std::unordered_map<std::string, int> warriorStrength;class Warrior {private:std::string name, camp;int id, strength;public:Warrior(const std::string& name_,const std::string& camp_,int id_, int strength_) : name(name_), camp(camp_), id(id_), strength(strength_) { }void born(int timeStamp, int numsInCamp) {printf("%03d %s %s %d born with strength %d,""%d %s in %s headquarter\n", timeStamp, camp.c_str(),name.c_str(), id, strength, numsInCamp, name.c_str(), camp.c_str());}
};class Headquarter {private:std::string name;std::vector<std::string> order;std::unordered_map<std::string, int> cntWarrior;int healthMeta, curID;size_t curIdx;public:Headquarter(const std::string& name_, const std::vector<std::string>& order_,int healthMeta_, int curID_ = 1, size_t curIdx_ = 0) : name(name_), order(order_), healthMeta(healthMeta_), curID(curID_), curIdx(curIdx_) { }std::string getNextWarriorName() {size_t orderSize = order.size();for (size_t i = 0; i < orderSize; ++i) {std::string curName = order[curIdx];if (healthMeta >= warriorStrength[curName]) {return curName;}curIdx = (curIdx + 1) % orderSize;}return "NULL";}bool bornWarrior(int timeStamp) {std::string curName = getNextWarriorName();if ("NULL" == curName) {printf("%03d %s headquarter stops making warriors\n",timeStamp, name.c_str());return false;}int curStrength = warriorStrength[curName];healthMeta -= curStrength;int curNumsInCamp = ++cntWarrior[curName];std::make_shared<Warrior>(curName, name, curID, curStrength)->born(timeStamp, curNumsInCamp);curID++;curIdx = (curIdx + 1) % order.size();return true;}
};int main() {int caseNums;scanf("%d", &caseNums);for (int cs = 1; cs <= caseNums; ++cs) {int meta, dragon, ninja, iceman, lion, wolf;scanf("%d%d%d%d%d%d", &meta, &dragon, &ninja, &iceman, &lion, &wolf);warriorStrength = {{"dragon", dragon}, {"ninja", ninja}, {"iceman", iceman},{"lion", lion}, {"wolf", wolf}};Headquarter red("red", { "iceman", "lion", "wolf", "ninja", "dragon" }, meta);Headquarter blue("blue", { "lion", "dragon", "ninja", "iceman","wolf" }, meta);printf("Case:%d\n", cs);bool redOK = true, blueOK = true;for (int curTime = 0; ; ++curTime) {if (redOK) { redOK = red.bornWarrior(curTime); }if (blueOK) { blueOK = blue.bornWarrior(curTime); }if (!redOK && !blueOK) { break; }}}return 0;
}

北京大学程序设计MOOC-魔兽世界系列大作业(一)相关推荐

  1. 北京大学程序设计MOOC-魔兽世界大作业(二)

    程序设计-魔兽世界系列大作业 上一篇作业解析与代码:魔兽世界-备战 项目OJ提交:魔兽世界-装备 课程地址:程序设计与算法(三)-C++程序设计 思路与类架构 1. 设计原则 (1)不改动测试代码,测 ...

  2. 西安电子科技大学c语言答案,西安电子科技大学2021春 面向对象程序设计(C++)大作业答案...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 一.简答题(共 10 分) 1.(3 分)什么是引用?它与指针有什么区别? 2.(3 分)C++提供了哪些循环语句?它们各自的特点是什么? 3.(4 分) ...

  3. 实验报告-python文库_python程序设计与实践大作业

    python程序设计与实践大作业实验报告陆阳孙勇裘升明.doc 还剩 28页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,马上远离加班 ...

  4. c#程序设计 大作业

    第一题: 控制台程序设计题,设计一个有继承机制下类的层次化结构程序, 该程序中基类为一个圆Circle是抽象类,在Circle类中定义数据成员半径r,圆心位置坐标p(x,Y)为另外一个Point类的对 ...

  5. C++面向对象程序设计大作业:魔兽世界(三):开战

    C++面向对象程序设计大作业:魔兽世界(三):开战 问题描述 问题分析 代码 问题描述 问题来自于北京大学郭炜老师的C++慕课的大作业 魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部.两个司令部 ...

  6. 魔兽世界(三):开战 北京大学慕课C++大作业 代码与思路

    类的组织 总体思路: 自底向上为:Weapon -> Warrior -> HeadQuarter | City -> main函数 每个司令部含有一个Warrior的vector, ...

  7. 东华大学java_东华大学2020秋《Java程序设计》期末大作业

    东华大学继续教育学院 2020年秋季学期 远程学历教育<Java程序设计>期末大作业 一.选择题(本大题共10小题,每小题 1分, 共10分) 1.    下列哪个不是面向对象程序设计的基 ...

  8. c语言程序设计0039大作业答案,2019西南大学0039C语言程序设计机考大作业答案.doc...

    - PAGE 1 - 西南大学网络与继续教育学院课程考试试题卷 类别: 网教 2019年 6月 课程名称[编号]: C语言程序设计 [0039] A卷 大作业 满分:100 分 一.大作业题目 1.简 ...

  9. python2048小游戏程序设计大作业_C语言大作业报告——2048小游戏程序

    大作业题目 类型 游戏 班 号 学 号 所在院系 学 期 2020 年春季学期 任课教师 实验类型 综合设计型 实验目的:  掌握程序设计的基本算法和简单数据结构基础,能够综合运用基本控制语句.算法 ...

最新文章

  1. vim切换编程语言_把 Vim 打造成源代码编辑器 - C 语言编程透视
  2. python实时监控_使用Python监控Linux系统
  3. linux 产生0~9内的随机数
  4. linux 检测远程端口是否打开---nmap命令
  5. hapRroxy 安装配置详解
  6. SPOJ - LCS Longest Common Substring(后缀自动机)
  7. python arcgis 图书_arcgis python
  8. 视觉平衡与物理平衡_设计中的平衡理论为什么这么重要?
  9. Julia学习(1)——入门
  10. 有道词典(android)v4.3.3去广告清爽版+离线词,有道词典4.3.3安
  11. 金蝶eas怎么引出凭证_如何引出会计分录序时簿?
  12. mp4数据恢复:mp4视频格式化怎么恢复
  13. LeetCode 592
  14. 财务分析之资产负债表
  15. 2020.8.5丨细菌基因组二代测序组装流程梳理
  16. Java使用Jco连接sap详解
  17. Python导入arcpy包出现“ImportError: No module named arcpy”
  18. 安装redis时 提示执行make命令时提示 CC adlist.o /bin/sh: cc: 未找到命令
  19. Pdf.js body.getReader 报错问题
  20. 维克森林大学计算机科学专业好不好,维克森林大学计算机专业怎么样?

热门文章

  1. 42gears_使用Google Gears进行快速客户端搜索
  2. 短视频源码教程之短视频app制作如何实现合拍功能
  3. VUE项目中的微信扫码登录
  4. 3D角色硬表面建模技巧与思路分享【下】
  5. 嵌入式课程设计 使用 tini4412配合交叉编译环境 完成串口助手的制作(已解决主机与设备通过网线FTP连接和交叉编译环境的部署问题)
  6. python抓取猫眼电影评论,200多行代码,哈哈
  7. swift语言基础语法思维导图
  8. python的运维开发课程_老男孩python高级运维开发课程
  9. 老男孩python第九期_python学习之老男孩python全栈第九期_day004知识点总结
  10. mysql 视图优势_MySQL视图简介及优缺点