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

上传人:1777****777 文档编号:37239689 上传时间:2021-11-02 格式:DOC 页数:54 大小:969KB
返回 下载 相关 举报
基于QT的扫雷游戏设计与实现本科毕业设计_第1页
第1页 / 共54页
基于QT的扫雷游戏设计与实现本科毕业设计_第2页
第2页 / 共54页
基于QT的扫雷游戏设计与实现本科毕业设计_第3页
第3页 / 共54页
点击查看更多>>
资源描述
北京邮电北京邮电大学本科生毕业论文大学本科生毕业论文 基于基于 QTQT 的扫雷游戏的开发与实现的扫雷游戏的开发与实现 所在院所在院( (系系) ): 软件学院软件学院 学生姓名:学生姓名: 宋宇辉宋宇辉 指导教师:指导教师: 苏小锐、冯秀芳苏小锐、冯秀芳 研究起止日期:研究起止日期:2014.32014.3-2014.62014.6 毕业设计(论文)任务书 第 1 页 毕业设计(论文)题目: 基于 QT 的扫雷游戏设计与实现 毕业设计(论文)要求及原始数据(资料) : 1介绍 QT 开发框架,以及扫雷游戏; 2深入了解基于 QT 的扫雷游戏的相关技术; 3熟练掌握 QT 开发框架的应用,训练编写 C+程序的能力; 4设计并实现基于 QT 的扫雷游戏; 5深入分析基于 QT 的扫雷游戏的关键技术与编写语言; 6训练检索文献资料和利用文献资料的能力; 7训练撰写技术文档与学位论文的能力。 第 2 页 毕业设计(论文)主要内容: 1介绍 QT 开发框架,以及扫雷游戏; 2了解 QT 编程的相关技术; 3熟悉 QT 开发框架; 4设计基于 QT 的扫雷游戏; 5. 深入分析基于 QT 的扫雷游戏的关键技术与设计流程; 6熟练掌握基于 QT 开发框架的 C+编程; 7设计与实现基于 QT 的扫雷游戏。 学生应交出的设计文件(论文) : 1内容完整、层次清晰、叙述流畅、排版规范的毕业设计论文; 2包括毕业设计论文、源程序等内容在内的毕业设计电子文档及其它相关材料。 第 3 页 主要参考文献(资料) : 1 谭锋,章伟聪,Visual C+程序设计实训教程,北京:科学出版社,2003.8 2 成洁, 卢紫毅. Linux 窗口程序设计Qt 精彩实例分析M.北京:清华大学出版社,2008 3 王超龙,陈志华,Visual C+入门与提高,北京:人民邮电出版社,2002.6 4 肖宏伟,Visual C+实效编程百例,北京:人民邮电出版社,2004.8 5 张建强,张秀梅.扫雷游戏策略初探J. 数学教学,2004(6) :32-33 6 肖永亮 Visual C+游戏编程基础,北京:电子工业出版社,2005.5 7 赵大伟,肖周芳,张艳.从扫雷游戏浅谈一些算法问题J. 科技信息,2008(29):69 8 刘加海,余建军,Visual C+程序设计基础,北京:科学出版社,2003.8 9 (美国)Ivor Horton,Beginning Visual C+2005,清华大学出版社,2007 10 (美国)斯塔勒,游戏编程中的数理应用,红旗出版社,2005.3 11 (美国)Michael Dawson,Beginning C+ Game Programming,人民邮电出版社,2006.1 12 (美国)莫里森,游戏编程入门,人民邮电出版社,2005.9 13 (美国)麦克沙夫瑞,游戏编程全接触,人民邮电出版社,2006.1 专业班级 软件 1026 班 学生 宋宇辉 要求设计(论文)工作起止日期 2014 年 3 月 17 日2014 年 6 月 27 日 指导教师签字 日期 2014 年 3 月 17 日 教研室主任审查签字 日期 系主任批准签字 日期 北京邮电大学毕业设计 i 基于 QT 的扫雷游戏设计与实现 摘 要 本论文研究的是以 QT 为开发环境, 设计并开发一款扫雷游戏, 其功能类似于 Windows操作系统自带的扫雷游戏。实现的功能有界面的规划,游戏难度的调整,计时器,鼠标事件以及游戏完成的判定。 论文首先介绍了制作游戏的整体思路及整个游戏设计的流程规划,然后介绍了雷区的布置及地雷随机产生的实现方法;重点介绍了在游戏过程中各事件的处理,其中又以鼠标事件和清除未靠近地雷区方块这两方面最为最要,鼠标事件是利用鼠标所发出的信息了解使用者的意图, 进而做出相对应的动作, 而清除未靠近地雷区方块由于引进了 “扩散”这个概念而使其简单化。 本次设计只是完成了扫雷游戏的基本功能,在细节方面仍然有待完善。 关键词:扫雷; QT; 事件; 扩散 北京邮电大学毕业设计 ii Design And Implementation Of Minesweeping Game Based On The QT Platform Abstract What 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 method 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 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 been completed the basic function of mine game. The details still need to be improved. Key words: Mine game; QT; Affairs;Spread 北京邮电大学毕业设计 iii 目录目录 摘 要 . i Abstract . ii 第 1 章 绪论 . 1 1.1 研究背景 . 1 1.2 开发的目的及意义 . 1 1.3 开发工具的选择 . 1 第 2 章 QT 架构与平台搭建 . 2 2.1 QT 介绍 . 2 2.1.1 QT 语言的特性 . 2 2.1.2 QT 的优势 . 2 2.1.3 QT/Embedded 介绍 . 3 2.2 QT 的架构 . 4 2.3 QT 的组成 . 4 2.4 QT 开发平台的搭建 . 6 2.5 QT SDK 及 QT Creator 工具的安装 . 6 第 3 章 游戏的总体分析与设计 . 8 3.1 设计构想 . 8 3.2 流程规划 . 8 3.3 画面规划 . 10 第 4 章 游戏的详细设计 . 11 4.1 游戏的开始 . 11 4.2 雷区分布 . 12 4.3 游戏中主要模块的介绍与使用 . 14 4.3.1 鼠标事件 . 14 4.3.2 地雷及雷区表面探测情况 . 15 4.3.3 清除未靠近地雷的方块 . 16 4.3.4 游戏难度的选择 . 17 4.4 游戏的判断 . 19 4.4.1 游戏成功完成 . 19 4.4.2 游戏进行失败 . 21 4.5 重新进行游戏 . 22 4.6 关于游戏 . 23 4.7 英雄榜 . 24 4.8 游戏测试及结果 . 25 总结 . 26 参考文献 . 27 致 谢 . 28 北京邮电大学毕业设计 iv 外文原文 . 29 外文翻译 . 42 北京邮电大学毕业设计 1 第 1 章 绪论 扫雷最原始的版本可以追溯到 1973 年一款名为“方块”的游戏。不久之后, “方块”被改写成了游戏“Rlogic” 。在“Rlogic”里,玩家的任务是作为美国海军陆战队队员,为指挥中心探出一条没有地雷的安全路线,如果路全被地雷堵死就算输。两年后,汤姆安德森在“Rlogic”的基础上有编写出了游戏“地雷” ,由此奠定了现代扫雷游戏的雏形。1981 年,微软公司的罗伯特杜尔和约翰逊两位工程师在 Windows3.1 系统上加载了该游戏,扫雷游戏才正式在全世界推广开来。 1.1 研究背景 在计算机逐步渗入社会生活各个层面的今天,计算机已经成为人们日常生的一部分,越来越多的人使用计算机办公、娱乐等等。 扫雷游戏是 Windows 操作系统自带的一款小游戏,在过去的几年里,Windows 操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是这款小游戏依然保持原来的容貌, 可见这款小游戏受到越来越多人的喜爱。 本次的毕业设计我将利用 QT 作为开发工具,开发一款类似的“扫雷游戏” 。 通过研究 Windows 操作系统自带的扫雷游戏, 我们可以发现在这个游戏中主要有以下两个关键的地方: 第一个是初始化问题, 包括随机产生本局游戏中雷的总数, 雷的分布对于每一个小区域如何获取周围地区分布的雷数等等。 第二就是对鼠标事件的处理问题,既在游戏过程中对鼠标事件应如何做出反应。 1.2 开发的目的及意义 经过四年的大学学习, 我对理论知识已经有了一定的了解与认知, 本次的毕业设计便是将书本上所学的理论知识与实际相结合, 同时也是对所学知识的一种检查, 希望通过本次的毕业设计使自己在程序的开发和设计上有新的认识并能有所提高。 本次毕业设计既锻炼了我们的实际动手能力,又在老师的指导下进行了一次模拟实际产品的开发,对于我们以后工作能力的培养具有重要意义。 1.3 开发工具的选择 由于毕业设计的选题,开发工具用的是 Qt。 Qt 是一个跨平台的 C+ 图形用户界面库,由挪威 TrollTech 公司出品,目前包括 Qt, 基于 Framebuffer 的 Qt Embedded,快速开发工具 Qt Designer,国际化工具 Qt Linguist 等部分 Qt 支持所有 Unix 系统,当然也包括 Linux,还支持 WinNT/Win2k,Win95/98 平台。 北京邮电大学毕业设计 2 第 2 章 QT 架构与平台搭建 2.1 QT 介绍 QT 是一个多平台的 C+ 图形用户界面应用程序框架, 而且 QT 提供了一组更容易理解的 GUI 类,运行的更快,另外 QT 特有的信号和槽,更易使用。QT 面向对象且很容易扩展, 并且允许真正地组件编程。QT 工具包是一个 C+的类库并且是使用“一次编写,随处编译”的方式构建多平台的图形用户界面程序的一套工具。由于 QT 特性:平台无关性、优化了内存和资源的利用、拥有自己的窗口系统、模块化可裁剪性、代码完全公开。 2.1.1 QT 语言的特性 QT 是 Trolltech 公司的一款图形开发产品,它采用完全的面向对象技术来进行图形应用程序的设计,允许真正的组件编程,Qt 是一个全面的 C+应用程序开发框架,它包含一个类库,和用于跨平台开发及国际化的工具,可以开发高性能,跨平台客户端,以及服务器端的应用程序。 Qt 类库是一个拥有超过 400 个 C+类, 同时不断扩展的库。 它封装了用于端到端应用程序开发所需要的所有基础结构。优秀的 Qt 应用程序接口包括成熟的对象模型,内容丰富的集合类,图形用户界面编程与布局设计功能,数据库编程,网络,XML,国际化,OpenGL 集成等等。 Qt 设计者 是一个功能强大的 GUI 布局与窗体构造器,能够在所有支持平台上,以本地化的视图外观与认知,快速开发高性能的用户界面。 Qt 语言家 是一套用来消除国际化工作流程中所带来障碍的工具。使用 Qt 语言家,开发小组可把应用程序的翻译转换外包给非技术性翻译人员,从而可增加精确度,大大加快本地化处理过程。 Qt 助手 一个完全可自定义,重新分配的帮助文件或文档浏览器,它可与基于 Qt 的应用程序运行。使用 Qt 助手,开发小组同样能够很大程度上加快文档的处理过程。 2.1.2 QT 的优势 作为嵌入式图形界面开发工具,QT 优势很多,有如下一些: 1.支持平台广泛 QT 应用程序接口与工具兼容于所有支持平台,让开发员们掌握一个应用程序接口, 便可执行与平台非相关的应用开发与配置, 其支持的平台有: QT/Windows (Windows XP,2000,NT4,Me/98) 、QT/Mac (Mac OS X)、QT/X11(Linux ,SolarisHP-UX,IRIX,AIX)等。 2.封装多 QT 对不同平台的专门 QPI 进行了专门的封装(文件处理、网络等) 。 北京邮电大学毕业设计 3 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.3 QT/Embedded 介绍 QT/Embedded 为带有轻量级窗口系统的嵌入式设备提供了标准的 API。 QT/Embedded面向对象的设计思想,使得它能一直向前支持鼠标、键盘、图形加速卡等附加设备。通过使用 QT/Embedded,开发者可以感受到 QT/X11、QT/Windows 和 QT/Mac 等不同的版本下使用相同的 API 编程带来的便利5。 QT/Embedded 与 QT/X11 的 Linux 版本的比较如下表 2-1 所示。 北京邮电大学毕业设计 4 应用源代码 QT API QT/Embedded QT/X11 QT/XLib X Window Server Frame-buffer LINUX 内核 表 2-1 QT/Embedded 与 QT/X11 的 Linux 版本的比较 2.2 QT 的架构 1.窗口系统 一个 QT/Embedded 窗口系统包括了一个或多个进程,其中的一个进程可作为服务器。这个服务进程会分配客户显示区域,以及产生键盘和鼠标时间。此服务进程还能为已经运行的客户程序提供用户接口和输入方法。 它其实就是一个有某些额外权限的客户进程。任何程序都可以在命令行上加上“-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+应用程序开发框架。 它包含一个类库和用于跨平台开发的国际化工具。 1.QT 类库 众多的 QT 类库构成 QT 的基础。该库可以利用大约 400 个面向对象的类,这些类带有大多数构建跨平台服务器与富客户端应用程序的底层基础构造函数。 这些库包括用于GUI、布局、数据库、国际化、网络与 XML 等的类。 北京邮电大学毕业设计 5 2.信号/槽机制 信号与槽机制是 QT 的核心机制, 要精通 QT 编程就必须对信号和插槽有所了解。 信号和插槽是一种高级接口,应用于对象之间的通信,它是 QT 核心特性,也是 QT 区别于其他工具包的关键所在。信号和插槽是 QT 自行定义的一种通信机制,它独立于标准的C/C+语言,因此要正确地处理信号和插槽,必须借助一个称为 MOC(Metia Object Compiler)的 QT 工具,该工具是一个 C+预处理程序,它为高层次的事件处理自动生成所需要的附加代码6。 多个信号与单个插槽可以连接, 单个信号与很多插槽也可以连接, 甚至将一个信号与另外一个信号相连接也是可能的, 这时无论第一个信号什么时候发射, 系统都将立刻发射第二个信号。总之,信号与插槽构造了一个强大的部件编程机制。 对象间信号与插槽的连接关系如图 2-1 所示 图 2-1 信号与槽连接关系 3. QT Designer 图形设计器 QT 图形设计器是一个所见即所得的全方位 GUI 构造器。利用 QT Designer,开发者可以释放各种 QT 控件构造图形用户界面, 而不需要编写一行代码。 使用 QT 图形设计器的布局管理可以生成具有平滑改变尺寸功能的对话框。 4. Qmake 工具 编写用于多平台的软件是单调发威的,且可能出现错误,维护编制文件更是如此,北京邮电大学毕业设计 6 尤其是当不同的编译器和平台组合需要若干个编制文件时, 而通过使用 qmake 工具可以构建出 Cross-Platform Bulids 跨平台的应用程序。即 qmake 可以根据一个工程文件(.pro)产生不同平台下的 Makefile 文件。Qmake 支持跨平台开发和所谓的影子生成(shadow builds)技术,qmake 还易于在不同的配置中切换。 2.4 QT 开发平台的搭建 为了在 PC 主机上得到 QT 的开发环境, 我们选择在 Windows 操作系统中安装 VMware虚拟机软件,再在其中安装我们需要的 Linux 操作系统。使用虚拟机的一大好处是,当在 Linux 因为不熟悉而遇到问题的时候,可以很容易的回到 Windows 中寻求解决方案,避免了在双系统中来回重启切换的麻烦。 2.5 QT SDK 及 QT Creator 工具的安装 QT 可以从 NOKIA 官方网站(https:/)上下载,包括 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 QT Creator 安装界面 北京邮电大学毕业设计 7 QT Creator 安装完成之后,双击图标,进入 QT Creator IDE 界面, 如下图 2-3所示:至此,平台搭建已经完成。 图 2-3 QT Creator 操作界面 北京邮电大学毕业设计 8 第 3 章 游戏的总体分析与设计 3.1 设计构想 相信大多数使用 Windows 操作系统的使用者, 对这款游戏都不陌生。 这款游戏不止操作简单,规则也不难,再加上游戏速度的控制机制得宜,让整个游戏在操作过程中充满了快乐与紧张的气氛。 除了游乐当中能带给使用者快乐之外, 游戏的设计内容无形中也不断训练使用者的逻辑思考能力, 对于依靠高度脑力工作的现代人, 都可以通过这个游戏,不时的检验一下自己,所以我们不难发现,在各种可携带的电子产品上都有这款游戏的踪影。 在设计之前,我们先来了解这款游戏的规则。 在不掀开任何藏有地雷的方块情况下, 以最快的速度找出所有的地雷。 如果在掀开方块的过程中,不小心翻开(踩到)藏有地雷的方块,则宣告失败(游戏结束) ,惟有将所有不含地雷的方块掀开,游戏才算成功。 游戏的操作方面主要以鼠标为主, 当鼠标指针对准未翻开的方块按下左键时即表示翻开方块, 当鼠标指针对准未翻开的方块按下右键时即表示标记或取消标记地雷, 反复按下右键则方块会以标记, 取消标记两者之间不断循环。 游戏者可以通过地雷区内的数字提示了解以数字为中心的其周边八个方格内所含的地雷数, 假若翻开的方块显示数字“3” ,则表示以其为中心的周边方块内藏有 3 个地雷。 当按下的方块不是地雷, 且周边八个方块也都没有地雷时, 方块会以被翻开方块的八个方向将空白方块翻开。 3.2 流程规划 流程规划大致上可以分为三个部分,分别为:游戏开始阶段、游戏进行阶段和游戏结束阶段。 游戏开始时, 会以游戏者最后一次设定的地雷区大小为范围画出地雷区, 同时会产生地雷并且开始计时。游戏进行阶段主要就是如何判断按下的方块是非地雷时的处理,这也是整个游戏的技术核心, 我们可以通过扩散的观念来检查周边的方块是否含有地雷及是否继续往外翻开,以及鼠标右键的标记功能的实现。游戏结束阶段,判定游戏是否结束有两种情况,第一种是没有踩到雷,成功完成游戏,会弹出提示框提示赢得游戏,如果创造了新的纪录,则会弹出提示框提示输入姓名。第二种是踩到雷,也就是游戏失败,同样会弹出提示框来提示输掉游戏。 北京邮电大学毕业设计 9 鼠标事件流程图如下图 3-1 所示: 图 3-1 鼠标事件流程图 北京邮电大学毕业设计 10 3.3 画面规划 游戏画面如图 3-2 所示: 图 3-2 游戏界面图 说明如下: 游戏界面由下列组成: 游戏窗口 游戏菜单栏 游戏状态栏 游戏区域(雷区) 游戏计时器 北京邮电大学毕业设计 11 第 4 章 游戏的详细设计 4.1 游戏的开始 当玩家开始游戏时,游戏画面如图 4-1 所示: 图 4-1 游戏初始画面 我们可以清楚的看到,游戏界面主要分为两个主要部分:1. 计时及状态区;2.地雷区。 计时及状态区是玩家开始点击图标到游戏结束时对时间的统计,也用 QLabel 来实现了。代码实现如下: void MainWindow:create_statusBar()/计时器 time_label=new QLabel; statusBar()-addPermanentWidget(time_label); statusBar()-addPermanentWidget(new QLabel(tr(second); 北京邮电大学毕业设计 12 void MainWindow:slot_timer() time_label-setText(QString(%1).arg(time.elapsed()/1000); 然后再利用 ImageList 组件来存储游戏中将要使用的图片, 我们可以将组件布置于窗体后编辑组件属性,如图 4-2 所示: 图 4-2 Image 组件 4.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(); 北京邮电大学毕业设计 13 delete mainLayout; row_=row; column_=column; total_block_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(); qsrand(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(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); 北京邮电大学毕业设计 14 4.3 游戏中主要模块的介绍与使用 4.3.1 鼠标事件 在游戏过程中, 我们利用鼠标所发出的信息了解游戏者的意图, 进而作出相对应的动作。 在 RightPress 与 MidPress 事件中,可以捕捉鼠标所按下或放开的按键为何、鼠标光标在该组件上的坐标及是否同时按下辅助键等。函数原型如: void mousePressEvent(QGraphicsSceneMouseEvent * event); 在参数列中,Button 参数值表示鼠标上的按钮数值。其意义如下: 1:左键 2:右键 在本游戏中,我们利用右键的 RightButton 来标记“已标记”方块,利用左键的,来标示游戏者准备按下的方块,再利用左键的 LeftButton 来确定翻开的方块。 在窗口的软件中, 鼠标的应用是不可或缺的, 但鼠标固然好用, 如果程序设计不当,也可能造成使用者的不便。 游戏的操作方面主要以鼠标为主, 当鼠标指针对准未翻开的方块按下左键时即表示翻开方块: 当鼠标指针对准未翻开的方块按下右键时即表示标记地雷, 反复按下右键则方块会以“标记” , “取消标记”两者之间不断循环: 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 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; 北京邮电大学毕业设计 15 setPixmap(QPixmap(:/images/flag.png); else mark_flag_=false; setPixmap(QPixmap(:/images/normal.png); update(); QLabel:mousePressEvent(event); 就像 windows 自带的扫雷一样, 如果说这个块被右键标记了, 左键点击是不能再翻开的,同样的,左键翻开过的块也是无法在点击的。 4.3.2 地雷及雷区表面探测情况 在游戏设计上,我利用了两个二维数组分别记录地雷的分布情况及雷区表面探测情形,如图 4-3 所示 图 4-3 标示地雷分布情况 北京邮电大学毕业设计 16 因为两个数组维数皆为 2,所以我们通过双循环做数据的对比工作。另外,当游戏玩家按下非地雷的方块时, 程序必须自动将周边非地雷的方块翻开, 这个动作我们也可以通过双循环的方式检查以按下的方块为中心与周边的8个方块所形成的3*3的二维数组,鼠标指针所指即是代表按下的方块,利用双循环作数据的对比,不但速度快,而且在设计阶段,程序的架构也比较清楚。程序设计时双循环常常搭配二维数组使用。 4.3.3 清除未靠近地雷的方块 在游戏过程中, 当游戏者按下非地雷方块时, 方块会沿四周八个方向向外翻开非地雷的方块。 程序的执行方面必须判断: 以按下方块为中心, 检查周围八个方块是否为非地雷方块,若其中有一个方块是非地雷方块时,则又以其为中心,向外检查周围八个方块是否为非地雷方块,如此反复的执行即构成扩散的使用条件。 前面已经提到,扩散必须设计终止的条件判断,在本游戏的扩散架构中,当判断方块的内容为数字时(即在非地雷方块周围) ,即立即停止扩散程序。 扩散其实也不是万能的,以本游戏做测试,当地雷区范围越大,且地雷数目不多时(一翻开非地雷方块,几乎全部方块都会翻开) ,执行扩散就会变的非常缓慢,甚至造成堆迭溢满(不足)的情形,所以在游戏设计上必须考虑地雷区的大小,以免造成执行时错误中断的情况发生。 代码部分如下所示: 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(calculate_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()-turn_over(); +turn_over_block_number_; 北京邮电大学毕业设计 17 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 游戏难度的选择 这里我设置了“初级” , “中级” , “高级”以及“自定义”四个不同的难度级别, “初级” , “中级” , “高级”中的雷区大小和地雷总数是已经设计好了的,如果玩家想要自己设置这些参数,可单击“游戏”“自定义” ,然后在“设置”中输入行数,列数及地雷数。 代码如下: 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_=40; else if(standard_action=hard_standard_action)/困难难度 current_standard_=2; row_=16; column_=30; mine_number_=99; else if(standard_action=custom_standard_action)/自定义 QDialog dialog; dialog.setWindowTitle(tr(set standard); 北京邮电大学毕业设计 18 QSpinBox* row_spinBox=new QSpinBox;/行设置 row_spinBox-setRange(5,50); row_spinBox-setValue(row_); QSpinBox* column_spinBox=new QSpinBox;/列设置 column_spinBox-setRange(5,50); column_spinBox-setValue(column_); QSpinBox* mine_spinBox=new QSpinBox;/雷数设置 mine_spinBox-setValue(mine_number_); QHBoxLayout* up_layout=new QHBoxLayout;/水平布局管理器 up_layout-addWidget(row_spinBox); up_layout-addWidget(column_spinBox); up_layout-addWidget(mine_spinBox); QDialogButtonBox* dialog_buttonBox=new QDialogButtonBox; dialog_buttonBox-addButton(QDialogButtonBox:Ok); dialog_buttonBox-addButton(QDialogButtonBox:Cancel); connect(dialog_buttonBox,SIGNAL(accepted(),&dialog,SLOT(accept(); connect(dialog_buttonBox,SIGNAL(rejected(),&dialog,SLOT(reject(); QHBoxLayout* bottom_layout=new QHBoxLayout; bottom_layout-addStretch(); bottom_layout-addWidget(dialog_buttonBox); QVBoxLayout* main_layout=new QVBoxLayout(&dialog); main_layout-addLayout(up_layout); main_layout-addLayout(bottom_layout); if(dialog.exec()=QDialog:Accepted) if(row_spinBox-value()*column_spinBox-value()mine_spinBox-value() current_standard_=3; row_=row_spinBox-value(); column_=column_spinBox-value(); mine_number_=mine_spinBox-value(); slot_new_game(); 北京邮电大学毕业设计 19 4.4 游戏的判断 4.4.1 游戏成功完成 当在规定的时间内将所有的雷都正确的标示出来, 游戏就会有一个弹出框提示你在多长时间内完成当前难度下的游戏。 还有一种情况便是当只剩下地雷未探测的时候, 及雷区方块总数-已清除的方块数=地雷总数的话,游戏也将成功完成。实现代码如下。 void MainWindow:slot_game_over(bool is_win)/完成游戏的判断 timer.stop(); QString name; if(is_win) switch(current_standard_) case 0:/初级难度的判定 if(time_label-text().toInt()text().toInt(); easy_record_name_=name; else/只是赢得游戏,没有创造纪录 QMessageBox:information(this,tr(Result),tr(You win); break; case 1: if(time_label-text().toInt()text().toInt(); middle_record_name_=name; else QMessageBox:information(this,tr(Result),tr(You win); break; case 2: if(time_label-text().toInt()text().toInt(); hard_record_name_=name; else QMessageBox:information(this,tr(Result),tr(You win); break; default:QMessageBox:information(this,tr(Result),tr(You win); else QMessageBox:information(this,tr(Result),tr(You lose); 当游戏成功时,会弹出提示框。如图 4-4 所示: 图 4-4 游戏完成 北京邮电大学毕业设计 21 如果创造了新的纪录会弹出提示框来输入姓名,如下图 4-5 所示 图 4-5 创造新纪录 4.4.2 游戏进行失败 当鼠标左键按下的方块为地雷方块时,地雷将会被引爆,游戏立即结束。 游戏失败时也会弹出提示框,如图 4-6 所示: 图 4-6 游戏失败 北京邮电大学毕业设计 22 4.5 重新进行游戏 当游戏的参与者正在进行游戏中时想中途退出重新开始,我提供了两种方案,方案 1:点击新游戏按钮,如图 4-7 所示: 图 4-7 方案 1 方案 2: 点击面板左上角的图片按钮即可,如图 4-8 所示: 图 4-8 方案 2 北京邮电大学毕业设计 23 但是每种方式都是由重新调用这个函数来实现的: void MainWindow:slot_new_game()/新游戏 area_-set_block_area(row_,column_,mine_number_); time_label-setText(0); time.restart(); timer.start(); 4.6 关于游戏 每一个游戏都会有一个游戏的说明及开发者的情况,我所开发的扫雷也包含这个说明,如图 4-9 所示: 图 4-9 关于游戏 北京邮电大学毕业设计 24 4.7 英雄榜 当扫雷成功时,游戏会记录参与者的姓名,这时就需要参与者输入自己的姓名,当然你只能超过帮榜上的游戏完成时间才能记录,如图 4-10 所示: 图 4-10 排行榜 实现代码如下: void MainWindow:slot_rank()/排行榜 QDialog dialog; dialog.setWindowTitle(tr(rank); QGridLayout* up_layout=new QGridLayout; up_layout-addWidget(new QLabel(tr(Standard),0,0); up_layout-addWidget(new QLabel(tr(Time),0,1); 北京邮电大学毕业设计 25 up_layout-addWidget(new QLabel(tr(Name),0,2); up_layout-addWidget(new QLabel(tr(Easy),1,0); up_layout-addWidget(new QLabel(QString(%1).arg(easy_record_time_),1,1); up_layout-addWidget(new QLabel(easy_record_name_),1,2); up_layout-addWidget(new QLabel(tr(Middle),2,0); up_layout-addWidget(new QLabel(QString(%1).arg(middle_record_time_),2,1); up_layout-addWidget(new QLabel(middle_record_name_),2,2); up_layout-addWidget(new QLabel(tr(Hard),3,0); up_layout-addWidget(new QLabel(QString(%1).arg(hard_record_time_),3,1); up_layout-addWidget(new QLabel(hard_record_name_),3,2); QPushButton* recount_button=new QPushButton(tr(recount); QPushButton* close_button=new QPushButton(tr(close); close_button-setDefault(true); connect(recount_button,SIGNAL(clicked(),&dialog,SLOT(accept(); connect(close_button,SIGNAL(clicked(),&dialog,SLOT(reject(); QHBoxLayout* bottom_layout=new QHBoxLayout; bottom_layout-addStretch(); bottom_layout-addWidget(recount_button); bottom_layout-addWidget(close_button); QVBoxLayout* main_layout=new QVBoxLayout(&dialog); main_layout-addLayout(up_layout); main_layout-addLayout(bottom_layout); if(dialog.exec()=QDialog:Accepted) easy_record_time_=middle_record_time_=hard_record_time_=g_no_record_time; easy_record_name_=middle_record_name_=hard_record_name_=g_no_record_name; 4.8 游戏测试及结果 在程序代码基本完成后,经过不断的调试与修改,最后测试本次所设计的扫雷游戏能够正常运行,在基本功能与 Windows 自带的扫雷游戏没有太大差别,没有出现明显的错误和漏洞,但是在一些细节方面仍然需要完善,比如在游戏中可以加入一些声音的提示,在游戏完成和失败的时候可以弹出一些小的 Flash 动画等等。总的来说本次设计在功能上已经基本达到要求,其他细节方面有待以后完善。 北京邮电大学毕业设计 26 总结 毕业设计是本科学习阶段一次非常难得的理论与实际相结合的机会, 通过这次比较完整的一个程序的设计, 我摆脱了单纯的理论知识学习状态, 和实际设计的结合锻炼了我的综合运用所学的专业基础知识, 解决实际问题的能力, 同时也提高我查阅文献资料、对程序整体的把握等其他能力水平,而且通过对整体的掌控,对局部的取舍,以及对细节的斟酌处理,都使我的能力得到了锻炼,经验得到了丰富。这是我们都希望看到的也正是我们进行毕业设计的目的所在。 虽然毕业设计内容繁多,过程繁琐但我的收获却更加丰富。各种组件的运用,各种算法的应用, 各种控件的利用我都是随着设计的不断深入而不断熟悉并逐步掌握的。 和老师以及同学的沟通交流更使我对程序整体的规划与设计有了新的认识也对自己提出了新的要求。 提高是有限的但提高也是全面的, 正是这一次设计让我积累了许多实际经验, 也必然会让我在未来的工作学习中表现出更高的应变能力和理解力。 顺利如期的完成本次毕业设计给了我很大的信心, 但是也让我看到了自己许多不足的地方,学习其实就是一个不断完善的过程,正视自己的不足之处,在以后的工作和学习中不断的弥补这些不足之处, 在以后的生活中也要保持同样的态度, 不断的完善自己。 北京邮电大学毕业设计 27 参考文献 1 谭锋,章伟聪,Visual C+程序设计实训教程,北京:科学出版社,2003.8 2 成洁, 卢紫毅. Linux 窗口程序设计Qt 精彩实例分析M.北京: 清华大学出版社, 2008 3 王超龙,陈志华,Visual C+入门与提高,北京:人民邮电出版社,2002.6 4 肖宏伟,Visual C+实效编程百例,北京:人民邮电出版社,2004.8 5 张建强,张秀梅.扫雷游戏策略初探J. 数学教学,2004(6) :32-33 6 肖永亮 Visual C+游戏编程基础,北京:电子工业出版社,2005.5 7 赵大伟,肖周芳,张艳.从扫雷游戏浅谈一些算法问题J. 科技信息,2008(29):69 8 刘加海,余建军,Visual C+程序设计基础,北京:科学出版社,2003.8 9 (美国)Ivor Horton,Beginning Visual C+2005,清华大学出版社,2007 10 (美国)斯塔勒,游戏编程中的数理应用,红旗出版社,2005.3 11 (美国)Michael Dawson,Beginning C+ Game Programming,人民邮电出版社,2006.1 12 (美国)莫里森,游戏编程入门,人民邮电出版社,2005.9 13 (美国)麦克沙夫瑞,游戏编程全接触,人民邮电出版社,2006.1 北京邮电大学毕业设计 28 致 谢 作者在设计(论文)期间都是在苏小锐老师全面、具体指导下完成进行的。苏老师渊博的学识、敏锐的思维、民主而严谨的作风使学生受益非浅,并终生难忘。苏老师在专业课程的学习、素材的收集、课题的确立、资料的查阅
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸设计 > 任务书类


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!