基于QT的扫雷游戏设计与实现本科毕业设计.doc

上传人:laozhun 文档编号:2392721 上传时间:2023-02-17 格式:DOC 页数:54 大小:993.50KB
返回 下载 相关 举报
基于QT的扫雷游戏设计与实现本科毕业设计.doc_第1页
第1页 / 共54页
基于QT的扫雷游戏设计与实现本科毕业设计.doc_第2页
第2页 / 共54页
基于QT的扫雷游戏设计与实现本科毕业设计.doc_第3页
第3页 / 共54页
基于QT的扫雷游戏设计与实现本科毕业设计.doc_第4页
第4页 / 共54页
基于QT的扫雷游戏设计与实现本科毕业设计.doc_第5页
第5页 / 共54页
点击查看更多>>
资源描述

《基于QT的扫雷游戏设计与实现本科毕业设计.doc》由会员分享,可在线阅读,更多相关《基于QT的扫雷游戏设计与实现本科毕业设计.doc(54页珍藏版)》请在三一办公上搜索。

1、北京邮电大学本科生毕业论文基于QT的扫雷游戏的开发与实现所在院(系): 软件学院学生姓名: 宋宇辉指导教师: 苏小锐、冯秀芳研究起止日期:2014.3-2014.6毕业设计(论文)任务书第1页毕业设计(论文)题目:基于QT的扫雷游戏设计与实现毕业设计(论文)要求及原始数据(资料): 1介绍QT开发框架,以及扫雷游戏; 2深入了解基于QT的扫雷游戏的相关技术; 3熟练掌握QT开发框架的应用,训练编写C+程序的能力; 4设计并实现基于QT的扫雷游戏; 5深入分析基于QT的扫雷游戏的关键技术与编写语言; 6训练检索文献资料和利用文献资料的能力; 7训练撰写技术文档与学位论文的能力。第2页毕业设计(论

2、文)主要内容: 1介绍QT开发框架,以及扫雷游戏;2了解QT编程的相关技术;3熟悉QT开发框架; 4设计基于QT的扫雷游戏;5. 深入分析基于QT的扫雷游戏的关键技术与设计流程;6熟练掌握基于QT开发框架的C+编程;7设计与实现基于QT的扫雷游戏。学生应交出的设计文件(论文):1内容完整、层次清晰、叙述流畅、排版规范的毕业设计论文;2包括毕业设计论文、源程序等内容在内的毕业设计电子文档及其它相关材料。 第3页主要参考文献(资料):1 谭锋,章伟聪,Visual C+程序设计实训教程,北京:科学出版社,2003.82 成洁, 卢紫毅. Linux窗口程序设计Qt精彩实例分析M.北京:清华大学出版

3、社,20083 王超龙,陈志华,Visual C+入门与提高,北京:人民邮电出版社,2002.6 4 肖宏伟,Visual C+实效编程百例,北京:人民邮电出版社,2004.85 张建强,张秀梅.扫雷游戏策略初探J. 数学教学,2004(6):32-336 肖永亮Visual C+游戏编程基础,北京:电子工业出版社,2005.57 赵大伟,肖周芳,张艳.从扫雷游戏浅谈一些算法问题J. 科技信息,2008(29):698 刘加海,余建军,Visual C+程序设计基础,北京:科学出版社,2003.89 (美国)Ivor Horton,Beginning Visual C+2005,清华大学出版社

4、,200710 (美国)斯塔勒,游戏编程中的数理应用,红旗出版社,2005.311 (美国)Michael Dawson,Beginning C+ Game Programming,人民邮电出版社,2006.112 (美国)莫里森,游戏编程入门,人民邮电出版社,2005.913 (美国)麦克沙夫瑞,游戏编程全接触,人民邮电出版社,2006.1专业班级软件1026班学生宋宇辉要求设计(论文)工作起止日期2014年3月17日2014年6月27日指导教师签字日期2014年3月17日教研室主任审查签字日期系主任批准签字日期基于QT的扫雷游戏设计与实现摘 要本论文研究的是以QT为开发环境,设计并开发一款

