基于QT(C++)实现(窗体)平台类对战游戏【100010513】
1. 设计任务的描述
用面向对象的设计方法来设计一款平台类对战游戏。
内容包括宠物小精灵的加入、用户注册与平台登录、游戏对战的设计。
2. 功能需求说明及分析
2.1 宠物小精灵的加入
- 设计宠物小精灵的类,为简化游戏设计,精灵的属性包括种类(力量型:高攻击;肉盾型:高生命值;防御型:高防御;敏捷型:低攻击间隔,共四种)、名字、等级、经验值、攻击力、防御力、生命值、攻击间隔等(以上属性必须,其他属性可自行添加))(基本要求:本游戏 中 只有上面的 4 种类型。 进一步要求:上述 4 种类型可以进一步深入划分,比如力量型又可以再细分为:沙瓦朗、火爆猴、腕力等)。
- 每个精灵初始等级为 1 ,满级 15 级,每当精灵升级的时候,宠物对应的属性值会有少量增加(主属性增加量相对较多)。
- 每个精灵有自己独特的攻击方式,如闪电攻击、火焰攻击等等,请设计一个精灵的基类,并将精灵的攻击方法设为虚方法以方便子类重写。
- 请写一个测试程序对设计的精灵类的相关属性和方法(包括攻击函数,升级函数等)进行测试。
- 题目主要考察点:类的继承,对象数据成员设计,成员函数设计。
2.2 用户注册与平台登录
- 每个用户需要注册一个账号,用户名全局唯一,不能有任何两个用户名相同,要考虑注册失败的场景时的反馈。
- 实现注册、登录、登出功能, 均采用 C/S 模式,客户端和服务端用 socket 进行通信,服务端保存所有用户的信息。
- 每个用户拥有:用户名、拥有的精灵,两个属性。 用户注册成功时,系统自动随机分发三个 1 级精灵给用户
- 用户可以查看所有成功注册用户拥有的精灵,也可以查看所有当前在线的用户。
- 题目主要考察点: socket 通信,交互场景反馈,用户信息存储方式界面交互,其它合理的新颖设计。
2.3 游戏对战的设计
- 已经登录的在线用户可以和服务器进行虚拟决斗,决斗分两种:升级赛和决斗赛,两种比赛都能增长精灵宠物经验值。服务器上有一个虚拟精灵的列表,用户可以挑选其中任意一个进行比赛(升级赛或者决斗赛)。另外决斗赛中用户胜出可以直接获得该战胜的精灵,失败则系统从用户的精灵中随机选三个(不够三个精灵的情况就选择他所有的精灵),然后由用户选一个送出(不够三个精灵的情况就选择他所有的精灵)。
- 用户如果没有精灵(比如总是失败,已经全部送出去),则系统会随机放给他一个初级精灵。
- 请让你的系统自动模拟每场比赛的每次出招。另外,为了增加不确定性,可以加入概率闪避攻击和暴击伤害机制。
- 用户增加新功能,可以查看某个用户的胜率
- 用户增加新属性,为宠物个数徽章(金银铜)和高级宠物徽章(金银铜),分别根据拥有的宠物个数的多少和拥有高级宠物(15 级)个数的多少颁发。
- 题目主要考察点:客户端与服务器数据交互(可采用多进程或异步通信或其他方法均可),并发请求处理,类的方法设计,伤害计算方法设计,界面交互,其它合理的新颖设计。
3.总体方案设计说明
总体解决方案分为服务端与客户端两部分,采用 UDP 进行通信(服务器端口 62100)。服务端负责所有的数据存储及处理,客户端负责发送用户操作及获取服务端信息。
服务端根据题目要求共抽象出服务器、验证、用户、精灵、战斗等类;客户端采用 Qt 实现图形化界面开发。
4. 数据字典
4.1 服务端
服务器(Server) | static Server* getInstance() | 获取单件 |
---|---|---|
服务器(Server) | int assign(char*, int, SOCKET&, SOCKADDR&) | 从缓存中读取客户端发送的指定大小的内容,并分配跳转至其他函数 |
服务器(Server) | Fairy* getEnemybyNum(const int) | 返回指定序号的服务器端精灵 |
服务器(Server) | list<Fairy*> listEnemy | 保存服务器端精灵的链表 |
服务器(Server) | int buildInfoEnemy(char*) | 构造服务器端精灵的信息列表至指定内存中 |
服务器(Server) | int informReport(char*, const char*) | 构造字符串至指定内存中 |
服务器(Server) | static Server _instance | 单件实例 |
服务器(Server) | int enemyCntDefault | 服务器端精灵的初始个数 |
验证(Auth) | static Auth* getInstance() | 获取单件 |
验证(Auth) | int regist(const string , const string, const char*) | 处理注册 |
验证(Auth) | int login(const string, const string) | 处理登录 |
验证(Auth) | int logout(const string, const string) | 处理注销,维护在线列表 |
验证(Auth) | int verify(const string, const string) | 验证用户名及密码,维护在线列表 |
验证(Auth) | list<User*> onlineList | 用户列表 |
验证(Auth) | int getOnlinePlayer(char*) | 构造在线玩家信息至指定内存中 |
验证(Auth) | struct infoOnlinePlayer | 玩家信息格式 |
验证(Auth) | map<string, string> registMap; | 由用户名映射至密码进行验证 |
验证(Auth) | map<string, User*> savedataMap | 由用户名映射至玩家信息位置 |
验证(Auth) | int saveMap() | 存储服务端数据至本地文件 |
验证(Auth) | int loadMap(); | 从本地文件读取服务端数据 |
用户(User) | void giveOut(const int) | 送出指定序号的精灵 |
用户(User) | Fairy* getFairybyNum(const int) | 返回指定序号的精灵 |
用户(User) | int buildInfoFairy(char*) | 构造精灵信息至指定内存中 |
用户(User) | int buildInfoBadage(char*) | 构造徽章信息至指定内存中 |
用户(User) | int buildInfoAttack(char*, const int) | 构造指定序号精灵的攻击名称至指定内存中 |
用户(User) | void checkNoFairy() | 检查是否失去所有精灵 |
用户(User) | void addGiveOut() | 添加待送出精灵 |
用户(User) | string getName() | 获取用户名称 |
用户(User) | void healFairy(); | 治疗该玩家所有精灵 |
用户(User) | void getBadage() | 获取徽章 |
用户(User) | time_t timeLastOpt | 上次用户进行操作的时间 |
用户(User) | list<Fairy*> listFairy | 精灵列表 |
用户(User) | list<Fairy*> listGiveOut | 待送出精灵列表 |
用户(User) | vector vecBadage | 徽章列表 |
用户(User) | int timesBattleTol | 总战斗次数 |
用户(User) | int timesBattleSuc | 总战斗获胜次数 |
用户(User) | string nameCRC | CRC32 方式转换的用户名 |
用户(User) | string name | 用户名称 |
用户(User) | struct fairyInfo | 精灵信息结构体 |
用户(User) | const int numInitialFairy | 玩家初始精灵数 |
精灵(Fairy) | int getExp() | 获取经验值 |
精灵(Fairy) | int getLevel() | 获取等级 |
精灵(Fairy) | virtual int attackOtr(Fairy* const) | 精灵攻击方法 |
精灵(Fairy) | void addExp(int) | 增加经验值 |
精灵(Fairy) | int getHurt(float) | 受到伤害 |
精灵(Fairy) | void getHeal() | 治疗 |
精灵(Fairy) | string name | 精灵名称 |
精灵(Fairy) | string attackName | 精灵攻击名称 |
精灵(Fairy) | int exp | 经验值 |
精灵(Fairy) | int probMiss | 闪避率 |
精灵(Fairy) | int probCritic | 暴击率 |
精灵(Fairy) | float nowHP | 当前生命值 |
精灵(Fairy) | float valueATK | 攻击力 |
精灵(Fairy) | float valueDEF | 防御力 |
精灵(Fairy) | float valueHP | 生命力 |
精灵(Fairy) | float valueAGL | 敏捷力 |
精灵(Fairy) | advantage adv; | 精灵属性 |
精灵(Fairy) | const float timesSuperior | 属性克制倍率 |
精灵(Fairy) | const float timesAttack | 攻击与攻击力倍率 |
精灵(Fairy) | const float timesDefend | 防御与防御力倍率 |
精灵(Fairy) | const float timesLevelUp | 升级加成倍率 |
精灵(Fairy) | const float timesHP | 生命力与生命值倍数 |
精灵(Fairy) | const float timesCritical | 暴击伤害倍率 |
精灵(Fairy) | const string enemyName[] | 怪物名称 |
精灵(Fairy) | const int enemyCnt | 怪物总种类 |
精灵(Fairy) | enum advantage | 属性,枚举类型 |
战斗(Battle) | static Battle* getInstance() | 获取单件 |
战斗(Battle) | static Battle _instance | 单件实例 |
战斗(Battle) | int pk(char*, Fairy* const, Fairy* const, User* const, const int) | 在两个指定精灵间发起战斗 |
4.2 客户端
主窗口(MainWindow) | char ADDR_SRV[32] | 存储 IPv4 格式的服务器地址 |
---|---|---|
QUdpSocket* sock | UDP 发送套接字 | |
void sockListen() | 接收服务端的报文并分配至其他函数中 | |
void getAttackName(const int) | 获取指定序号精灵的攻击名称 | |
void requestArena() | 请求决斗场精灵信息 | |
void requestSelfFairy() | 请求自己的精灵信息 | |
void requestOthersFairy() | 请求他人的精灵信息 | |
void report(const QString&) | 将内容反馈至信息框 | |
QString time_t2QString(const time_t) | 将时间类型转换为 QString 类型 | |
Ui::MainWindow *ui | ui 设计文件 | |
struct sockHeder | 报文头结构 | |
struct fairyInfo | 精灵信息结构 | |
struct infoOnlinePlayer | 玩家列表信息结构 | |
5. 各模块设计说明
5.1 服务端
服务器(Server) | 采用单件设计 |
---|---|
服务器(Server) | 负责处理客户端发送的信息,分配任务至其余模块中 |
服务器(Server) | 维护服务端的精灵列表 |
验证(Auth) | 采用单件设计 |
验证(Auth) | 实现注册、登录、登出功能 |
验证(Auth) | 维护注册、在线玩家列表 |
验证(Auth) | 引导至用户精灵信息、用户名及密码等所有信息的存储位置 |
验证(Auth) | 备份及还原所有信息 |
用户(User) | 存储用户名、精灵列表等基本信息 |
用户(User) | 实现对精灵的送出、治疗等操作 |
用户(User) | 维护徽章信息 |
用户(User) | 维护战斗次数、胜率等信息 |
精灵(Fairy) | 存储精灵名称、属性、经验、攻击类型等基本信息 |
精灵(Fairy) | 负责造成伤害、接受伤害、治疗等实现 |
战斗(Battle) | 采用单件设计 |
战斗(Battle) | 负责战斗详细判定的具体实现 |
战斗(Battle) | 维护战斗详细信息的记录和构造 |
5.2 客户端
登录框 | 输入用户名及密码 |
---|---|
登录框 | 进行注册、登录、登出操作 |
玩家列表 | 查看当前在线玩家 |
玩家列表 | 获取玩家胜率、精灵等信息 |
精灵框 | 显示自己的精灵信息 |
精灵框 | 进行送出、治疗操作 |
精灵框 | 显示其他玩家的精灵信息 |
决斗场 | 显示服务器上精灵的信息 |
信息框 | 显示当前的操作信息 |
信息框 | 传递服务器发送的战斗详细信息、提示等内容 |
徽章框 | 获取徽章信息 |
服务器 IP 地址框 | 进行修改服务器地址的操作 |
6. 测试情况
6.1 题目一
6.2 题目二
6.3 题目三
7. 评价和改进意见
界面只有文字,暂时不够美观。
数值设计待改进,游戏性不够强。
8. 用户使用说明
8.1 服务器选择
在界面中服务器 IP 地址窗口中填写要登录的服务器 IP 地址。
8.2 注册、登录与登出
在界面中输入用户名、密码后,即可选择【注册】、【登录】,在登录后可选择【注销】。
8.3 玩家列表
点击该界面下的【刷新】查看所有服务器上的玩家。选择某一玩家后点击【查看更多】,即可查询到该玩家的精灵信息。
8.4 徽章
点击该界面下的【刷新徽章列表】,即可查询到当前的徽章信息。
8.5 战斗
在【决斗场】及【当前拥有的精灵】界面中,请单击选择要出战的精灵及要对战的怪物。
9. 生成方法
- 服务端:服务端使用 Visual Studio 2019 进行开发,控制台应用。
- 客户端:客户端使用 Qt Creator 4.11.1 (Community)进行开发,构建套件为 Desktop Qt 5.14.2 MinGW 32-bit。
随后在此选择升级赛、决斗赛类型,并单击右下角【攻击】即可开始战斗。
♻️ 资源
大小: 101MB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87400296
基于QT(C++)实现(窗体)平台类对战游戏【100010513】相关推荐
- 基于C++实现平台类对战游戏
1. 设计任务的描述 用面向对象的设计方法来设计一款平台类对战游戏. 内容包括宠物小精灵的加入.用户注册与平台登录.游戏对战的设计. 2. 功能需求说明及分析 2.1 宠物小精灵的加入 设计宠物小精灵 ...
- 基于安卓app开发项目(在线数独对战游戏平台)的毕业设计(附源码)
大家好!我是职场程序猿,感谢您阅读本文,欢迎一键三连哦. 基于安卓app开发项目(在线数独对战游戏平台)的毕业设计 目录 一.项目简介 二.系统核心功能模块部分截图 2.1用户登陆的设计与实现 2.2 ...
- 以太联盟 基于区块链技术的角色扮演对战游戏
以太联盟 是一款基于区块链技术的角色扮演对战游戏.玩家可以通过召唤英雄来为自己战斗从而赢取以太币奖励.每个玩家至多可以派5名英雄_上场.游戏共有5大种族, 5个职业,彼此之间互相克制,另外不同英雄还拥 ...
- qt开发的有界面的简易对战游戏——斗罗大PK(可用作c,c++课程设计)
[开发简介] 用QtCreator开发环境和c++ 语言来编写一个游戏,名字为<斗罗大PK>. [游戏规则] <斗罗大PK>有 6 位英雄,每位英雄拥有数量不同的 3 种招数, ...
- [埋坑系列] 基于QT/C++的杰瑞走迷宫小游戏 :1.大体构造
本次数据结构课程设计本打算做老鼠走迷宫,毕竟也比较喜欢迷宫,也有过经验, 框架大体设计好之后发现挑战性并不强,对这些算法都有一些经验,所以决定先去搞树做词典,在此埋个坑 |_ _ _QT图形界面 | ...
- 基于QT的指挥猫猫打架玩耍的小游戏设计
目录 . 游戏概览 1 1.1 界面交互 1 1.2 地形设计 4 1.3 角色设计 4 1.4 战斗设计 5 1.5 关卡设计 5 1.7 其他要求 5 2.1 总览 6 2.2 主要关系图 6 2 ...
- [内附完整源码和文档] 基于Qt5的国际跳棋双人网络对战游戏
一.软件用途 本软件是一个国际跳棋小游戏,使用Qt5编写,实现了国际跳棋游戏的双人网络对战版,以及任意局面的输入功能. 二.运行方式 安装Qtcreater之后,将源代码拷贝至本机并运行Qtcreat ...
- 基于Qt框架实现的 C/S架构的外卖平台软件系统
资源下载地址:https://download.csdn.net/download/sheziqiong/85628215 基于Qt框架实现的 C_S架构的外卖平台软件系统 演示视频 C/S 架构的外 ...
- 基于STM32MP1和QT的疫情监控平台
目录 1.前言 2.数据接口的获取 3.Qt界面的实现 4.在开发板上运行Qt程序 5.使用无线模块联网 6.代码下载 1.前言 之前我使用桌面版本Qt实现了肺炎疫情监控平台:基于Qt的新冠肺炎疫情数 ...
最新文章
- python变量如何声明_如何确定变量是否在Python中声明?
- LCS2005客户端配置详解:LCS2005系列之二
- MPLS服务合同到期了,是否该续签?
- 【习题0】准备工作【第0天】
- 计算机房的标准和规定,数据中心机房建设,需要依据哪些国家标准和行业标准或规范?...
- 【MATLAB生信分析】MATLAB生物信息分析工具箱(一)
- 计算机网络1MB等于多少b,什么是Mb,1Mb等于多少Kb?
- 如何在 Vim 中用换行符替换字符
- 【webpack系列】webpack小老弟打包大项目
- 第13期 《万物并作,吾以观复》
- mysql 海明距离_mysql根据经纬度求两地距离(示例代码)
- 【动手学深度学习】06-ResNet解析
- go-micro框架
- 壁纸不够用?教你爬空优美图库的动漫壁纸
- 什么是长连接,什么是短连接?长连接和短连接的区别是什么?
- 计算机函数left的用法,EXCEL中的left函数怎么使用?
- 数学小课堂:数学和自然科学本质的差别(微积分中的极限和生活中的极限)
- 用VC实现的禁用光驱程序
- 学习virtuoso软件过程-Linux基本命令篇
- 三种JS截取字符串方法