The RPGgame with QT

一、 系统架构


该项目有4个ui组成,其中mainwindow作为项目程序入口,窗口跳转流程为:mainwindow->gamegraph->area_prairrie->playerstastus。

主要游戏功能装载在gamegraph和area_prairrie两个ui中,而该两个ui中,主要功能函数分别装载在gamegraph.h、monster中。

对于RPG游戏,person类主要存储了关于游戏玩家的个人属性,包括攻击力、防御力、HP、LV等基础属性以及装备、称号等高级属性。而monster类则存储了怪物的基础属性、战斗模式、击杀奖励等属性及方法。area_prairrie类则存储一个区域的所有怪物对象,及区域内一些游戏性功能。

二、游戏玩法

首先是开始游戏画面,这里可以选择开始游戏,继续游戏和结束游戏三个选项,点击开始/继续游戏后进入下一个界面——主游戏界面。

在主游戏界面下,玩家可以选择恢复生命值、前往武器或防具店强化自身属性、出城打怪、保存游戏及退出游戏等功能,如下图所示:

武器、防具点及旅店与常规游戏一样,这里不再介绍,我们直接看出城即战斗界面:

如上图所示,出城后,我们可以查看自身状态,点击原处刷怪或继续前进则可以进入战斗状态,战斗过程在本游戏中直接跳过,在下方直接输出战斗结果,如下图所示:

战斗结束后可以选择是否继续前进,需要注意的是,为了区分难度,这里每一次继续前进遇到的怪物难度都会逐渐增加,直到遇到BOSS,而如果玩家在与怪物对战过程中失败,则游戏结束,如下图所示:

而如果不继续前进,则可以持续和当前难度水平怪物战斗提升等级,积攒金币,通过购买装备提升自己从而击败怪物,在这过程中,玩家可以随时查看自身状态,如下图所示:

三、关键算法设计

3.1 战斗

本游戏中,与怪物战斗采用最简单的攻防相抵造成伤害。算法封装在Monster类中,代码如下:

void monster::battle(person &you)
{while (you.HP_now > 0 && HP >0){if(you.DEF+you.have[2] < ATK)you.HP_now -= (ATK - you.DEF-you.have[2]);if(you.ATK +you.have[1] > DEF)HP -= (you.ATK +you.have[1]- DEF);else{QMessageBox box;box.setText("怪物防御力太高了,你打不动它,于是逃跑了!");box.exec();return ;}cout << "你的当前生命值为:" << you.HP_now << endl;cout << "怪物的当前生命值为:" << HP << endl;}if (you.HP_now <= 0){you.gameover();}if (HP<=0){cout << "恭喜你击败了怪物" << endl;cout << "你获得了金币,同时升级了" << endl;you.LVUP(1);you.show_stastus();you.getmoney(money);}
}void monster::BOSS_battle(person& you)
{int MAX=HP;while (you.HP_now > 0 && HP > 0){if(you.DEF+you.have[2] < ATK)you.HP_now -= (ATK - you.DEF-you.have[2]);if(you.ATK +you.have[1] > DEF)HP -= (you.ATK +you.have[1]- DEF);if (HP * 2 <= MAX)ATK = ATK * 1.2;if (HP * 10 <= MAX)ATK = ATK * 1.25;cout << "你的当前生命值为:" << you.HP_now << endl;cout << "怪物的当前生命值为:" << HP << endl;}if (you.HP_now <= 0){you.gameover();}if (HP <= 0){you.LVUP(5);you.show_stastus();you.getmoney(money);}
}

从上述代码中可以看到,游戏采用回合制,每次怪物对玩家造成的伤害=怪物的攻击力-玩家的防御力,而玩家对怪物造成的伤害同理,当有一方生命值先扣为0以下时,另一方获胜。而对于BOSS战,为了提升游戏难度,BOSS战中,Boss的战斗方式多了一个当BOSS血量降至一半以下时,BOSS造成的伤害提升,当血量降至10%以下时,BOSS攻击力再次提升。

3.2 玩家属性的全程使用

在RPG游戏中,玩家的属性在各个游戏环节中均要用到,因此这一大属性的传递是游戏设计过程中的一大重点。

在本游戏中,玩家游戏属性通过一个类对象来存储,而该类对象在第一次开始游戏时初始化,在以后则使用该对象的值进行各游戏功能。在这个过程中,如何在各个窗体之间传递该类对象值则是重中之重。在本游戏中,玩家属性通过QVariant包装,然后通过信号触发SLOT槽函数,将该包装属性传递给下一子窗体,从而实现了类对象的不同窗体间的传递功能。

具体算法如下:

首先对类对象做一个宏定义

Q_DECLARE_METATYPE(person)

接着在窗口构造函数中创建子窗口对象的一个指针变量,然后通过connect函数链接

 area =new area_prairie(this);connect(this, SIGNAL(send_data(QVariant)), area, SLOT(setvalue(QVariant))); // send the message of player to area_prairie

然后在对应窗口跳转功能处发送信号

QVariant variance;
variance.setValue(Player);
emit send_data(variance);//发出信号

接着在子窗口处接受该variance包装,接受函数为connect函数参数内的SLOT函数(定义在子窗体)。

void area_prairie::setvalue(QVariant data)
{person player ;player = data.value<person>();
}