5、扫雷游戏,其功能类似于Windows操作系统自带的扫雷游戏。实现的功能有界面的规划,游戏难度的调整,计时器,鼠标事件以及游戏完成的判定。论文首先介绍了制作游戏的整体思路及整个游戏设计的流程规划,然后介绍了雷区的布置及地雷随机产生的实现方法;重点介绍了在游戏过程中各事件的处理,其中又以鼠标事件和清除未靠近地雷区方块这两方面最为最要,鼠标事件是利用鼠标所发出的信息了解使用者的意图,进而做出相对应的动作,而清除未靠近地雷区方块由于引进了“扩散”这个概念而使其简单化。本次设计只是完成了扫雷游戏的基本功能,在细节方面仍然有待完善。关键词:扫雷; QT; 事件; 扩散Design And Implemen

6、tation Of Minesweeping Game Based On The QT PlatformAbstractWhat my thesis research for is basic on the develop environment of QT, design and develop a mine game,its function is similar to the mine games of the Windows Operating System .The thesis has introduced the layout of mined areas and the met

7、hod of how to create the mines at random. It use vairies of components in QT and the combination of some simple calculations; the thesis lays emphasis on introducing the processing of each event in the game. Among these events ,the mouse event and the event of clearance of the area which isnt close

8、to the mine field are much more important.The theory of mouse event is that the intention of user is learned by the information sent out by the mouse and then the program runs according to the information .The other event is simplified by the introduction of the concept of spread.This design has bee

9、n completed the basic function of mine game. The details still need to be improved.Key words: Mine game; QT; Affairs;Spread目录 摘 要iAbstractii第1章 绪论11.1研究背景11.2 开发的目的及意义11.3开发工具的选择1第2章 QT架构与平台搭建22.1 QT介绍22.1.1 QT语言的特性22.1.2 QT的优势22.1.3 QT/Embedded介绍32.2 QT的架构42.3 QT的组成42.4 QT开发平台的搭建62.5 QT SDK及QT Crea

10、tor工具的安装6第3章 游戏的总体分析与设计83.1 设计构想83.2 流程规划83.3 画面规划10第4章 游戏的详细设计114.1 游戏的开始114.2 雷区分布124.3 游戏中主要模块的介绍与使用144.3.1鼠标事件144.3.2地雷及雷区表面探测情况154.3.3清除未靠近地雷的方块164.3.4游戏难度的选择174.4 游戏的判断194.4.1游戏成功完成194.4.2 游戏进行失败214.5 重新进行游戏224.6 关于游戏234.7 英雄榜244.8 游戏测试及结果25总结26参考文献27致 谢28外文原文29外文翻译42第1章 绪论扫雷最原始的版本可以追溯到1973年一款

11、名为“方块”的游戏。不久之后,“方块”被改写成了游戏“Rlogic”。在“Rlogic”里,玩家的任务是作为美国海军陆战队队员,为指挥中心探出一条没有地雷的安全路线,如果路全被地雷堵死就算输。两年后,汤姆安德森在“Rlogic”的基础上有编写出了游戏“地雷”,由此奠定了现代扫雷游戏的雏形。1981年,微软公司的罗伯特杜尔和约翰逊两位工程师在Windows3.1系统上加载了该游戏,扫雷游戏才正式在全世界推广开来。1.1研究背景在计算机逐步渗入社会生活各个层面的今天,计算机已经成为人们日常生的一部分,越来越多的人使用计算机办公、娱乐等等。扫雷游戏是Windows操作系统自带的一款小游戏,在过去的几

