基于Qt的扫雷游戏设计论文.docx
《基于Qt的扫雷游戏设计论文.docx》由会员分享,可在线阅读,更多相关《基于Qt的扫雷游戏设计论文.docx(20页珍藏版)》请在冰豆网上搜索。
基于Qt的扫雷游戏设计论文
职业技术学院
毕业设计〔论文〕
题目
基于Qt的扫雷游戏设计
信息工程系
专业
计算机应用技术
班级
学号
指导教师
日期
二零一二年九月
基于Qt的扫雷游戏设计
摘要
扫雷游戏是一款经典的小游戏,这款游戏不仅可以让人们充分享受娱乐的目的,而且可以通过这款小游戏开发人的逻辑推理能力和判断能力。
本次毕业设计我们以Qt4.6为开发环境,设计并开发了基于Qt的扫雷游戏。
扫雷游戏主要研究以下两个方面:
第一是初始化问题,包括随机产生本局游戏中的雷数,雷的分布对于每个小区域如何获得周围地区分布的雷数等等。
第二就是对鼠标事件的处理,即在游戏过程中对鼠标事件应如何做出反响。
本论文以Qt作为开发软件,首先使用信号与槽的方法实现菜单、工具栏的功能,其次又以MousePressEvent鼠标事件发出信息来了解使用者的意图,进而做出相对应的动作,再次介绍了去除地雷区方块的方法,通过递归程序的编写,在程序代码上会变得相当简洁。
最后利用布局管理组〔Layouts〕进展整体布局。
使用C++语言设计完成了扫雷游戏的初始化界面,实现了扫雷游戏的计时、重新开场、难度设置、排行榜、帮助等功能。
还增加了游戏在成败时弹出对话框等功能。
总的来说本次设计在功能上已经根本到达预期的要求。
但还有一些缺乏,比方扫雷游戏设计还可以添加一些背景音乐、背景图片、视频等功能,更能增加人们的娱乐性。
关键词:
扫雷游戏;Qt;C++
ABSTRACT
Minesweepergameisaclassicgame,thegamecannotonlyallowpeopletofullyenjoytheentertainmentpurposes,andbythissmallgamedevelopmentlogicalreasoningabilityandjudgment.ThegraduationprojecttoQt4.6developmentenvironment,designanddevelopmentofQt-basedgameofMinesweeper.
Theminesweepergamethefollowingtwoaspects:
Thefirstistheinitializationproblems,includingrandomlygeneratednumberofCouncilGameRayRaydistributionforeachsmallareahowtogetaroundthegeographicaldistributionofRay.
Thesecondistheprocessingofmouseevents,mouseeventsinthecourseofthegamehowtoreact.
Inthisthesis,QTsignalsandslotsasthedevelopmentofsoftware,thefirsttousethemethodtoachievethefunctionalityofthemenus,toolbars,followedYouyimousePressEventmouseeventsissuedinformationtounderstandtheuser'sintent,andthenmakeacorrespondingaction,againintroducedaclearMinefieldsboxbyrecursiveprogramcodewillbeequitesimple.Finally,thethelayoutmanagementgroup(Layouts)overalllayout.
pletedminesweepinggamesinitializationinterfacedesign,toachieveamine-sweepinggameoftiming,startagain,difficultysettings,rankings,helpfunctionsusingtheClanguage.Gameinthesuccessorfailureofthepop-updialogbox.Overall,thedesignfunctionhasbasicallyreachedtheexpectedrequirements.Buttherearesomedisadvantages,suchasminesweepinggamedesigncanalsoaddsomebackgroundmusic,backgroundimage,video,andcanhelpincreasepeople'sentertainment.
Keywords:
Minesweepergame;Qt;C++
第1章绪论
1.1研究背景
随着计算机与网络的普及,人们生活水平的提高,电脑游戏越来越成为人们生活中不可或缺的一局部,在人们繁忙的工作之余,给人带去欢乐。
随着电脑游戏产业的规模越来越大,开发一款成功的电脑游戏靠个人之力已非易事。
不过,随着市场上开发的游戏产品越来越丰富,各种题材的游戏越来越多,创意已成为一款成功游戏的最重要的特点。
例如目前流行的游戏“植物大战僵尸〞、“愤怒的小鸟〞,虽然都是一些很小的休闲游戏,但是因其特有的风格,使得它们都深受人们的喜爱。
本次毕业设计将利用Qt4.6作为开发工具,设计了基于Qt的扫雷游戏。
1.2研究原因
扫雷游戏是Windows操作系统自带的一款小游戏,与那些网络游戏和3D游戏相比,它有编写简单容易上手等特点,游戏开发本钱比拟低,开发娱乐性强的游戏就成为当前的主要课题,在这种趋势下各种小型的低本钱的游戏软件应运而生。
其中,系统自带的小游戏也占据了相当重要的地位,非常符合人们娱乐的要求。
这些小游戏大都是以益智和娱乐为目的,不仅给紧工作的人们以放松,还可以让人们的大脑得到开发。
本课题就是基于Qt扫雷游戏的设计。
1.3研究意义
经过三年的大学学习,我对理论知识已经有了一定的了解与认知,本次的毕业设计便是将书本上所学的理论知识与实际相结合,同时也是对所学知识的一种检查,希望通过本次的毕业设计使自己在程序编写和游戏开发上有新的认识并能有所提高。
本次毕业设计既锻炼了我们的实际动手能力,又培养了我们的自信心。
在教师的指导下进展了一次模拟实际产品的开发,这对以后工作和学习能力的培养具有重要意义。
第2章Qt简介
Qt是一个跨平台的C++图形用户界面应用程序框架。
它给应用程序开发者提供建立艺术级图形用户所需的所有功能。
它是完全面对对象的,很容易扩展,并且允许真正的组件编程。
Qt已经在Windows、Linux和EmbbededLinux上成功的推广。
而且Qt是一个开源工程,开发本钱比拟低,又为开发者提供了免费而又友好的集成开发环境。
Qt采用C++语言作为开发语言,使用C++语言开发,其运行效率可以得到保证。
2.1Qt特征
引入一种信号和槽机制,可查询和可设计的属性,强大的事件和事件过滤器,根据上下文进展国际化的字符串翻译,完善的时间间隔驱动的计时器使得在一个事件驱动的图形界面程序中很好地集成许多任务成为可能。
以一种自然的方式组织对象所有权的分层次和可查询的对象树。
2.2Qt核心编程技术
2.2.1元对象系统
Qt元对象系统提供了对象间的通信机制〔信号与槽〕、运行时类型信息和动态属性系统的支持,是标准的C++的一个扩展,它使Qt能更好地实现GUI图形用户界面编程。
Qt的元对象系统不支持C++模板,尽管模板扩展了标准C++的功能,但是对元对象系统提供了模板无法提供的一些特性。
Qt的元对象基于三个事实:
①基类Q_Object:
任何想使用元对象系统功能的类必须继承QObject。
②Q_OBJECT宏:
Q_OBJECT宏必须出现在类的私有声明区,已启动元对象的特性。
③元对象编译器(Meta-Objectpiler,moc):
为QObject子类实现元对象特性提供必要的代码实现。
编译器moc产生能被标准C++编译器访问的附加C++代码,带有moc预编译器的C++根本上提供了面向对象的灵活性,并保持了C++的执行效率和扩展性。
2.2.2信号和槽机制
Qt提供了信号和槽机制来完成界面操作的响应,是完成任意两个Qt对象之间的通信机制。
其中,信号会在某个特定的情况或动作下被触发,槽是等同于承受并处理信号的函数。
每个Qt对象都包含假设干个预定义的信号和假设干个预定义的槽,当某一个特定事件发生时,一个信号被发射,与信号相关联的槽那么会响应信号完成相应的处理。
当一个类被继承时,该类的信号和槽也同时被继承,也可以根据需要自定义信号和槽。
常用的连接方式为:
connect(Object1,SIGNAL(singal),Object2,SLOT(slot));
singal为对象Object1的信号,slot为对象Object2的槽。
2.2.3QObject类
QObject是Qt类体系的唯一基类,是Qt各种功能的源头活水,就象MFC中的CObject和Dephi中的TObject。
2.2.4对象树
QObject在对象树中组织它们自己。
当你以另外一个对象作为父对象来创立一个QObject时,它就被添加到父对象的children()列表中,并且当父对象被删除的时候,它也会被删除。
这种机制很好的适合了图形用户界面应用对象的需要。
2.2.5事件
事件是由窗口系统或Qt本身对各种事务的反响而产生的。
当用户按下、释放一个键或鼠标按钮,一个键盘或鼠标事件被产生;当窗口第一次显示,一个绘图事件产生,从而告知最新的可见窗口需要重绘自身。
大多数事件是由于响应用户的动作而产生的,但还有一些,比方定时器等,是由系统独立产生的。
2.2.6QApplication类
QApplication类和QWidget类都是QObject类的子类。
QApplication类负责GUI应用程序的控制流和主要的设置,它包括主事件循环体,负责处理和调度所有来自窗口系统和其他资源的事件,并且处理应用程序的开场、完毕以及会话管理,还包括系统和应用程序方面的设置。
对于一个应用程序来说,建立此类的对象是必不可少的。
2.2.7QWidget类
QWidget类是所有用户接口对象的基类,它继承了QObject类的属性。
组件是用户界面的单元组成局部,它接收鼠标、键盘和其它从窗口系统来的事件,并把它自己绘制在盘屏幕上。
QWidget类有很多成员函数,但一般不直接使用,而是通过子类继承来使用其函数功能。
如,QPushButton、QlistBox等都是它的子类。
2.2.8根本布局(QLayout)
Qt提供了QHBoxLayout类、QVBoxLayout类及QGridLayout类等的根本布局管理,分别是水平布局管理、垂直布局管理和网格布局管理。
他们之间的继承管理如图2-1所示。
图2-1各种布局类及之间的关系
2.3C++面向对象程序设计
面向对象编程是一种计算机编程架构。
面向对象的一条根本原那么是计算机程序由单个能够起到子程序作用的单元或对象组合而成。
面向对象编程到达了软件工程的三个主要目标:
重用性、灵活性和扩展性。
为了实现整体运算,每个对象都能够承受信息、处理数据和向其他对象发送信息。
面向对象程序设计中的概念主要包括:
类、对象、数据封装、继承、动态绑定、多态性、数据抽象、消息传递。
通过这些概念面向对象的思想得到了具体的表达。
①类
类是具有一样类型的对象的抽象。
一个对象所包含的所有数据和代码可以通过类来构造。
C++中,class是类声明的关键字,class的后面是要声明的类名。
类中的数据和函数都是类的成员,分别称为数据成员和成员函数。
类中的关键字public、private和protected声明了类中的成员与类外之间的关系,称为访问权限。
其中,对于private成员来说,它们是私有的,不能在类外访问,数据成员只能由类中的函数所使用,成员函数只允许在类中调用;对于public成员来说,它们是公有的,可以在类外访问;而对于protect成员来说,它们是受保护的,具有半公开性质,可在类中或其子类中访问。
②对象
对象是运行的根本实体,它是一个封装了数据和操作这些数据的代码的逻辑实体。
作为一种复杂的数据构造类型,类声明后,就可以定义该类的对象。
③封装
封装是将数据和代码捆绑在一起,以防止外界的干扰和不确定性。
对象的某些数据和代码可以是私有的,不能被外界访问,以此实现对数据和代码不同级别的访问权限。
④继承
继承是让某个类型的对象获得另一个类型的对象的特征。
通过继承可以实现代码的重用:
从已存在的类派生出的一个新类将自动具有原来那个类的特性,同时,它还可以拥有自己的新特性:
单向性、传递性、可重用性。
⑤多态
多态是指不同事物具有不同表现形式的能力。
多态机制使具有不同部构造的对象可以共享一样的外部接口,通过这种方式减少代码的复杂度。
2.4Qt程序用到的类
本次的设计用QMainWindow作为主窗体。
QMainWindow是一个为用户提供主窗口程序的类,可包含一个菜单栏〔menubar〕、多个工具栏〔toolbar〕、一个状态栏〔statusbar〕以及一个中心部件〔centralwidget〕,是许多应用程序的根底,如文本编辑器、图片编辑器等。
2.5Qt应用程序实现
由以上简介可知,Qt是一个创立GUI程序的C++类库,编写Qt应用程序的主要工作是基于已有的Qt类编写用户类。
Qt提供了一组围相当广泛的C++类库,并包含了几种命令行和图形界面的工具,有效地使用这些工具可以加速开发过程。
QtDesigner:
Qt设计器,用来可视化地设计应用程序界面。
QtLinguist:
Qt语言学家,用来翻译应用程序。
以此提供对多种语言的支持。
Qmake:
使用此工具可以由简单的、与平台无关的工程文件来生成编译所需的Makefile。
QtAssistant:
关于Qt的帮助文件,类似于MSDN。
可以快速地发现你所需要的帮助。
moc:
元对象编译器。
uic:
用户界面编译器。
在程序编译时被自动调用,通过ui_*.h文件生成应用程序界面。
Qt应用程序的设计使用基于工程的方法,并通过.pro文件进展工程管理。
实现应用程序的第一步是编写.pro文件,然后使用Qt4自带的qmake工具生成Makefile,最后进展源代码的编译。
Qmake的过程如下:
qmake–project//生成.pro的工程文件
qmake//生成Makefile
nmake//编译
2.6本章小结
随着越来越多的第三方软件公司利用Qt/Embedded开发嵌入式Linux下的应用软件,Qt的应用已经越来越广泛。
本章主要介绍了Qt的背景和描述了Qt实现的构造原理,还简述了Qt的相关特性。
此外,也介绍了Qt应用程序开发时的相关工具和C++面向对象程序设计原那么。
同时为本次设计的扫雷游戏的移植提供便利的条件。
第3章扫雷游戏设计
本次设计是以Qt为开发软件,Qt是一个跨平台的C++图形用户界面应用程序框架。
它给应用程序开发者提供建立艺术级图形用户所需的所有功能。
设计并实现基于嵌入式Qt的扫雷游戏。
扫雷游戏名称为mine_sweeper_v1.2,属于益智类游戏。
通过鼠标即可操作游戏。
游戏特点为操作简单、易于上手。
3.1扫雷游戏功能需求分析
扫雷游戏以满足用户娱乐、益智为宗旨,不断创新以适应用户越来越多的要求,本设计以用户需求为导向,在实现现主要完成以下功能:
①游戏的初始化。
②菜单栏功能的实现。
③游戏难度的选择。
④雷数的随机布置。
⑤游戏的测试。
3.2扫雷游戏整体框架介绍
根据实际需求分析、功能设计,整个系统大致可以分为鼠标事件和菜单事件两个模块,程序设计的流程主要为先实现扫雷游戏主要功能,扫雷游戏的系统流程图如图3-1。
图3-1扫雷游戏系统流程图
3.3扫雷游戏主要功能的实现
3.3.1菜单栏的实现
在主函数中实现菜单功能,主要有游戏的开场、退出、排行榜如图3-2。
voidMainWindow:
:
create_menus()
添加头文件
#include
#include
图3-2菜单中游戏选项
游戏难度的选择及自定义设置如图3-3。
图3-3菜单栏游戏难度选项
/*游戏的设置容易、中等、困难及自定义*/
voidMainWindow:
:
slot_standard(QAction*standard_action)
{
if(standard_action==easy_standard_action){
current_standard_=0;
row_=9;
column_=9;
mine_number_=10;
}elseif(standard_action==middle_standard_action){
current_standard_=1;
row_=16;
column_=16;
mine_number_=40;
}elseif(standard_action==hard_standard_action){
current_standard_=2;
row_=16;
column_=30;
mine_number_=99;
}elseif(...)
帮助菜单中的关于游戏、关于Qt的介绍等主要功能的实现。
如图3-4。
图3-4扫雷游戏的帮助菜单
3.3.2菜单栏的功能
①新游戏:
根据当前游戏难度直接开场一局新游戏。
②初级、中级、高级游戏设定:
根据选项设定游戏难度后开场新游戏。
③自定义难度:
首先弹出游戏设置对话框,让用户设置扫雷游戏根本属性,然后根据用户设定的属性开场新游戏。
自定义对话框设计如图3-5。
图3-5自定义难度时弹出的对话框
3.3.3鼠标事件的实现
在游戏过程中,我们利用鼠标所发出的信息了解游戏者的意图,进而做出相对应的动作。
在MousePressEvent事件中,可以捕捉鼠标所按下或放开的按键、鼠标光标在该组件上的坐标及是否同时按下辅助键等。
函数原型如下:
voidBlock:
:
mousePressEvent(QMouseEvent*event)
添加头文件:
#include
假设游戏者发现标示地雷的小旗方块是错误的,再重新点击一下右键,就会取消小旗,这时按下左键,该方块就会重新选择,假设再按下左键,那么该方块因为已成为“已标示〞方块,所以就无法翻开。
在窗口的软件中,鼠标的应用是不可或缺的,但鼠标固然好用,如果程序设计不当,也可能造成使用者的不便。
通常鼠标在软件的应用上经常使用右键作为确定使用者的操作意图,而只把MousePressEvent事件当做标示的用途〔用意就如同前面所提〕,只是为给使用者一个反悔的时机。
游戏的操作方面主要以鼠标为主,当鼠标指针对准未翻开的方块按下左键时即表示翻开方块;当鼠标指针对准未翻开的方块按下右键时即表示标示或疑示地雷,反复按下右键那么方块会以“未标示〞→“标示〞的关系不断循环。
3.3.4完成扫雷游戏逻辑的设计
①设计实现:
在程序中,使用一个MainWindow类完成所有游戏逻辑功能。
②扫雷表现形式:
使用二维数组存储当前游戏状态。
扫雷游戏的实质即是在二维空间,不同的点之间所具有的不同状态。
例如该格子是雷,可以用数字-1表示该格子周围一个雷也没有,可以用0表示。
使用二维数组能够完全表示所有地雷地图的数据。
再利用另一个二维数组,用以表示当前点是否已被用户点击。
③游戏根本属性:
地雷数组行数、列数、地雷数量、游戏难度。
④游戏状态:
游戏初始界面,游戏进展中,游戏失败,游戏成功。
⑤MainWindow类主要功能:
初始化游戏界面、生成随机的地雷数,根据生成的地雷位置,将其余并非地雷的位置填上数字,数字代表该格子周围八个格子里有几个地雷。
⑥设置游戏等级:
初级、中级、高级和自定义。
其三者都由默认设置游戏属性。
通过游戏等级的设置,间接设置游戏的根本属性。
3.3.5扫雷游戏状态分类
当玩家扫雷时,即用鼠标左、右键点击一个格子时,有以下几种状态:
①踩到雷:
游戏失败,完毕游戏。
②点到的是数字:
显示数字,游戏继续。
③假设玩家点到的格子周围一颗雷也没有时:
就采用递归算法,继续向周围扩展。
④当玩家点开所有的非雷的格子:
提示游戏通过,并且完毕游戏。
⑤标示雷:
右键点击出现小旗,代表下面是地雷。
3.3.6初始化界面功能实现
①计时窗口的实现
在游戏的初始化界面时右下角的显示时间最初时0秒,随着时间的增长,它会记录你玩好这局游戏需要多长时间。
其功能实现:
voidMainWindow:
:
slot_timer()
{
time_label->setText(QString("%1").arg(time.elapsed()/1000));
}
②扫雷面板
通过QMainWindow类创立扫雷游戏应用程序用户界面。
游戏需要提供一个菜单栏。
提供游戏的新游戏、设置、帮助等选项。
在游戏区按功能将它分成雷区和提示区。
Qt4使用“动作〞的概念简化了有关菜单和工具栏的编程一个动作(action)就是一个可以添加到任意菜单和工具栏上。
扫雷游戏的初始化界面。
如图3-6。
图3-6扫雷游戏的初始界面
3.3.7雷区的随机布置
这里重点介绍的就是雷的随机布置。
当游戏界面初始化完成后,这时在地雷区中并未产生地雷,只有当玩家在地雷区中第一次点下左键后,才会在地雷区中随机的布置当前游戏难度下应该产生的地雷总数,主要用意在于不让玩家第一次就踩到地雷,这样在某种程度上可以提高玩家游戏的气氛。
实现其功能局部代码:
ptrdiff_trandom(ptrdiff_ti)//雷的随机布置
{
returnqrand()%i;
}
ptrdiff_t(*p_random)(ptrdiff_t)=random;
BlockArea:
:
BlockArea(introw,intcolumn,intmine_number,QWidget*parent)
:
QWidget(parent)
{
set_block_area(row,column,mine_number,true);
}
3.4去除未靠近地雷的方块
去除为靠近地雷的方块也是本论文介绍的重点对象。
这里首先引入一个“递归〞的概念,“递归〞(Recursion)简单的说,就是一个程序能被自己所定义的语句调用。
递归在程序设计上是一种重要的数据构造形态,通过递归程序的编写,在程序代码上会变得相当简洁,不过如果设计不当,会造成无穷循环或堆迭溢满的情形,所以递归的程序中心必须含有if...then或SelectCase等设计,以终止递归执行。
在游戏过程中,当游戏者按下非地雷方块时,方块会沿四周八个方向向外翻开非地雷的方块。
程序的执行方面必须判断:
以按下方块为中心,检查周围八个方块是否为非地雷方