本科毕业论文基于QT的扫雷游戏设计与实现.docx
- 文档编号:7153040
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:29
- 大小:874.75KB
本科毕业论文基于QT的扫雷游戏设计与实现.docx
《本科毕业论文基于QT的扫雷游戏设计与实现.docx》由会员分享,可在线阅读,更多相关《本科毕业论文基于QT的扫雷游戏设计与实现.docx(29页珍藏版)》请在冰豆网上搜索。
本科毕业论文基于QT的扫雷游戏设计与实现
基于QT的扫雷游戏设计与实现
摘要
本论文研究的是以QT为开发环境,设计并开发一款扫雷游戏,其功能类似于Windows操作系统自带的扫雷游戏。
实现的功能有界面的规划,游戏难度的调整,计时器,鼠标事件以及游戏完成的判定。
论文首先介绍了制作游戏的整体思路及整个游戏设计的流程规划,然后介绍了雷区的布置及地雷随机产生的实现方法;重点介绍了在游戏过程中各事件的处理,其中又以鼠标事件和清除未靠近地雷区方块这两方面最为最要,鼠标事件是利用鼠标所发出的信息了解使用者的意图,进而做出相对应的动作,而清除未靠近地雷区方块由于引进了“扩散”这个概念而使其简单化。
本次设计只是完成了扫雷游戏的基本功能,在细节方面仍然有待完善。
关键词:
扫雷;QT;事件;扩散
DesignAndImplementationOfMinesweepingGameBasedOnTheQTPlatform
Abstract
WhatmythesisresearchforisbasiconthedevelopenvironmentofQT,designanddevelopaminegame,itsfunctionissimilartotheminegamesoftheWindowsOperatingSystem.
Thethesishasintroducedthelayoutofminedareasandthemethodofhowtocreatetheminesatrandom.ItusevairiesofcomponentsinQTandthecombinationofsomesimplecalculations;thethesislaysemphasisonintroducingtheprocessingofeacheventinthegame.Amongtheseevents,themouseeventandtheeventofclearanceoftheareawhichisn’tclosetotheminefieldaremuchmoreimportant.Thetheoryofmouseeventisthattheintentionofuserislearnedbytheinformationsentoutbythemouseandthentheprogramrunsaccordingtotheinformation.Theothereventissimplifiedbytheintroductionoftheconceptofspread.
Thisdesignhasbeencompletedthebasicfunctionofminegame.Thedetailsstillneedtobeimproved.
Keywords:
Minegame;QT;Affairs;Spread
第1章绪论
扫雷最原始的版本可以追溯到1973年一款名为“方块”的游戏。
不久之后,“方块”被改写成了游戏“Rlogic”。
在“Rlogic”里,玩家的任务是作为美国海军陆战队队员,为指挥中心探出一条没有地雷的安全路线,如果路全被地雷堵死就算输。
两年后,汤姆·安德森在“Rlogic”的基础上有编写出了游戏“地雷”,由此奠定了现代扫雷游戏的雏形。
1981年,微软公司的罗伯特·杜尔和约翰逊两位工程师在Windows3.1系统上加载了该游戏,扫雷游戏才正式在全世界推广开来。
1.1研究背景
在计算机逐步渗入社会生活各个层面的今天,计算机已经成为人们日常生的一部分,越来越多的人使用计算机办公、娱乐等等。
扫雷游戏是Windows操作系统自带的一款小游戏,在过去的几年里,Windows操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是这款小游戏依然保持原来的容貌,可见这款小游戏受到越来越多人的喜爱。
本次的毕业设计我将利用QT作为开发工具,开发一款类似的“扫雷游戏”。
通过研究Windows操作系统自带的扫雷游戏,我们可以发现在这个游戏中主要有以下两个关键的地方:
第一个是初始化问题,包括随机产生本局游戏中雷的总数,雷的分布对于每一个小区域如何获取周围地区分布的雷数等等。
第二就是对鼠标事件的处理问题,既在游戏过程中对鼠标事件应如何做出反应。
1.2开发的目的及意义
经过四年的大学学习,我对理论知识已经有了一定的了解与认知,本次的毕业设计便是将书本上所学的理论知识与实际相结合,同时也是对所学知识的一种检查,希望通过本次的毕业设计使自己在程序的开发和设计上有新的认识并能有所提高。
本次毕业设计既锻炼了我们的实际动手能力,又在老师的指导下进行了一次模拟实际产品的开发,对于我们以后工作能力的培养具有重要意义。
1.3开发工具的选择
由于毕业设计的选题,开发工具用的是Qt。
Qt是一个跨平台的C++图形用户界面库,由挪威TrollTech公司出品,目前包括Qt,基于Framebuffer的QtEmbedded,快速开发工具QtDesigner,国际化工具QtLinguist等部分Qt支持所有Unix系统,当然也包括Linux,还支持WinNT/Win2k,Win95/98平台。
第2章QT架构与平台搭建
2.1QT介绍
QT是一个多平台的C++图形用户界面应用程序框架,而且QT提供了一组更容易理解的GUI类,运行的更快,另外QT特有的信号和槽,更易使用。
QT面向对象且很容易扩展,并且允许真正地组件编程。
QT工具包是一个C++的类库并且是使用“一次编写,随处编译”的方式构建多平台的图形用户界面程序的一套工具。
由于QT特性:
平台无关性、优化了内存和资源的利用、拥有自己的窗口系统、模块化可裁剪性、代码完全公开。
2.1.1QT语言的特性
QT是Trolltech公司的一款图形开发产品,它采用完全的面向对象技术来进行图形应用程序的设计,允许真正的组件编程,Qt是一个全面的C++应用程序开发框架,它包含一个类库,和用于跨平台开发及国际化的工具,可以开发高性能,跨平台客户端,以及服务器端的应用程序。
Qt类库是一个拥有超过400个C++类,同时不断扩展的库。
它封装了用于端到端应用程序开发所需要的所有基础结构。
优秀的Qt应用程序接口包括成熟的对象模型,内容丰富的集合类,图形用户界面编程与布局设计功能,数据库编程,网络,XML,国际化,OpenGL集成等等。
Qt设计者是一个功能强大的GUI布局与窗体构造器,能够在所有支持平台上,以本地化的视图外观与认知,快速开发高性能的用户界面。
Qt语言家是一套用来消除国际化工作流程中所带来障碍的工具。
使用Qt语言家,开发小组可把应用程序的翻译转换外包给非技术性翻译人员,从而可增加精确度,大大加快本地化处理过程。
Qt助手一个完全可自定义,重新分配的帮助文件或文档浏览器,它可与基于Qt的应用程序运行。
使用Qt助手,开发小组同样能够很大程度上加快文档的处理过程。
2.1.2QT的优势
作为嵌入式图形界面开发工具,QT优势很多,有如下一些:
1.支持平台广泛
QT应用程序接口与工具兼容于所有支持平台,让开发员们掌握一个应用程序接口,便可执行与平台非相关的应用开发与配置,其支持的平台有:
QT/Windows(WindowsXP,2000,NT4,Me/98)、QT/Mac(MacOSX)、QT/X11(Linux,Solaris\HP-UX,IRIX,AIX)等。
2.封装多
QT对不同平台的专门QPI进行了专门的封装(文件处理、网络等)。
3.面向对象
QT具有模块设计和注重软件构件或元素的可重用性的特点。
4.构件支持
QT提供信号(signal)和插槽(slot)概念,这是一种类型安全的方法,它允许回调,冰支持对象之间在彼此不知道对方信息的情况下进行合作,这使得QT非常适合于真正的构件编程。
5.友好的联机帮助
QT提供了大量的联机参考文档,有超文本HTML方式,也有UNIX帮助手册和补充说明,并且对于初学者,其中的指南将一步步介绍如何进行QT编程。
6.便利性
由于QT是一种跨平台的GUI工具包,它对编程者隐藏了在处理不同窗口系统时潜在的问题,QT定义了一些类来隐藏在不同操作系统上不同处理方式下的细节问题。
7.用户自定义
使用其他的一些工具包经常会遇到这样的一种情况,没有真正适合需求的组件,声称自定义的组件对用户来说就像一个黑匣子。
而在QT中生成用户自定义的组件非常简单,而且易于修改组件的行为。
8.国际化
QT为本地化应用提供了完全的支持,所有用户界面文本都可以基于消息翻译表被翻译成各国语言,QT还支持双字节16bit国际字符标准。
9.丰富的API函数
QT为专业应用提供了大量的函数,在QT的API中含有大约250个C++类,大多数的类都是GUI专有的。
10.可用户化外观
QT支持主题,基于QT的应用程序能够在Windows外观、Motif外观,以及其他一些用户化主题之间切换。
11.完整的一套组件工具
QT编程的基本模块称之为组件,组件是用户界面的组成部分,QT含有用来创建专业外观的用户界面所需要的所有组件。
2.1.3QT/Embedded介绍
QT/Embedded为带有轻量级窗口系统的嵌入式设备提供了标准的API。
QT/Embedded面向对象的设计思想,使得它能一直向前支持鼠标、键盘、图形加速卡等附加设备。
通过使用QT/Embedded,开发者可以感受到QT/X11、QT/Windows和QT/Mac等不同的版本下使用相同的API编程带来的便利[5]。
QT/Embedded与QT/X11的Linux版本的比较如下表2-1所示。
应用源代码
QTAPI
QT/Embedded
QT/X11
QT/XLib
XWindowServer
Frame-buffer
LINUX内核
表2-1QT/Embedded与QT/X11的Linux版本的比较
2.2QT的架构
1.窗口系统
一个QT/Embedded窗口系统包括了一个或多个进程,其中的一个进程可作为服务器。
这个服务进程会分配客户显示区域,以及产生键盘和鼠标时间。
此服务进程还能为已经运行的客户程序提供用户接口和输入方法。
它其实就是一个有某些额外权限的客户进程。
任何程序都可以在命令行上加上“-qws”的选项来把它作为一个服务器来运行。
2.字体
QT/Embedded支持四种不同字体格式:
TrueType、PostscriptType1、位图发布字体(BDF)和QT的预呈现(Pre-rendered)字体(QPF)。
QT还可以通过增加QFontFactory的子类来支持其他字体,也可以支持以插件方式出现的反别名字体。
3.输入设备
QT/Embedded3.0支持集中鼠标协议:
BusMouse、Microsoft、IntelliMouse和MouseMan。
2.3QT的组成
QT是一个完整的C++应用程序开发框架。
它包含一个类库和用于跨平台开发的国际化工具。
1.QT类库
众多的QT类库构成QT的基础。
该库可以利用大约400个面向对象的类,这些类带有大多数构建跨平台服务器与富客户端应用程序的底层基础构造函数。
这些库包括用于GUI、布局、数据库、国际化、网络与XML等的类。
2.信号/槽机制
信号与槽机制是QT的核心机制,要精通QT编程就必须对信号和插槽有所了解。
信号和插槽是一种高级接口,应用于对象之间的通信,它是QT核心特性,也是QT区别于其他工具包的关键所在。
信号和插槽是QT自行定义的一种通信机制,它独立于标准的C/C++语言,因此要正确地处理信号和插槽,必须借助一个称为MOC(MetiaObjectCompiler)的QT工具,该工具是一个C++预处理程序,它为高层次的事件处理自动生成所需要的附加代码[6]。
多个信号与单个插槽可以连接,单个信号与很多插槽也可以连接,甚至将一个信号与另外一个信号相连接也是可能的,这时无论第一个信号什么时候发射,系统都将立刻发射第二个信号。
总之,信号与插槽构造了一个强大的部件编程机制。
对象间信号与插槽的连接关系如图2-1所示
图2-1信号与槽连接关系
3.QTDesigner图形设计器
QT图形设计器是一个所见即所得的全方位GUI构造器。
利用QTDesigner,开发者可以释放各种QT控件构造图形用户界面,而不需要编写一行代码。
使用QT图形设计器的布局管理可以生成具有平滑改变尺寸功能的对话框。
4.Qmake工具
编写用于多平台的软件是单调发威的,且可能出现错误,维护编制文件更是如此,尤其是当不同的编译器和平台组合需要若干个编制文件时,而通过使用qmake工具可以构建出Cross-PlatformBulids跨平台的应用程序。
即qmake可以根据一个工程文件(.pro)产生不同平台下的Makefile文件。
Qmake支持跨平台开发和所谓的影子生成(shadowbuilds)技术,qmake还易于在不同的配置中切换。
2.4QT开发平台的搭建
为了在PC主机上得到QT的开发环境,我们选择在Windows操作系统中安装VMware虚拟机软件,再在其中安装我们需要的Linux操作系统。
使用虚拟机的一大好处是,当在Linux因为不熟悉而遇到问题的时候,可以很容易的回到Windows中寻求解决方案,避免了在双系统中来回重启切换的麻烦。
2.5QTSDK及QTCreator工具的安装
QT可以从NOKIA官方网站()上下载,包括QTSDK和QTCreator包。
打开终端,输入命令sudosu,取得操作系统root权限。
然后对下载好的SDK安装包进行chmodu+x操作,即对档案的拥有者赋予执行权限。
接下来输入:
./qt-sdk-liunx-x86-opensource-2.1.0.bin。
执行QTSDK的安装操作。
如图2-2所示:
图2-2QTCreator安装界面
QTCreator安装完成之后,双击图标,进入QTCreatorIDE界面,如下图2-3所示:
至此,平台搭建已经完成。
图2-3QTCreator操作界面
第3章游戏的总体分析与设计
3.1设计构想
相信大多数使用Windows操作系统的使用者,对这款游戏都不陌生。
这款游戏不止操作简单,规则也不难,再加上游戏速度的控制机制得宜,让整个游戏在操作过程中充满了快乐与紧张的气氛。
除了游乐当中能带给使用者快乐之外,游戏的设计内容无形中也不断训练使用者的逻辑思考能力,对于依靠高度脑力工作的现代人,都可以通过这个游戏,不时的检验一下自己,所以我们不难发现,在各种可携带的电子产品上都有这款游戏的踪影。
在设计之前,我们先来了解这款游戏的规则。
在不掀开任何藏有地雷的方块情况下,以最快的速度找出所有的地雷。
如果在掀开方块的过程中,不小心翻开(踩到)藏有地雷的方块,则宣告失败(游戏结束),惟有将所有不含地雷的方块掀开,游戏才算成功。
游戏的操作方面主要以鼠标为主,当鼠标指针对准未翻开的方块按下左键时即表示翻开方块,当鼠标指针对准未翻开的方块按下右键时即表示标记或取消标记地雷,反复按下右键则方块会以标记,取消标记两者之间不断循环。
游戏者可以通过地雷区内的数字提示了解以数字为中心的其周边八个方格内所含的地雷数,假若翻开的方块显示数字“3”,则表示以其为中心的周边方块内藏有3个地雷。
当按下的方块不是地雷,且周边八个方块也都没有地雷时,方块会以被翻开方块的八个方向将空白方块翻开。
3.2流程规划
流程规划大致上可以分为三个部分,分别为:
游戏开始阶段、游戏进行阶段和游戏结束阶段。
游戏开始时,会以游戏者最后一次设定的地雷区大小为范围画出地雷区,同时会产生地雷并且开始计时。
游戏进行阶段主要就是如何判断按下的方块是非地雷时的处理,这也是整个游戏的技术核心,我们可以通过扩散的观念来检查周边的方块是否含有地雷及是否继续往外翻开,以及鼠标右键的标记功能的实现。
游戏结束阶段,判定游戏是否结束有两种情况,第一种是没有踩到雷,成功完成游戏,会弹出提示框提示赢得游戏,如果创造了新的纪录,则会弹出提示框提示输入姓名。
第二种是踩到雷,也就是游戏失败,同样会弹出提示框来提示输掉游戏。
鼠标事件流程图如下图3-1所示:
图3-1鼠标事件流程图
3.3画面规划
游戏画面如图3-2所示:
①
图3-2游戏界面图
说明如下:
游戏界面由下列组成:
①游戏窗口
②游戏菜单栏
③游戏状态栏
④游戏区域(雷区)
⑤游戏计时器
第4章游戏的详细设计
4.1游戏的开始
当玩家开始游戏时,游戏画面如图4-1所示:
图4-1游戏初始画面
我们可以清楚的看到,游戏界面主要分为两个主要部分:
1.计时及状态区;2.地雷区。
计时及状态区是玩家开始点击图标到游戏结束时对时间的统计,也用QLabel来实现了。
代码实现如下:
voidMainWindow:
:
create_statusBar()//计时器
{
time_label=newQLabel;
statusBar()->addPermanentWidget(time_label);
statusBar()->addPermanentWidget(newQLabel(tr("second")));
}
voidMainWindow:
:
slot_timer()
{
time_label->setText(QString("%1").arg(time.elapsed()/1000));
}
然后再利用ImageList组件来存储游戏中将要使用的图片,我们可以将组件布置于窗体后编辑组件属性,如图4-2所示:
图4-2Image组件
4.2雷区分布
当游戏界面初始化完成,地雷也同时放入雷区中,并且开始计时。
具体实现如下所示:
voidBlockArea:
:
set_block_area(introw,intcolumn,intmine_number,intinit_flag)//雷区设置
{
if(!
init_flag){
for(inti=0;i for(intj=0;j deletestatic_cast deletemainLayout; } row_=row; column_=column; total_block_number_=row_*column_; total_mine_number_=mine_number; turn_over_block_number_=0; game_over_flag_=false; boolmine_flag[total_block_number_]; for(inti=0;i mine_flag[i]=true; for(inti=total_mine_number_;i mine_flag[i]=false; QTimetime; time=QTime: : currentTime(); qsrand(time.msec()+time.second()*1000); std: : random_shuffle(mine_flag,mine_flag+total_block_number_,p_random); mainLayout=newQGridLayout(this); for(inti=0;i for(intj=0;j mainLayout->addWidget(newBlock(mine_flag[i*column_+j]),i,j); for(inti=0;i for(intj=0;j Block*current_block=static_cast current_block->set_number(calculate_mines(i,j)); connect(current_block,SIGNAL(turn_over(bool)),this,SLOT(slot_turn_over(bool))); current_block->installEventFilter(this); } } } 4.3游戏中主要模块的介绍与使用 4.3.1鼠标事件 在游戏过程中,我们利用鼠标所发出的信息了解游戏者的意图,进而作出相对应的动作。 在RightPress与MidPress事件中,可以捕捉鼠标所按下或放开的按键为何、鼠标光标在该组件上的坐标及是否同时按下辅助键等。 函数原型如: voidmousePressEvent(QGraphicsSceneMouseEvent*event); 在参数列中,Button参数值表示鼠标上的按钮数值。 其意义如下: 1: 左键2: 右键 在本游戏中,我们利用右键的RightButton来标记“已标记”方块,利用左键的,来标示游戏者准备按下的方块,再利用左键的LeftButton来确定翻开的方块。 在窗口的软件中,鼠标的应用是不可或缺的,但鼠标固然好用,如果程序设计不当,也可能造成使用者的不便。 游戏的操作方面主要以鼠标为主,当鼠标指针对准未翻开的方块按下左键时即表示翻开方块: 当鼠标指针对准未翻开的方块按下右键时即表示标记地雷,反复按下右键则方块会以“标记”,“取消标记”两者之间不断循环: voidBlock: : mousePressEvent(QMouseEvent*event)//鼠标事件 { if(event->button()==Qt: : LeftButton){ if(! turn_over_flag_&&! mark_flag_){ turn_over_flag_=true; if(mine_flag_==true){ setPixmap(QPixmap(": /images/mine.png")); update(); emitturn_over(true); }else{ setPixmap(QPixmap(": /images/mine_"+QString("%1").arg(number_)+".png")); update(); emitturn_over(false); } } }elseif(event->button()==Qt: : Righ
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 本科毕业 论文 基于 QT 扫雷 游戏 设计 实现