12、年里,Windows操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是这款小游戏依然保持原来的容貌,可见这款小游戏受到越来越多人的喜爱。本次的毕业设计我将利用QT作为开发工具,开发一款类似的“扫雷游戏”。通过研究Windows操作系统自带的扫雷游戏,我们可以发现在这个游戏中主要有以下两个关键的地方:第一个是初始化问题,包括随机产生本局游戏中雷的总数,雷的分布对于每一个小区域如何获取周围地区分布的雷数等等。第二就是对鼠标事件的处理问题,既在游戏过程中对鼠标事件应如何做出反应。1.2 开发的目的及意义经过四年的大学学习,我对理论知识已经有了一定的了解与认知,本次的毕业设计便是将

13、书本上所学的理论知识与实际相结合,同时也是对所学知识的一种检查,希望通过本次的毕业设计使自己在程序的开发和设计上有新的认识并能有所提高。本次毕业设计既锻炼了我们的实际动手能力,又在老师的指导下进行了一次模拟实际产品的开发,对于我们以后工作能力的培养具有重要意义。1.3开发工具的选择由于毕业设计的选题,开发工具用的是Qt。Qt 是一个跨平台的 C+ 图形用户界面库,由挪威 TrollTech 公司出品,目前包括Qt, 基于 Framebuffer 的 Qt Embedded,快速开发工具 Qt Designer,国际化工具 Qt Linguist 等部分 Qt 支持所有 Unix 系统,当然也包

14、括 Linux,还支持 WinNT/Win2k,Win95/98 平台。 第2章 QT架构与平台搭建2.1 QT介绍QT是一个多平台的C+ 图形用户界面应用程序框架,而且QT提供了一组更容易理解的GUI类,运行的更快,另外QT特有的信号和槽,更易使用。QT面向对象且很容易扩展, 并且允许真正地组件编程。QT工具包是一个C+的类库并且是使用“一次编写,随处编译”的方式构建多平台的图形用户界面程序的一套工具。由于QT特性:平台无关性、优化了内存和资源的利用、拥有自己的窗口系统、模块化可裁剪性、代码完全公开。2.1.1 QT语言的特性QT是Trolltech公司的一款图形开发产品,它采用完全的面向对

15、象技术来进行图形应用程序的设计,允许真正的组件编程,Qt是一个全面的C+应用程序开发框架,它包含一个类库,和用于跨平台开发及国际化的工具,可以开发高性能,跨平台客户端,以及服务器端的应用程序。 Qt 类库是一个拥有超过 400个C+类,同时不断扩展的库。它封装了用于端到端应用程序开发所需要的所有基础结构。优秀的Qt应用程序接口包括成熟的对象模型,内容丰富的集合类,图形用户界面编程与布局设计功能,数据库编程,网络,XML,国际化,OpenGL 集成等等。 Qt 设计者 是一个功能强大的GUI布局与窗体构造器,能够在所有支持平台上,以本地化的视图外观与认知,快速开发高性能的用户界面。 Qt 语言家

16、 是一套用来消除国际化工作流程中所带来障碍的工具。使用Qt语言家,开发小组可把应用程序的翻译转换外包给非技术性翻译人员,从而可增加精确度,大大加快本地化处理过程。 Qt 助手 一个完全可自定义,重新分配的帮助文件或文档浏览器,它可与基于Qt 的应用程序运行。使用Qt助手,开发小组同样能够很大程度上加快文档的处理过程。2.1.2 QT的优势作为嵌入式图形界面开发工具,QT优势很多,有如下一些: 1.支持平台广泛 QT应用程序接口与工具兼容于所有支持平台,让开发员们掌握一个应用程序接口,便可执行与平台非相关的应用开发与配置,其支持的平台有:QT/Windows(Windows XP,2000,NT

17、4,Me/98)、QT/Mac (Mac OS X)、QT/X11(Linux ,SolarisHP-UX,IRIX,AIX)等。 2.封装多QT对不同平台的专门QPI进行了专门的封装(文件处理、网络等)。3.面向对象QT具有模块设计和注重软件构件或元素的可重用性的特点。 4.构件支持 QT提供信号(signal)和插槽(slot)概念,这是一种类型安全的方法,它允许回调,冰支持对象之间在彼此不知道对方信息的情况下进行合作,这使得QT非常适合于真正的构件编程。 5.友好的联机帮助 QT提供了大量的联机参考文档,有超文本HTML方式,也有UNIX帮助手册和补充说明,并且对于初学者,其中的指南将一