如上便完成了类对象在不同窗体间的传递。而子窗体要将数据传回父窗体算法也大致相同,只是大部分定义需在父窗体定义,如connect函数如下:

connect(area, SIGNAL(send_data(QVariant)),this,SLOT(setvalue(QVariant)) );  //receive the message of player from area_prairie

send_data信号在子窗口定义,SLOT函数在父窗口定义,如法炮制即可。

最后,附上代码的开源地址:Git仓库

QT大作业——自制小游戏相关推荐

  1. 安卓大作业 安卓小游戏 养宠物战斗游戏(可以注册登录)

    宠物类养成游戏 (下载链接在文末)可以注册登录,移动开发大作业,适合初学者学习使用 详情如图: 点我下载资源 https://download.csdn.net/download/weixin_434 ...

  2. Python选修课,期末大作业Pygame小游戏<Sharpshooter>

    本篇博文为博主大一Python选修课的期末作业,主要运用了Pygame叙写了一个实现小小功能的小游戏,可以随意拿去当作业上交.(程序在文底附录) 一.目标分析. 1.在屏幕下方中央生成一个炮台 2.随 ...

  3. HTML5期末大作业:小礼品购物网站设计——小礼品购物商城网站(12页) HTML+CSS+JavaScript html网页设计期末大作业_网页设计平时作业

    HTML5期末大作业:小礼品购物网站设计--小礼品购物商城网站(12页) HTML+CSS+JavaScript html网页设计期末大作业_网页设计平时作业 常见网页设计作业题材有 个人. 美食. ...

  4. unity团队大作业-足球射门游戏

    unity团队大作业-足球射门游戏 unity团队大作业,足球射门游戏,有分数统计,达到一定分数会变难,适合初学者学习使用,如下动态图所示:(资源链接在文末) 点我下载资源

  5. 用Qt做的拼图小游戏

    思路:在主界面可以选择图片进行对应的拼图,把一张600*600的图片分割成3*3张200*200的九宫格图片,对每张图片进行编号,对应0~8,然后打乱顺序,用的是随机函数,然后添加鼠标过滤事件:鼠标左 ...

  6. Unity 游戏实例开发集合 之 CompoundBigWatermelon (简单合成一个大西瓜) 休闲小游戏快速实现

    Unity 游戏实例开发集合 之 CompoundBigWatermelon (简单合成一个大西瓜) 休闲小游戏快速实现 目录 Unity 游戏实例开发集合 之 CompoundBigWatermel ...

  7. qt大作业——消灭星星

    qt大作业--消灭星星 暑假大作业qt--消灭星星 暑假大作业qt--消灭星星 这是我作业写的代码,可以运行,而且内容十分丰富 链接: 工程下载.

  8. 个人设计web前端大作业~响应式游戏网站源码(HTML+CSS+Bootstrap)

    HTML期末大作业课程设计游戏主题html5网页~响应式游戏网站(HTML+CSS+Bootstrap) ~个人设计web前端大作业 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头 ...

  9. C语言自制小游戏:三子棋(井字棋)智能下棋补充

    目录 一.前期准备 二.逻辑与程序实现 1.连珠 ①横向连珠 ②纵向连珠 ③斜向连珠 ④函数完善 2.堵棋 ①横向堵棋 ②纵向堵棋 ③斜向堵棋 3.整理函数 ①整理AI_Computer函数 ②修改C ...

最新文章

  1. Flash气泡回弹效果
  2. ThreadLocal是否会引发内存泄露的分析 good
  3. 深入剖析OkHttp系列(五) 来自官方的事件机制
  4. spring项目搭建-导包对象准备
  5. 解决VM 与 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 后,可以运行 VM 的方法
  6. python的一些库(模块)集合
  7. Google code android开源项目(一)
  8. 基于Springboot的医院药品管理系统的设计与实现.zip(论文+项目源码)
  9. 手机chrome扫描二维码_90%的用户都不知道这项Chrome隐藏功能如何开启,超级实用!...
  10. CSND默认markdown样式
  11. python目标识别_10行Python代码实现目标检测
  12. uni-app 对接第三方h5
  13. 长歌行 宋 郭茂倩收编的《乐府歌词》汉代民间诗歌
  14. 晚餐队列安排‖(麻烦的聚餐)
  15. php volist中作判断,ThinkPHP模板中判断volist循环的最后一条记录的验证方法
  16. RecyclerView与CardView的使用
  17. Spark期末考试练习题
  18. 十年应用软件之路有几个还活着?
  19. 用javascript编写的小游戏-打砖块
  20. 使用http访问页面时,将其跳转成https

热门文章

  1. [好累的游戏]传球游戏
  2. 字节三面:小伙子你先跟我说一说红黑树吧,java程序设计教程雍俊海第三版答案
  3. 支付宝超级 App 的弹性动态架构实践
  4. 单片机实现秒表倒数计数器
  5. 三、IDA文件目录介绍及其扩展功能
  6. IMX6 GT9xx(GT911) 驱动移植(不包含 TSLIB 移植)
  7. 小米笔记本指纹识别失效解决方法
  8. 基于一个电商交易数据分析项目的浅析
  9. VUE调用高德地图之电子围栏
  10. 50分钟的Java面试,常见的问题都问到了