# Mud_CPP **Repository Path**: KaiFeng10086/mud_-cpp ## Basic Information - **Project Name**: Mud_CPP - **Description**: 中国海洋大学程序设计实践(c++开发MUD游戏)——小D - **Primary Language**: C++ - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2023-08-25 - **Last Updated**: 2025-07-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Mud_CPP #### 介绍 中国海洋大学程序设计实践(c++开发MUD游戏)——小D #### 软件架构 软件架构说明 #### STL模板库中容器、算法、迭代器等各种组件说明: - Vector(动态数组): ```python 调用vector需要#include头文件 使用方法:std::vector<数据类型>命名 有关函数: ① v[i]或v.at(i)//返回v[i]的值 ② v.size();//返回v数组元素总个数 ③ v.front();//返回v数组第一个元素的值 ④ v.back();//返回v数组最后一个元素的值 ⑤ v.clear();//清空v数组 ⑥ v.begin();//返回v数组第一个数的地址 ⑦ v.end();//返回v数组最后一个数之后的地址 ⑧ v.empty();//判断v数组是否为空,是空则返回1(true),非空(有元素)则返回0(false) ⑨ v.swap(v1);//v1是另一个动态数组,将v和v1元素互换 ⑩ swap(v,v1);//同⑨ ``` - Map(映射): ```python 调用map需要#include头文件。 使用方法:map能够建立一对一的映射: 如map maps;//第一个是键的类型,第二个是值的类型,建立了一个从string 到int 的映射。 使用方法:maps.find()//查找, maps.clear()//清空, maps.erase()//删除 一个元素, maps.size()//长度, maps.empty()判断其是否为 空,maps.swap()交换两个map. Pair: #include template struct pair; pair p(v1, v2) p是一个pair,两个类型分别为T1和T2的成员都进行了值初始化 pair p = (v1, v2) p是一个成员类型为T1和T2的pair:first和second成员分别用v1和v2进行初始化,等价于p(v1, v2) make_pair(v1, v2) 返回一个用v1和v2初始化的pair。pair的类型从v1和v2的类型推断出来 p.first返回p的名为first的(公有)数据成员 p.second返回p的名为second的(公有)数据成员 ``` #### 程序中用到的设计模式: - 开闭原则(Open Close Principle):对软件实体的改动,最好用扩展而非修改的方式。如果要修改代码,尽量用继承或组合的方式来扩展类的功能,而不是直接修改类的代码。 在代码中,从Entity类开始,派生了各种类。主角,NPC,敌人,除了继承的方法,每个类都有自己独特的成员和方法来实现对应目标。 - 观察者模式(Observer Pattern):定义了一种一对多的依赖关系,当一个对象状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 skill(技能),store(商店),fight(战斗),task(任务),这些类都依赖于leader(主角)类,这使得主角的状态(攻击,金币,血量,任务物品是否存在,等属性)改变,所有依赖于主角的类能自动知道主角的属性,并进行相关判断(伤害,货币是否足够购买物品,任务是否完成等)。 #### 课程设计中遇到的问题及解决方案: - 字体颜色:为了实现不同信息展示模块不同颜色,尝试了调用控制台句柄,继而控制输出颜色,但是我们发现这样控制文字输出太多,不便于分块改变颜色,于是更改方法,使用了类似cout << "地点:" << "\x1b[36m"<< "宿舍" <<\x1b[0m;的方法控制一段语句的颜色。(但是部分情况使用句柄控制)。 - 存档读档:因部分类的成员中有vector和map创建的对象,所以直接读取leader对象会出现一定的问题,于是我们将主角属性等重要信息细分为各个数值储存,再依次读取,最后初始化主角,这样就解决了存读档问题。 - Npc任务间的联动:每个Npc的任务之间都有一定的关联性,所以有的Npc任务的触发需要前置任务,对于图书管理员Npc,他可以发布多个任务,所以在前置任务判断上增加了许多困难,我们通过设置每个Npc的flag,并控制Npc中与任务有关方法的返回值,实现Npc发布任务的更新以及任务间的联动。 - Easy-x图像库处理文字: 重复包含头文件的处理:一开始试运行部分代码时,总是有重复定义的报错,后来查找资料,发现每个.h头文件前需要加上#program once 这样就保证文件互相#include时,不会出现重复定义的问题。 - 战斗系统中技能与消耗道具的使用: 因为设计的技能和消耗道具的功能比较多样,有的会有持续伤害或持续的debuff,有的会对自己有持续的增益,所以战斗系统并不是简单的HP的增减,我们通过设置一个有关消耗道具和技能的计数器,判断这些消耗道具和技能的持续时间,从而控制消耗道具和技能的多回合效果。