18、步步介绍如何进行QT编程。 6.便利性 由于QT是一种跨平台的GUI工具包,它对编程者隐藏了在处理不同窗口系统时潜在的问题,QT定义了一些类来隐藏在不同操作系统上不同处理方式下的细节问题。 7.用户自定义 使用其他的一些工具包经常会遇到这样的一种情况,没有真正适合需求的组件,声称自定义的组件对用户来说就像一个黑匣子。而在QT中生成用户自定义的组件非常简单,而且易于修改组件的行为。 8.国际化 QT为本地化应用提供了完全的支持,所有用户界面文本都可以基于消息翻译表被翻译成各国语言,QT还支持双字节16bit国际字符标准。 9.丰富的API函数 QT为专业应用提供了大量的函数,在QT的API中含有

19、大约250个C+类,大多数的类都是GUI专有的。 10.可用户化外观 QT支持主题,基于QT的应用程序能够在Windows外观、Motif外观,以及其他一些用户化主题之间切换。 11.完整的一套组件工具 QT编程的基本模块称之为组件,组件是用户界面的组成部分,QT含有用来创建专业外观的用户界面所需要的所有组件。2.1.3 QT/Embedded介绍QT/Embedded为带有轻量级窗口系统的嵌入式设备提供了标准的API。QT/Embedded面向对象的设计思想,使得它能一直向前支持鼠标、键盘、图形加速卡等附加设备。通过使用QT/Embedded,开发者可以感受到QT/X11、QT/Window

20、s和QT/Mac等不同的版本下使用相同的API编程带来的便利5。QT/Embedded与QT/X11的Linux版本的比较如下表2-1所示。应用源代码QT APIQT/EmbeddedQT/X11QT/XLibX Window ServerFrame-bufferLINUX 内核表2-1 QT/Embedded与QT/X11的Linux版本的比较2.2 QT的架构 1.窗口系统 一个QT/Embedded窗口系统包括了一个或多个进程,其中的一个进程可作为服务器。这个服务进程会分配客户显示区域,以及产生键盘和鼠标时间。此服务进程还能为已经运行的客户程序提供用户接口和输入方法。它其实就是一个有某些

21、额外权限的客户进程。任何程序都可以在命令行上加上“-qws”的选项来把它作为一个服务器来运行。 2.字体QT/Embedded支持四种不同字体格式:True Type 、Postscript Type1 、位图发布字体(BDF)和QT的预呈现(Pre-rendered)字体(QPF)。QT还可以通过增加QFontFactory的子类来支持其他字体,也可以支持以插件方式出现的反别名字体。 3.输入设备QT/Embedded 3.0支持集中鼠标协议:BusMouse、Microsoft、IntelliMouse 和MouseMan。2.3 QT的组成QT是一个完整的C+应用程序开发框架。它包含一个

22、类库和用于跨平台开发的国际化工具。 1.QT类库 众多的QT类库构成QT的基础。该库可以利用大约400个面向对象的类,这些类带有大多数构建跨平台服务器与富客户端应用程序的底层基础构造函数。这些库包括用于GUI、布局、数据库、国际化、网络与XML等的类。 2.信号/槽机制信号与槽机制是QT的核心机制,要精通QT编程就必须对信号和插槽有所了解。信号和插槽是一种高级接口,应用于对象之间的通信,它是QT核心特性,也是QT区别于其他工具包的关键所在。信号和插槽是QT自行定义的一种通信机制,它独立于标准的C/C+语言,因此要正确地处理信号和插槽,必须借助一个称为MOC(Metia Object Compi

23、ler)的QT工具,该工具是一个C+预处理程序,它为高层次的事件处理自动生成所需要的附加代码6。多个信号与单个插槽可以连接,单个信号与很多插槽也可以连接,甚至将一个信号与另外一个信号相连接也是可能的,这时无论第一个信号什么时候发射,系统都将立刻发射第二个信号。总之,信号与插槽构造了一个强大的部件编程机制。对象间信号与插槽的连接关系如图2-1所示图2-1 信号与槽连接关系3. QT Designer图形设计器QT图形设计器是一个所见即所得的全方位GUI构造器。利用QT Designer,开发者可以释放各种QT控件构造图形用户界面,而不需要编写一行代码。使用QT图形设计器的布局管理可以生成具有平滑

