版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
武汉理工大学武汉理工大学基于Qt的贪吃蛇游戏设计与实现摘要随着社会的发展,人们生活的步调日益加快,越来越多的人加入了全球化的世界。人们不再拘泥于一小块天地,加班、出差成为现代人不可避免的公务。而此时一款可以随时随地娱乐的游戏成了必需品。贪吃蛇简单易行、操作方便、娱乐性极强,很好地满足了玩家的需求。本系统开发平台为Windows7,应用基于Qt跨平台的图形用户界面应用程序框架,程序设计语言采用C++。在系统设计过程中,使用了面向对象的分析、设计方法。完全采用软件工程的方法进行需求分析、总体设计、总体实现和测试。在程序设计中,探讨了用图形框架的方法解决问题,对设计其他图形用户界面具有重要的实际意义。本设计实现了一个简单的贪吃蛇小游戏,该游戏不仅实现了简单的游戏操作功能,还实现了灵活的运作功能,而且具有简洁大方的图文外观。此系统具有良好的界面和必要的交互信息,使操作人员能快捷简单的进行操作,给玩家一个有趣的游戏。关键词Qt;程序设计语言C++;贪吃蛇SnakegamedesignandimplementationbasedonQtAbstractWiththedevelopmentofthesociety,thequickeningpaceoflife,peoplemoreandmorepeoplejoinedtheglobalizationoftheworld.Peoplearenolongerlimitedtoasmallpieceofheavenandearth,overtime,travelinevitablyamodernbusiness.Atatimewhenaanywhereentertainmentgamebecameanecessity.Snakeissimple,easytooperate,entertainmentisextremelystrong,wellmeettherequirementsoftheplayer.ApplicationdevelopmentplatformforWindows7,thissystemisbasedonQtcross-platformGUIapplicationframework,usingc++programminglanguage.Intheprocessofsystemdesign,usingtheobject-orientedanalysisanddesignmethod.Completelyusingthemethodofsoftwareengineeringneedsanalysis,overalldesign,implementationandtestingasawhole.Inprogramming,discussesthemethodofusinggraphicalframeworktosolvetheproblem,thedesignofothergraphicaluserinterface(GUI)hasimportantpracticalsignificance.Thisdesignimplementsasimplesnakegame,thegameisnotonlyrealizethefunctionofsimpleoperation,andrealizethefunctionofflexibleoperation,andhasaconciseandeasybyappearance.Thissystemhasagoodinterfaceandtheinteractionofthenecessaryinformation,allowtheoperatortoquickandeasytooperate,togivetheplayersafungame.KeywordsQt;C++programminglanguage;snake武汉理工大学武汉理工大学目录摘要 iAbstract ii绪论 11嵌入式系统 21.1嵌入式系统 21.2组成 21.2.1硬件层 21.2.2中间层 31.3特点 31.3.1可裁剪性 31.3.2强实时性 41.3.3统一的接口 41.3.4方便 41.3.5强稳定性,弱交互性 41.3.6固化代码 41.3.7适应性 42开发环境及关键技术 52.1Qt 52.2信号和槽机制 52.2.1信号 62.2.2槽函数 62.3布局管理 62.4程序启动画面QSplashScreen类 72.5QTimer类 82.6二维图形的绘制方法 82.7右键菜单 93可行性分析 103.1研究目的 103.2开发的可行性 103.2.1操作可行性 103.2.2技术可行性 103.2.3经济可行性 103.3专业术语 113.4条件基础 113.5实现目标 113.6可行性研究方法 113.7结论意见 114需求分析 124.1研究目的 124.2开发背景 124.3任务概述 134.3.1目标 134.3.2用户特点 134.4需求规定 134.4.1对功能的规定 134.4.2对性能的规定 134.5要解决的问题 134.6提出的要求 144.7可以实现的要求 144.8关键点 144.9嵌入式特性 145贪吃蛇分析 155.1贪吃蛇要求 155.2贪食蛇设计思想 155.3贪吃蛇游戏功能 156贪吃蛇设计 166.1系统的输入输出 166.1.1输入 166.1.2输出 166.1.3蛇的移动 166.2设计基础 166.3数据字典 166.4处理流程 176.5系统的逻辑模型 186.6功能与程序的关系 186.7运行设计 196.7.1运行控制 196.7.2运行时间 197贪吃蛇实现 207.1程序系统的组织结构 207.1.1每个模块的名称、标识符 207.1.2模块之间的关系 217.2程序描述 217.2.1目的和意义 217.2.2特点说明 217.3程序详解 217.3.1构造函数Snake(QWidget*parent) 217.3.2初始化界面函数iniWidget() 227.3.3连接信号函数iniConnect() 247.3.4初始化游戏函数iniGame() 257.3.5贪吃蛇移动函数doMoveSnake() 257.3.6设置是否可以穿墙函数setEnableGoThroughWall() 267.3.7更新得分函数changeScore() 267.3.8更新等级函数changeLevel() 277.3.9判断贪吃蛇是否吃到食物函数isEating() 277.3.10判断游戏是否结束函数isGameOver() 277.3.11绘图事件处理函数paintEvent(QPaintEvent*event) 287.3.12键盘事件处理函数keyPressEvent(QKeyEvent*event) 297.3.13获取随机颜色函数getColor() 307.3.14时间处理函数 307.3.15右键菜单处理函数 317.3.16获取右键菜单槽函数 317.3.17点击右键菜单中Info的槽函数 327.3.18点击右键菜单中About的槽函数 327.3.19程序主函数 328软件测试 348.1测试的意义 348.2测试过程 348.3测试计划 348.4预期的结果 348.5测试结果 35结论 40参考文献 41致谢 42外文原文 43外文翻译 54武汉理工大学武汉理工大学绪论贪吃蛇是世界知名的益智类小游戏,选择这个题目一方面的原因是为了将我们的所学知识加以运用;另一方面,虽然很小就接触这个游戏,但是它的制作方法对我们而言还是很神秘的。我们希望通过自己的所学知识把它剖析开来,通过自己的动手实践,真正的了解它的本质和精髓。希望通过这次实践,我们能从中提高自己的编程能力,并从中学会从零开始分析设计程序。本游戏的开发是基于Qt跨平台的图形用户界面应用程序框架,用的是C++开发语言。C++语言简洁灵活,运算符的数据结构丰富、具有结构化控制语句、程序执行效率高,而且同时具有高级语言与汇编语言的优点,与其它语言相比,C语言具有可以直接访问物理地址的优点,与汇编语言相比又具有良好的可读性的可移植性。总得来说,C++语言的主要特点表现在两个方面,一是尽量兼容C,二是支持面向对象的方法。它操持了C的简洁、高效的接近汇编语言等特点,对C的类型系统进行了改革的扩充,因此C++比C更安全,C++的编译系统能检查出更多的类型错误。另外,由于C语言的广泛使用,因而极大的促进了C++的普及和推广。C++语言最有意义的方面是支持面向对象的特征。虽然与C的兼容使得C++具有双重特点,但他在概念上完全与C不同,更具面向对象的特征。数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。1嵌入式系统1.1嵌入式系统嵌入式系统是一种专用的计算机系统,作为装置或设备的一部分。嵌入式系统是一个控制程序存储在ROM中的嵌入式处理器控制板。事实上,所有带有数字接口的设备,如手表、微波炉、录像机、汽车等,都使用嵌入式系统,有些嵌入式系统还包含操作系统,但大多数嵌入式系统都是由单个程序实现整个控制逻辑。从应用对象上加以定义,嵌入式系统是软件和硬件的综合体,还可以涵盖机械等附属装置。国内普遍认同的嵌入式系统定义为:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。1.2组成一个嵌入式系统装置一般都由嵌入式计算机系统和执行装置组成,嵌入式计算机系统是整个嵌入式系统的核心,由硬件层、中间层、系统软件层和应用软件层组成。执行装置也称为被控对象,它可以接受嵌入式计算机系统发出的控制命令,执行所规定的操作或任务。执行装置可以很简单,如手机上的一个微小型的电机,当手机处于震动接收状态时打开;也可以很复杂,如SONY智能机器狗,上面集成了多个微小型控制电机和多种传感器,从而可以执行各种复杂的动作和感受各种状态信息。1.2.1硬件层硬件层中包含嵌入式微处理器、存储器(SDRAM、ROM、Flash等)、通用设备接口和I/O接口(A/D、D/A、I/O等)。在一片嵌入式处理器基础上添加电源电路、时钟电路和存储器电路,就构成了一个嵌入式核心控制模块。其中操作系统和应用程序都可以固化在ROM中。1.嵌入式微处理器嵌入式系统硬件层的核心是嵌入式微处理器,嵌入式微处理器与通用CPU最大的不同在于嵌入式微处理器大多工作在为特定用户群所专用设计的系统中,它将通用CPU许多由板卡完成的任务集成在芯片内部,从而有利于嵌入式系统在设计时趋于小型化,同时还具有很高的效率和可靠性。2.存储器嵌入式系统需要存储器来存放和执行代码。嵌入式系统的存储器包含Cache、主存和辅助存储器。(1)CacheCache是一种容量小、速度快的存储器阵列它位于主存和嵌入式微处理器内核之间,存放的是最近一段时间微处理器使用最多的程序代码和数据。Cache的主要目标就是:减小存储器(如主存和辅助存储器)给微处理器内核造成的存储器访问瓶颈,使处理速度更快,实时性更强。(2)主存主存是嵌入式微处理器能直接访问的寄存器,用来存放系统和用户的程序及数据。(3)辅助存储器辅助存储器用来存放大数据量的程序代码或信息,它的容量大、但读取速度与主存相比就慢的很多,用来长期保存用户的信息。3.通用设备接口和I/O接口嵌入式系统和外界交互需要一定形式的通用设备接口,如A/D、D/A、I/O等,外设通过和片外其他设备的或传感器的连接来实现微处理器的输入/输出功能。每个外设通常都只有单一的功能,它可以在芯片外也可以内置芯片中。外设的种类很多,可从一个简单的串行通信设备到非常复杂的802.11无线设备。目前嵌入式系统中常用的通用设备接口有A/D(模/数转换接口)、D/A(数/模转换接口),I/O接口有RS-232接口(串行通信接口)、Ethernet(以太网接口)、USB(通用串行总线接口)、音频接口、VGA视频输出接口、I2C(现场总线)、SPI(串行外围设备接口)和IrDA(红外线接口)等。1.2.2中间层硬件层与软件层之间为中间层,也称为硬件抽象层(HardwareAbstractLayer,HAL)或板级支持包(BoardSupportPackage,BSP),它将系统上层软件与底层硬件分离开来,使系统的底层驱动程序与硬件无关,上层软件开发人员无需关心底层硬件的具体情况,根据BSP层提供的接口即可进行开发。该层一般包含相关底层硬件的初始化、数据的输入/输出操作和硬件设备的配置功能。BSP具有以下两个特点。硬件相关性:因为嵌入式实时系统的硬件环境具有应用相关性,而作为上层软件与硬件平台之间的接口,BSP需要为操作系统提供操作和控制具体硬件的方法。操作系统相关性:不同的操作系统具有各自的软件层次结构,因此,不同的操作系统具有特定的硬件接口形式。实际上,BSP是一个介于操作系统和底层硬件之间的软件层次,包括了系统中大部分与硬件联系紧密的软件模块。设计一个完整的BSP需要完成两部分工作:嵌入式系统的硬件初始化以及BSP功能,设计硬件相关的设备驱动。1.3特点1.3.1可裁剪性支持开放性和可伸缩性的体系结构。1.3.2强实时性EOS实时性一般较强,可用于各种设备控制中。1.3.3统一的接口提供设备统一的驱动接口。1.3.4方便操作方便、简单、提供友好的图形GUI和图形界面,追求易学易用。提供强大的网络功能,支持TCP/IP协议及其他协议,提供TCP/UDP/IP/PPP协议支持及统一的MAC访问层接口,为各种移动计算设备预留接口。1.3.5强稳定性,弱交互性嵌入式系统一旦开始运行就不需要用户过多的干预、这就要负责系统管理的EOS具有较强的稳定性。嵌入式操作系统的用户接口一般不提供操作命令,它通过系统的调用命令向用户程序提供服务。1.3.6固化代码在嵌入式系统中,嵌入式操作系统和应用软件被固化在嵌入式系统计算机的ROM中。1.3.7适应性更好的硬件适应性,也就是良好的移植性。2开发环境及关键技术2.1QtQt是诺基亚开发的一个跨平台的C++图形用户界面应用程序框架。它既可以开发GUI程式,也可用于开发非GUI程式,比如控制台工具和服务器。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的,很容易扩展,并且允许真正地组件编程。它具有:(1)优良的跨平台特性(2)面向对象(3)丰富的API(4)大量的开发文档(5)XML支持(6)Webkit引擎的集成,可以实现本地界面与Web内容的无缝集成(7)用户自定义控件(8)方便性(9)国际化(10)高性能的工具(11)优越的绘画功能(12)绘制2D/3D图形功能2.2信号和槽机制信号和槽作为QT的核心机制在QT编程中有着广泛的应用,要精通QT编程就必须对信号和槽有所了解。信号和槽是一种高级接口,应用于对象之间的通信,他是QT的核心特性,也是QT差别于其他工具包的重要地方。信号和槽是QT自行定义的一种通信机制,他独立于标准的C/C++语言,因此要正确的处理信号和槽,必须借助一个称为moc(MetaObjectCompiler的QT工具,该工具是个C++预处理程式,他为高层次的事件处理自动生成所需要的附加代码。在我们所熟知的非常多GUI工具包中,窗口小部件(widget都有一个回调函数用于响应他们能触发的每个动作,这个回调函数通常是个指向某个函数的指针。不过,在QT中信号和槽取代了这些凌乱的函数指针,使得我们编写这些通信程式更为简洁明了。信号和槽能携带任意数量和任意类型的参数,他们是类型完全安全的,不会像回调函数那样产生coredumps所有从QObject或其子类(例如QWidget)派生的类都能够包含信号和槽。当对象改动其状态时,信号就由该对象发射(emit)出去,这就是对象所要做的全部事情,他不知道另一端是谁在接收这个信号。这就是真正的消息封装,他确保对象被当作一个真正的软件组件来使用。槽用于接收信号,但他们是普通的对象成员函数。一个槽并不知道是否有所有信号和自己相连接。而且,对象并不了解具体的通信机制。你能将非常多信号和单个的槽进行连接,也能将单个的信号和非常多的槽进行连接,甚至于将一个信号和另外一个信号相连接也是可能的,这时无论第一个信号什么时候发射系统都将即时发射第二个信号。总之,信号和槽构造了一个强大的部件编程机制。2.2.1信号当某个信号对其客户或所有者发生的内部状态发生改动,信号被一个对象发射。只有定义过这个信号的类及其派生类能够发射这个信号。当一个信号被发射时,和其相关联的槽将被即时执行,就象一个正常的函数调用相同。信号-槽机制完全独立于所有GUI事件循环。只有当所有的槽返回以后发射函数(emit)才返回。如果存在多个槽和某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地执行,不过他们执行的顺序将会是随机的、不确定的,我们不能人为地指定哪个先执行、哪个后执行。2.2.2槽函数槽是普通的C++成员函数,能被正常调用,他们唯一的特别性就是非常多信号能和其相关联。当和其关联的信号被发射时,这个槽就会被调用。槽能有参数,但槽的参数不能有缺省值。既然槽是普通的成员函数,因此和其他的函数相同,他们也有存取权限。槽的存取权限决定了谁能够和其相关联。同普通的C++成员函数相同,槽函数也分为三种类型,即publicslots、privateslots和protectedslots。publicslots:在这个区内声明的槽意味着所有对象都可将信号和之相连接。这对于组件编程非常有用,你能创建彼此互不了解的对象,将他们的信号和槽进行连接以便信息能够正确的传递。protectedslots:在这个区内声明的槽意味着当前类及其子类能将信号和之相连接。这适用于那些槽,他们是类实现的一部分,不过其界面接口却面向外部。privateslots:在这个区内声明的槽意味着只有类自己能将信号和之相连接。这适用于联系非常紧密的类。2.3布局管理窗体上的所有的控件必须有一个合适的尺寸和位置。Qt提供了一些类负责排列窗体上的控件,主要有:QHBoxLayout,QVBoxLayout,QGridLayout,QStackLayout。他们之间的继承关系如图2-1所示。图2-1布局管理继承关系图Qt中有三种方式对窗体上的控件进行布局管理:绝对位置定位(absolutepositioning),手工布局(manuallayout),布局管理器(layoutmanagers)。在QT中,Layout和Widget是相对独立的类,但是Layout本身单独存在并没有意义,需要和Widget配合使用。而Widget本身不负责子控件的布局管理。你可以认为,Layout类其实只是一组预先撰写好的代码,在父控件尺寸变化时,根据预设参数和子控件的各种Geometryhint,管理控件的位置和尺寸。Layout首先是要通过QWidget::setLayout函数,将一个QLayout类设置为控件的布局管理器。这一步实际也将这个控件设置为QLayout类的父控件。而后,通常通过QLayout::addWidget()等函数,将widget添加到Layout类的布局管理体系中。但是,Layout本身并不是Widget的父控件,因为QWidget类的父控件只能是QWidget类,所以Layout将其管理的子控件的父控件重定向为自己的父控件。另外,因为QWidget类本身并不是一个QLayoutItem,而Qlayout的管理又是以QLayoutItem为单位。所以,在addWidget的操作中,QLayout还会创建一个QLayoutItem的子类QWidgetItem类来对应的包装代理添加进来的子控件。QWidgetItem对象最终会将QLayout布局管理体系中的布局参数信息装换、设置到它所代理的QWidget对象上在QT下进行界面设计,可以使用水平、垂直和Grid布局管理器来进行。水平布局管理器可以把它所管理的部件以水平的顺序依次排开。垂直管理器类似,它可以把它所管理的部件以垂直的顺序依次排开。Grid布局管理器可以以网格的形式,将它所管理的部件以一定的矩阵形式排列。在QT下做界面设计的时候,其实无非就是利用上面三种布局管理器来将部件进行分类和排列。2.4程序启动画面QSplashScreen类当程序的初始化工作比较多,程序可能启动较长时间后,窗口才会显示出来,用户没准会抱怨程序响应的慢。为了改善用户体验,最好在程序初始化这段时间显示logo,或者其他信息提示用户程序已启动。QT提供了QSplashScreen类,其使用方法比较简单,下面的例子就是,当程序运行到splash.show();时,logo.gif就会显示出来,当dialog的初始化完成,运行到splash.finish(&dialog);时,主窗口显示出来,并且启动画面隐藏。当程序启动慢的时候,该画面就会停留一会,也可以在图片上显示一下程序启动的加载信息,、但是如果程序启动很快的话,启动图片就会一闪而过,其实启动画面也出现了的,只是出现的时间比较短,如果想让程序启动之前画面多停留一下,可以添加一个延时器。2.5QTimer类QTimer类提供了定时器信号和单触发定时器。它在内部使用定时器事件来提供更通用的定时器。QTimer很容易使用:创建QTimer,使用start()来开始并且把它的timeout()连接到适当的槽。当这段时间过去了,它将会发射timeout()信号。注意当QTimer的父对象被销毁时,它也会被自动销毁。你也可以使用静态的singleShot()函数来创建单触发定时器。作为一个特殊情况,一旦窗口系统事件队列中的所有事件都已经被处理完,一个定时为0的QTimer就会到时间了。这也可以用来当提供迅速的用户界面时来做比较繁重的工作。2.6二维图形的绘制方法Qt的二维图形引擎是基于QPainter类的,QPainter既可以绘制几何图形,也可以绘制像素映射、图像和文字。此外,QPainter也支持一些高级特性,例如反走样(针对文字和图形边缘)、像素混合、渐变填充和矢量路径等,QPainter也支持线性变换,例如平移、旋转、错切和缩放。QPainter可以画在“绘图设备”上,例如:QWidget、QPixmap、QIamge或者QSvgGenerator。QPainter也可以与QPrinter一起使用来打印文件盒创建PDF文档。这意味着通常可以用相同的代码在屏幕上显示数据,也可以生成打印形式的报告。如果要在绘图设备(一般为窗口部件)上绘图,只需创建一个QPainter,再将指针传到该设备中。使用QPainter的draw...()函数,可以绘制各种各样的形状。绘制效果取决于QPainter的设置,一些是从设备中取得的,然而有些被初始化成默认值。三个主要设置是画笔、画刷、字体:画笔:用来画线和边缘。它包含颜色、宽度、线性、拐点风格以及连线风格。画刷:用来填充几何图形的图案。它一般由颜色和风格组成,但同时也可以是纹理(一个不断重复的图像)或者是一个渐变。字体:用来绘制文字。字体有很多属性,包括字体族和磅值大小。可以随时调用QPen、QBrush或者QFont对象的setPen()、setBrush()和setFont()来修改这些设置。draw...,见明知义。绘制点drawPoint()、绘制直线drawLine()、绘制折线drawPolyLine()、绘制多点drawPoints()、绘制多直线drawLines()、绘制矩形区域drawRect()、绘制圆角区域drawRoundRect()、绘制椭圆drawEllipse()、绘制背景图片drawPixmap()等!2.7右键菜单QWidget及其子类都可有右键菜单,因为QWidget有以下两个与右键菜单有关的函数:Qt::ContextMenuPolicycontextMenuPolicy()constvoidsetContextMenuPolicy(Qt::ContextMenuPolicypolicy)使用方式如下:1)默认是Qt::DefaultContextMenu。它是利用右键菜单事件contextMenuEvent()来处理(whichmeansthecontextMenuEvent()handleriscalled)。就是要重写contextMenuEvent(QContextMenuEvent*event)函数。2)使用Qt::CustomContextMenu。它是发出QWidget::customContextMenuRequested信号,注意仅仅只是发信号,意味着要自己写显示右键菜单的slot。这个信号是QWidget唯一与右键菜单有关的信号(也是自有的唯一信号),同时也是很容易被忽略的signal:voidcustomContextMenuRequested(constQPoint&pos)该信号的发出条件是:用户请求contextMenu(常规就是鼠标右击啦)且同时被击的widget其contextMenuPolicy又是Qt::CustomContextMenu。注意:pos是该widget接收右键菜单事件的位置,一般是在该部件的坐标系中。但是对于QAbstratScrollArea及其子类例外,是对应着其视口viewport()的坐标系。如常用的QTableView、QHeaderView就是QAbstratScrollArea的子类。3)使用Qt::ActionsContextMenu。把部件的所有action即QWidget::actions()作为contextmenu显示出来。使用Qt::ActionsContextMenu比较简洁,但是如果需要根据当前菜单弹出的位置来定义不同菜单,或者像上个例子,在表格(QTableView类型)表头显示右键菜单时,我需要知道是哪一列表头被点击,从而在后来调用sort_ascend()排序函数时能够根据不同列进行不同排序策略,那么Qt::ActionsContextMenu就做不到了。这种需要捕捉弹出位置的情况只好用Qt::ActionsContextMenu了,customContextMenuRequested(constQPoint&pos)信号返回点击位置pos(在表头视口坐标系中位置),然后表头即可调用logicalIndexAt(pos)函数得到被点击section对应的index即被点击部分的列号,然后存下来可供后面action激活的排序槽使用。3可行性分析3.1研究目的可行性研究的目的是为了对问题进行研究,以最小的代价在最短的时间内确定问题是否可解。该阶段通过对系统目标的初步调研和分析,提出可行性方案并进行论证。我们在这里主要从操作可行性、技术可行性和经济可行性等方面进行分析。3.2开发的可行性目前,以计算机技术和网络技术为核心的现代网络技术已在现实生活和生产中得以广泛的使用,休闲类网络游戏集趣味性,娱乐性,互动性和益智性于一体,已经成为多数人群的休闲方式。电脑游戏经过短短30年的发展,已经成为影响公众生活,改变公众娱乐方式的重要产业。过去,人们主要是借助电影、电视、音乐等方式来娱乐。而今天,以游戏为代表的电子娱乐正在成为主流娱乐方式。游戏也正在迅速成长为一个庞大的产业。贪吃蛇是家喻户晓的益智类小游戏,选择这个题目一是为了将自己的所学知识加以运用,二是一直以来贪吃蛇这个游戏就深深地吸引着我,它的制作方法对于以前的我而言都是很神秘的。我希望通过自己的所学知识把它剖析开来,真真正正的了解它的本质和精髓。虽然我的编程能力不是很强,但是我有信心,在这次学习中我将从实践和实际的项目中提高自己的编程能力。因此我选定了这个题目。3.2.1操作可行性贪食蛇是一个简单、容易和休闲的小游戏,其操作简单,在很多的平台都可以使用,例如:Win7,WindowXP等。用户使用此游戏也很简单,游戏主要使用上下左右控制贪食蛇吞食界面上出现的食物,简单容易上手,同时能锻炼用户的操作及灵敏。3.2.2技术可行性贪食蛇游戏是基于QT平台的一款小游戏,透过QT平台编写从而实现,使用的语言主要以C++为主,在技术方面没问题。3.2.3经济可行性贪食蛇主要是通过QT软件编写,在自己电脑上即可编写实现。可以说在经济方面不需要投入很多,甚至可以说是零投资,而随着社会的进步,这样的小游戏将会普及,我们只需要投入较小的成本,就可以得到很多的回报。3.3专业术语Qt:是一个跨平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所有功能。Qt很容易扩展,并且允许真正地组件编程。QtCreator:一个用于Qt开发的轻量级跨平台集成开发环境。QtCreator可带来两大关键益处:提供首个专为支持跨平台开发而设计的集成开发环境(IDE),并确保首次接触Qt框架的开发人员能迅速上手和操作。即使不开发Qt应用程序,QtCreator也是一个简单易用且功能强大的IDE。C++:是在C语言的基础上开发的一种集面向对象编程、泛型编程和过程化编程于一体的编程语言。缩写词:GUI:图形用户界面3.4条件基础硬件条件:HP6450b运行环境:qt-creator-win-opensource-2.4.1qt-win-opensource-4.8.1-mingw投入运行时间:待定3.5实现目标软件实现后可以让广大用户在休息时享受轻松愉快的游戏时间,提高生活质量,让用户劳逸结合,提升工作和学习的效率,对生活报以积极地心态。3.6可行性研究方法通过对周边的企业职员和大学生进行问卷调查,发现大家在闲暇时间大都会选择玩游戏来打发时间,而且偏向简单灵活的小游戏。3.7结论意见由于投资效益比远大于100%,技术、经济、操作都有可行性,可以进行开发。4需求分析4.1研究目的需求分析是系统开发必要环节,也是重中之重。作为该过程的结果,需求规格说明书是对系统的功能和行为完整的描述。系统设计将来自于需求分析的抽象规格说明转变为面向真实世界的设计。一旦构建完成,该系统就会投入使用,同时会不可避免地产生更多的新需求。同时,需求过程与分析活动之间有相当程度的重叠,分析建模对于设定工作的范围和其他一些事来说是必要的,所以我们利用分析模型来描述需求过程,随着开发工作的继续,分析活动在工作中占的比例将变得越来越大,直到所有需求都已知。本贪吃蛇游戏软件在可行性研究的基础上,是为了进一步明确贪吃蛇游戏的软件需求,以便安排项目规划与进度,组织软件开发与测试,撰写本文档。此需求分析说明书对贪吃蛇游戏软件做了全面细致的用户需求分析,明确所要开发的游戏软件应该具有的功能,并在此基础上进一步提出概要设计说明书和完成后续和开发工作。4.2开发背景随着科技的发展,现在电脑功能已不仅仅是简单地工作、学习了,更多的电脑用户希望在工作学习之余通过方便小型的游戏休闲娱乐。因此,为了迎合众多用户的需求并适应现在电脑的系统,我们开发出一套适合各阶层人士的具有很强娱乐性和交互性的贪吃蛇小游戏。虽然现在市面上存在着各种各样的游戏版本,可是贪吃蛇其市场还是相当大的。因为它的特殊在于它能吸引人更深入,爱不释手。随着游戏速度的不断加快,其刺激性也更强。可以说该游戏的优势在于它的简单易行,可以很快很顺利的运行。对于在外忙碌的人,不可能花费大量时间在娱乐上,而在工作闲暇之余随手就能打开的贪吃蛇小游戏正好迎合了他们的需求。贪吃蛇是家喻户晓的益智类小游戏,选择这个题目一是为了将自己的所学知识加以运用,二是一直以来贪吃蛇这个游戏就深深地吸引着我,它的制作方法对于以前的我而言都是很神秘的。我希望通过自己的所学知识把它剖析开来,真真正正的了解它的本质和精髓。虽然我的编程能力不是很强,但是我有信心,在这次学习中我将从实践和实际的项目中提高自己的编程能力。因此我选定了这个题目。4.3任务概述4.3.1目标在如今社会,人们的工作学习压力逐渐增大,生活节奏逐渐加快,大多数人没有足够的时间去休闲娱乐,放松自己。这款小型的贪吃蛇游戏,可以让我们随时随地的享受游戏给我们带来的快乐与放松,让我们从繁重的日常生活中解脱出来。游戏的主界面应该力求简明美观,赏心悦目,以提高玩家对游戏的兴趣。游戏的控制应该做到易懂、易操作,以给玩家一个很好的游戏环境。4.3.2用户特点由于本程序简单易操作,交互性好,对用户没有什么特别要求。一般用户经过几分钟练习就可以熟练掌握本游戏的规则。4.4需求规定4.4.1对功能的规定本设计所开发的是基于C++的一个贪吃蛇游戏软件,主要实现游戏的开始、暂停、退出功能,分为:游戏主界面模块、游戏控制模块两个模块。游戏主界面模块:主要包括游戏图形区域界面、难度设置按钮、游戏时间显示、分数显示、难度提升、右键菜单等功能。游戏控制模块:主要完成游戏的开始、暂停、方向控制等功能。4.4.2对性能的规定本游戏在设计方面本着方便、实用及娱乐性高的宗旨,在对界面进行设计的过程中,始终坚持清晰明了,在性能方面能够实现效率高,不易出错等优点。游戏主界面应该力求美观,赏心悦目。游戏控制模块应做到易懂、易操作,而且准确率高,不易出错。4.5要解决的问题(1)可以用上、下、左、右键游戏控制蛇的运动方向,使之向着有食物的方向运动,并吞吃食物使身体增长,如果蛇在移动过程中,撞到墙壁或身体交叉蛇头撞到自己的身体游戏结束。根据贪吃蛇的进食数量调节蛇的运动速度,提升难度。(2)当游戏刚开始的时候,先应该产生一条蛇和随机产生一个食物。当按键的时候,蛇就开始移动,按照按键的方向运动。(3)蛇可以运动,随着难易程度的不同,蛇的速度也不同;在界面里可以随机产生一个食物,但应该注意不能和蛇身体一致,然后当蛇移动并吃掉这个食物(覆盖),蛇的身体应该相应地增加,同时界面中显示分数一栏应该相应地增加分值;当蛇在移动的过程中头部碰到墙壁,游戏结束。4.6提出的要求(1)按键的时候可以控制蛇身按照设置的方向移动(2)当选择游戏的等级程度提升时,蛇的运动速度应该也是加快的(3)当游戏开始时候,应该有一个初始化,设置蛇身,食物等(4)当游戏结束时,会有相应的处理,比如提示4.7可以实现的要求(1)简单友好的界面:基本界面,蛇,食物(2)蛇的移动和控制:通过上下左右控制蛇的行进方向(3)对蛇的状态的监听,及显示吃到食物蛇的长度会增加(4)蛇的状态的变化4.8关键点(1)蛇的运动算法实现过程(2)在监听蛇的状态的方法实现并处理4.9嵌入式特性为了实现此软件的广泛使用,设计贪吃蛇游戏软件可以嵌入在硬件中使用,既可以嵌入在电脑中,也可以嵌入在移动设备中,让用户不论处于何地都可以方便的使用。特此说明,此软件也可放在Ubuntu环境下运行。5贪吃蛇分析5.1贪吃蛇要求贪食蛇游戏软件在windowXP和win7系统上为玩家提供贪吃蛇游戏的基本功能。玩家可以通过键盘上下左右控制游戏区中贪吃蛇的行动,当蛇头碰到食物(和食物接触)后增加蛇身的长度,当蛇碰到自己的身体或碰到墙壁时游戏结束。5.2贪食蛇设计思想红色背景区域为蛇的运动区域,边框表示围墙,蓝色矩形代表蛇,变色小方块代表食物,程序关键在于表示蛇的图形及蛇的移动。用一个小矩形块表示蛇的一节身体,身体每长一节,在身体最后增加一个矩形块。移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇尾新位置开始画出蛇,长度为保存蛇每个节点信息的数组的长度。食物的出现是先确定一组随机数,再填充方格,食物的消失是由于使用了更新函数,当吃掉食物后就不再重画本次食物,而是生成一组新的随机数,画新的食物。当设置游戏难度为不可穿墙时,蛇头的位置坐标和墙的坐标或者自己身体的某个节点的坐标相同时,蛇就死掉了,游戏结束。当设置游戏难度为可以穿墙时,蛇头的位置坐标和自己身体的某个节点的坐标相同时,蛇就死掉了,游戏结束。5.3贪吃蛇游戏功能游戏是运行在图形模式下的,所以第一步一定是初始化图形模式,接着要有开始的界面,就像书有封面一样,我设置了一个游戏的标题画面。标题画面以后,还要为游戏的运行部分作初始化,包括绘制游戏运行时的背景,对游戏某些重要变量的初始化。贪吃蛇的要求为:一条蛇在封密的围墙内,在围墙内随机出现一个食物。通过按键盘上的四个光标控键控制蛇向上下左右四个方向移动,蛇头撞到食物,则表示食物被蛇吃掉,这时蛇的身体长一节,同时计10分,接着又出现食物,等待被蛇吃掉。如果蛇在移动过程中,撞到墙壁或蛇头撞到自己身体游戏结束。这个程序的关键点是表示蛇的图形以及蛇的移动。可以用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用一节表示。移动时必须从蛇头开始,所以蛇不能向相反移动,也就是蛇尾不能改作蛇头。如果不按任何键,蛇自行在当前方向上前移,当游戏者按了有效的方向键后,蛇头朝指定的方向移动,一步移动一节身体,所以当按了有效的方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇。这时,由于没有清屏的原因,原来蛇的位置和新蛇的位置差一个单位,所以看起来蛇会多一节身体,应将蛇的最后一节用背景覆盖。食物的出现和消失也可以用画矩形块和覆盖矩形块方法实现。6贪吃蛇设计6.1系统的输入输出6.1.1输入在该程序设计中几乎没有什么从键盘你输入的数据,所有的程序所运用的数据都是有程序本身提供的,由用户来选择,程序将根据用户的选择来处理相应的数据,如在玩家改变游戏设置的时候,程序会根据玩家选择的设置来改变围墙的可穿性。6.1.2输出在该程序中,输出的数据有玩家单局游戏的总时间,升到的等级,蛇吃到食物的个数,以及目前的得分,玩家可以通过点击右键打开菜单,了解一些相关信息,当玩家控制的蛇死亡后要输出一个消息GAMEOVER表示蛇的死亡。6.1.3蛇的移动蛇的移动主要通过改变蛇的坐标位置,然后通过重绘蛇的位置,这样就实现了蛇的移动,具体的为:从构成蛇身的所有节点的最后一点开始,依次将前一个节点的坐标赋值为后一个节点,这样就实现了蛇身的移动。接下来是蛇头的移动,蛇头的移动要根据蛇的运动方向来做出相应的移动。6.2设计基础在设计中用到了节、数组、坐标系来定义一些重要内容,以便于程序的编写。以下进行简述(1)节一条蛇可以看成由许多正方形的“小格子”拼凑成,称作节。节是蛇身上最小的单位。(2)数组用来保存每一段的状态,数组的元素单位是节。且链表的第一个元素表示蛇的尾部。(3)坐标系以左上角那点为(0,0),向右则x递增,向下则y递增。6.3数据字典设计中用到的数据的名称、类型、含义如表6-1所示。表6-1数据的类型及含义名称类型含义SnakeBody[Max][2]int蛇头在数组中的位置header_Indexchar蛇的身体坐标信息tail_Indexint蛇尾在数组中的位置eat_Xint出现食物的位置的横坐标eat_Yint出现食物的位置的纵坐标levelint游戏的等级speedint蛇的运行速度scoreint出现食物的位置的横坐标eatNumint贪吃蛇吃到食物的数量map_rowint贪吃蛇运动范围的长度map_colint贪吃蛇运动范围的宽度Dirint当前贪吃蛇移动的方向stepint贪吃蛇移动的步长tempxint蛇头下一个临时存放位置的横坐标tempyint蛇头下一个临时存放位置的纵坐标CanGoThroughWallbool判断贪吃蛇是否能够穿墙hasMovedbool用于避免两次方向键之间间隔太小造成的错误6.4处理流程图6-1处理流程图根据要求的贪吃蛇结构设计出相应的贪吃蛇处理流程图(如图6-1所示)。处理流程图基本概述了整个游戏的流程,首先打开游戏,弹出游戏的标题画面,等待游戏的加载,之后进入游戏运行界面,在此界面点击右键会出现游戏帮助菜单、游戏关于菜单。在主界面上有设置游戏难度按钮,可以更改游戏难度,游戏开始后,可以通过方向键控制贪吃蛇的运动方向,也可以选择P键使游戏暂停。当你控制的贪吃蛇接触到蛇的自身身体时或墙壁时,游戏结束。流程图的主要作用是可以很直观的了解到游戏的功能,同时,在绘制好流程图后,在后面的编写代码时也比较明确。6.5系统的逻辑模型系统的逻辑模型如图6-2所示图6-2系统逻辑模型6.6功能与程序的关系1.游戏界面主框架主要包括贪吃蛇运动界面,信息显示界面。1)贪吃蛇运动界面主要包括:食物的随机出现位置,蛇的移动2)信息显示界面包括:得分显示,等级显示,难度显示,游戏难度设置,游戏说明,退出2.与程序的关系贪吃蛇运动界面贪吃蛇的移动及吃到食物的发生,向信息显示界面发出信号,刷新得分,并在达到一定限额提升等级。信息显示界面中的按钮点击事件,发出信号,设置贪吃蛇运动界面的限制性条件。6.7运行设计6.7.1运行控制由用户选择游戏控制类别:开始、暂停、继续、游戏设置、退出,不可以手动控制游戏级别,只能在达到一定界限,自动增加难度,这样有助于循序渐进。6.7.2运行时间蛇移动方法及食物的颜色变化长期占用资源,改变方向、吃到食物、产生新食物都是瞬发动作,只是瞬间占用系统资源。7贪吃蛇实现7.1程序系统的组织结构7.1.1每个模块的名称、标识符explicitSnake(QWidget*parent=0);ClassSnake的构造函数,设置QWidget的初始化信息,贪吃蛇运动区域的大小,调用其他初始化函数。~Snake();ClassSnake的析构函数,用于释放一些空间。voidiniWidget();用于添加各类控件,并设置控件的属性。voidiniConnect();用于连接信号,使能够在收到信号时,转到相应的函数处理。boolisEating();判断贪吃蛇是否吃到食物。boolisGameOver();通过之前的设置信息,判断游戏是否结束。voidiniGame();用于初始化游戏,设置初始速度、等级、已吃食物数量及定时器等,并随机得到贪吃蛇和食物的初始坐标。voidchangeScore();更新并显示得分。voidchangeLevel();更新并显示等级,每增加10个食物,升一级,并提高速度。QColorgetColor();获取随机颜色。voidpaintEvent(QPaintEvent*);绘图事件,绘制贪吃蛇、食物。voidkeyPressEvent(QKeyEvent*event);键盘处理事件,捕获按键信号,并作出相应的处理。voiddoMoveSnake();实现蛇在当前方向下向前移动一步,并调用判断是否吃到食物函数、判断是否死亡函数。voidsetEnableGoThroughWall();设置是否可穿墙函数,将结果显示在信息显示界面。voidtimerEvent(QTimerEvent*);时间处理函数,用于实现显示游戏的时间。voidInfoChange();操作信息显示函数,实现弹出对话框,提示操作说明。voidAboutChange();游戏相关信息显示函数,实现弹出对话框,提示游戏相关信息。7.1.2模块之间的关系此程序中各个模块之间的关系如图7-1所示图7-1模块关系图7.2程序描述7.2.1目的和意义该部分以窗体上的按钮或键盘上的快捷键为用户提供友好的控制手段。为工作量繁大的用户提供一个简单而有趣的小游戏。7.2.2特点说明程序交互性好,操作性强。易操作。简单而有趣。功能全面,如:开始新游戏、暂停、继续、设置难度、查看游戏帮助、退出游戏。7.3程序详解7.3.1构造函数Snake(QWidget*parent)Snake::Snake(QWidget*parent):QWidget(parent),ui(newUi::Snake),step(15) {ui->setupUi(this);setFocusPolicy(Qt::StrongFocus);//如何让QWidgt接收键盘事件和点击事件setFixedSize(630,340);//设置QWidgt大小qsrand(QTime(0,0,0).msecsTo(QTime::currentTime())); //取时间作为产生随机数的种子map_row=Height/step;//设置贪吃蛇活动区域大小map_col=Width/step;CanGoThroughWall=false;//默认初始化难度设置为禁止穿墙//初始化时分秒为0sec=0;min=0;hour=0;iniWidget();iniConnect();iniGame();}通过这个函数实现了QWidget的简单属性设置,包括QWidget的聚焦及大小,初始化了贪吃蛇的运动范围,默认设置游戏难度为禁止穿墙。取用时间作为产生随机数的种子,用于之后贪吃蛇的蛇身初始化,食物的初始化。初始化游戏时间为00:00:00。通过调用iniWidget()函数初始化了Widget中的控件信息等,通过调用iniConnect()函数初始化了连接信号,通过调用iniGame()函数初始化了游戏的基本信息。7.3.2初始化界面函数iniWidget()voidSnake::iniWidget(){timeNumber=newQLabel("00:00:00");timeNumber->setFont(QFont("Times",15));timeLabel=newQLabel(this);timeLabel->setFont(QFont("Times",15));timeLabel->setText("Time:");scoreNumber=newQLCDNumber(5);//得分显示器LCD数字显示框scoreNumber->setSegmentStyle(QLCDNumber::Flat);//设置显示方式scoreNumber->setParent(this);//scoreNumber->setGeometry(370,30,70,50);scoreLabel=newQLabel(this);//分数标签scoreLabel->setFont(QFont("Times",15));//设置字体scoreLabel->setText("Score:");//设置显示内容//scoreLabel->setGeometry(320,40,30,30);//设置大小levelNumber=newQLCDNumber(5);//等级显示器levelNumber->setSegmentStyle(QLCDNumber::Flat);levelNumber->setParent(this);//levelNumber->setGeometry(370,90,70,50);levelLabel=newQLabel(this);//等级标签levelLabel->setFont(QFont("Times",15));levelLabel->setText("Level:");//levelLabel->setGeometry(320,100,30,30);setlabel=newQLabel(this);//难度显示器setlabel->setFrameStyle(QFrame::Sunken|QFrame::Panel);//setlabel->setGeometry(325,150,115,90);setlabel->setAlignment(Qt::AlignCenter);//setlabel->setFont(QFont("Times",18,QFont::Black));setlabel->setFont(QFont("Times",15,QFont::Black));setlabel->setText(tr("游戏难度:禁止穿墙"));QPalettepe1;//显示setlabel字体颜色为绿色
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 网店美工试题库及参考答案
- 吉林省长春市宽城区2023-2024学年七年级上学期期末考试数学试卷(含答案)
- 养老院老人心理咨询师激励制度
- 养老院老人康复理疗服务质量管理制度
- 《付出总有收获》课件
- 《VFP系统准备》课件
- 房屋预售合同(2篇)
- 2024年特色农产品种植配套农机采购合同2篇
- 《生命的延续》课件
- 2025年黄山b2货运资格证多少道题
- 误差累积效应及应对机制
- 国家开放大学《建筑工程计量与计价》期末考试题库参考答案
- 薪酬管理体系的内外部公平性
- 山东省青岛市市北区2023-2024学年四年级上学期期末科学试卷
- 运动员年终总结-汗水铸就荣耀之路
- illustrator练习试题附答案
- 《SolidWorks建模实例教程》第6章 工程图及实例
- 华为公司管理决策流程
- 《水力学》简答题和名词解释题总结
- 会议服务策划方案(12篇)
- 车辆理赔权益转让协议
评论
0/150
提交评论