24、改变尺寸功能的对话框。4. Qmake工具 编写用于多平台的软件是单调发威的,且可能出现错误,维护编制文件更是如此,尤其是当不同的编译器和平台组合需要若干个编制文件时,而通过使用qmake工具可以构建出Cross-Platform Bulids 跨平台的应用程序。即qmake可以根据一个工程文件(.pro)产生不同平台下的Makefile文件。Qmake支持跨平台开发和所谓的影子生成(shadow builds)技术,qmake还易于在不同的配置中切换。2.4 QT开发平台的搭建 为了在PC主机上得到QT的开发环境,我们选择在Windows操作系统中安装VMware虚拟机软件,再在其中安装我们

25、需要的Linux操作系统。使用虚拟机的一大好处是,当在Linux因为不熟悉而遇到问题的时候,可以很容易的回到Windows中寻求解决方案,避免了在双系统中来回重启切换的麻烦。 2.5 QT SDK及QT Creator工具的安装QT可以从NOKIA官方网站()上下载,包括QT SDK和QT Creator 包。打开终端,输入命令sudo su,取得操作系统root权限。然后对下载好的SDK安装包进行chmod u+x操作,即对档案的拥有者赋予执行权限。接下来输入:./qt-sdk-liunx-x86-opensource-2.1.0.bin。执行QT SDK的安装操作。如图2-2所示:图2-2

26、 QT Creator安装界面QT Creator安装完成之后,双击图标,进入QT Creator IDE界面, 如下图2-3所示:至此,平台搭建已经完成。 图2-3 QT Creator操作界面第3章 游戏的总体分析与设计3.1 设计构想相信大多数使用Windows操作系统的使用者,对这款游戏都不陌生。这款游戏不止操作简单,规则也不难,再加上游戏速度的控制机制得宜,让整个游戏在操作过程中充满了快乐与紧张的气氛。除了游乐当中能带给使用者快乐之外,游戏的设计内容无形中也不断训练使用者的逻辑思考能力,对于依靠高度脑力工作的现代人,都可以通过这个游戏,不时的检验一下自己,所以我们不难发现,在各种可携

27、带的电子产品上都有这款游戏的踪影。在设计之前,我们先来了解这款游戏的规则。在不掀开任何藏有地雷的方块情况下,以最快的速度找出所有的地雷。如果在掀开方块的过程中,不小心翻开(踩到)藏有地雷的方块,则宣告失败(游戏结束),惟有将所有不含地雷的方块掀开,游戏才算成功。游戏的操作方面主要以鼠标为主,当鼠标指针对准未翻开的方块按下左键时即表示翻开方块,当鼠标指针对准未翻开的方块按下右键时即表示标记或取消标记地雷,反复按下右键则方块会以标记,取消标记两者之间不断循环。游戏者可以通过地雷区内的数字提示了解以数字为中心的其周边八个方格内所含的地雷数,假若翻开的方块显示数字“3”,则表示以其为中心的周边方块内藏

28、有3个地雷。当按下的方块不是地雷,且周边八个方块也都没有地雷时,方块会以被翻开方块的八个方向将空白方块翻开。3.2 流程规划流程规划大致上可以分为三个部分,分别为:游戏开始阶段、游戏进行阶段和游戏结束阶段。游戏开始时,会以游戏者最后一次设定的地雷区大小为范围画出地雷区,同时会产生地雷并且开始计时。游戏进行阶段主要就是如何判断按下的方块是非地雷时的处理,这也是整个游戏的技术核心,我们可以通过扩散的观念来检查周边的方块是否含有地雷及是否继续往外翻开,以及鼠标右键的标记功能的实现。游戏结束阶段,判定游戏是否结束有两种情况,第一种是没有踩到雷,成功完成游戏,会弹出提示框提示赢得游戏,如果创造了新的纪录

29、,则会弹出提示框提示输入姓名。第二种是踩到雷,也就是游戏失败,同样会弹出提示框来提示输掉游戏。鼠标事件流程图如下图3-1所示:图3-1 鼠标事件流程图3.3 画面规划游戏画面如图3-2所示:图3-2 游戏界面图说明如下:游戏界面由下列组成:游戏窗口游戏菜单栏游戏状态栏游戏区域(雷区)游戏计时器第4章 游戏的详细设计4.1 游戏的开始当玩家开始游戏时,游戏画面如图4-1所示:图4-1 游戏初始画面我们可以清楚的看到,游戏界面主要分为两个主要部分:1. 计时及状态区;2.地雷区。计时及状态区是玩家开始点击图标到游戏结束时对时间的统计,也用QLabel来实现了。代码实现如下:void MainWin

30、dow:create_statusBar()/计时器time_label=new QLabel;statusBar()-addPermanentWidget(time_label); statusBar()-addPermanentWidget(new QLabel(tr(second);void MainWindow:slot_timer()time_label-setText(QString(%1).arg(time.elapsed()/1000);然后再利用ImageList组件来存储游戏中将要使用的图片,我们可以将组件布置于窗体后编辑组件属性,如图4-2所示:图4-2 Image组件4

31、.2 雷区分布当游戏界面初始化完成,地雷也同时放入雷区中,并且开始计时。具体实现如下所示:void BlockArea:set_block_area(int row,int column,int mine_number,int init_flag)/雷区设置if(!init_flag) for(int i=0;irow_;i+) for(int j=0;jcolumn_;j+) delete static_cast(mainLayout-itemAtPosition(i,j)-widget(); delete mainLayout;row_=row;column_=column;total_b

32、lock_number_=row_*column_;total_mine_number_=mine_number;turn_over_block_number_=0;game_over_flag_=false;bool mine_flagtotal_block_number_;for(int i=0;itotal_mine_number_;i+) mine_flagi=true;for(int i=total_mine_number_;itotal_block_number_;i+) mine_flagi=false;QTime time;time=QTime:currentTime();qs

33、rand(time.msec()+time.second()*1000);std:random_shuffle(mine_flag,mine_flag+total_block_number_,p_random);mainLayout=new QGridLayout(this);for(int i=0;irow_;i+) for(int j=0;jaddWidget(new Block(mine_flagi*column_+j),i,j);for(int i=0;irow_;i+) for(int j=0;jcolumn_;j+) Block* current_block=static_cast

34、(mainLayout-itemAtPosition(i,j)-widget(); 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事件中,可以捕捉鼠

35、标所按下或放开的按键为何、鼠标光标在该组件上的坐标及是否同时按下辅助键等。函数原型如:void mousePressEvent(QGraphicsSceneMouseEvent * event);在参数列中,Button参数值表示鼠标上的按钮数值。其意义如下:1:左键 2:右键在本游戏中,我们利用右键的RightButton来标记“已标记”方块,利用左键的,来标示游戏者准备按下的方块,再利用左键的LeftButton来确定翻开的方块。在窗口的软件中,鼠标的应用是不可或缺的,但鼠标固然好用,如果程序设计不当,也可能造成使用者的不便。游戏的操作方面主要以鼠标为主,当鼠标指针对准未翻开的方块按下左键

36、时即表示翻开方块:当鼠标指针对准未翻开的方块按下右键时即表示标记地雷,反复按下右键则方块会以“标记”,“取消标记”两者之间不断循环:void Block: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(); emit turn_over(true); else

37、setPixmap(QPixmap(:/images/mine_+QString(%1).arg(number_)+.png); update(); emit turn_over(false); else if(event-button()=Qt:RightButton) if(!turn_over_flag_) if(!mark_flag_) mark_flag_=true; setPixmap(QPixmap(:/images/flag.png); else mark_flag_=false; setPixmap(QPixmap(:/images/normal.png); update()

38、; QLabel:mousePressEvent(event); 就像windows自带的扫雷一样,如果说这个块被右键标记了,左键点击是不能再翻开的,同样的,左键翻开过的块也是无法在点击的。4.3.2地雷及雷区表面探测情况在游戏设计上,我利用了两个二维数组分别记录地雷的分布情况及雷区表面探测情形,如图4-3所示图4-3标示地雷分布情况因为两个数组维数皆为2,所以我们通过双循环做数据的对比工作。另外,当游戏玩家按下非地雷的方块时,程序必须自动将周边非地雷的方块翻开,这个动作我们也可以通过双循环的方式检查以按下的方块为中心与周边的8个方块所形成的3*3的二维数组,鼠标指针所指即是代表按下的方块,利

39、用双循环作数据的对比,不但速度快,而且在设计阶段,程序的架构也比较清楚。程序设计时双循环常常搭配二维数组使用。4.3.3清除未靠近地雷的方块在游戏过程中,当游戏者按下非地雷方块时,方块会沿四周八个方向向外翻开非地雷的方块。程序的执行方面必须判断:以按下方块为中心,检查周围八个方块是否为非地雷方块,若其中有一个方块是非地雷方块时,则又以其为中心,向外检查周围八个方块是否为非地雷方块,如此反复的执行即构成扩散的使用条件。前面已经提到,扩散必须设计终止的条件判断,在本游戏的扩散架构中,当判断方块的内容为数字时(即在非地雷方块周围),即立即停止扩散程序。扩散其实也不是万能的,以本游戏做测试,当地雷区范

40、围越大,且地雷数目不多时(一翻开非地雷方块,几乎全部方块都会翻开),执行扩散就会变的非常缓慢,甚至造成堆迭溢满(不足)的情形,所以在游戏设计上必须考虑地雷区的大小,以免造成执行时错误中断的情况发生。代码部分如下所示:void BlockArea:try_to_turn_over_more_blocks(int x,int y)/自动翻周围无雷标记的块QQueueQPair queue;QPair pair;queue.enqueue(qMakePair(x,y);while(!queue.isEmpty() pair=queue.head(); queue.dequeue(); if(calc

41、ulate_mines(pair.first,pair.second)=0) for(int i=0;i3;i+) for(int j=0;j=0) & (pair.first-1+i=0) & (pair.second-1+jcolumn_) ) if(!static_cast(mainLayout-itemAtPosition(pair.first-1+i,pair.second-1+j)-widget()-is_turn_over() static_cast(mainLayout-itemAtPosition(pair.first-1+i,pair.second-1+j)-widget(

42、)-turn_over(); +turn_over_block_number_; queue.enqueue(qMakePair(pair.first-1+i,pair.second-1+j); if(turn_over_block_number_=total_block_number_-total_mine_number_) game_over_flag_=true; emit game_over(true);4.3.4游戏难度的选择这里我设置了“初级”,“中级”,“高级”以及“自定义”四个不同的难度级别,“初级”,“中级”,“高级”中的雷区大小和地雷总数是已经设计好了的,如果玩家想要自己设

43、置这些参数,可单击“游戏”“自定义”,然后在“设置”中输入行数,列数及地雷数。代码如下:void MainWindow:slot_standard(QAction* standard_action)/难度设置if(standard_action=easy_standard_action)/简单难度 current_standard_=0; row_=9; column_=9; mine_number_=10;else if(standard_action=middle_standard_action)/中等难度 current_standard_=1; row_=16; column_=16; mine_number_=4

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号