毕业论文-基于QT的俄罗斯方块游戏设计与实现_第1页
毕业论文-基于QT的俄罗斯方块游戏设计与实现_第2页
毕业论文-基于QT的俄罗斯方块游戏设计与实现_第3页
毕业论文-基于QT的俄罗斯方块游戏设计与实现_第4页
毕业论文-基于QT的俄罗斯方块游戏设计与实现_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

太原理工大学毕业设计(论文)用纸1绪论1.1开发目的在现金电子信息高速发展的时代,电子游戏已深入人们的日常生活,由于经典有趣,因而得到了广泛的流行,成为老少皆宜的娱乐方式。俄罗斯方块是一款风靡全球的游戏,最初是由苏联人制作的,规则简单,容易上手且游戏全过程变化无穷,可以让玩家充分感受游戏中的乐趣。俄罗斯方块游戏可以说是随计算机的发展而发展,并不断推陈出新演变出各种类似游戏,深受广大玩家喜爱。这个游戏有的简单,有的复杂,但其根本原理是一样的都是对运动的方块进行组合,来训练玩家的反应能力。谈到游戏软件,大多数人都认为其神妙莫测,高不可及。而一般游戏软件也确实具有很高的技术难度,随着开发工具及软件开发方法学的不断发展,动手开发游戏也不是十分困难的。俄罗斯方块游游戏软件不计其数,网上就有好多关于实现的复杂算法和设计,其难度让一般初学者望而却步。而俄罗斯方块是编程的入门项目,它可以检验编辑人员的知识熟练程度。在游戏设计方面,俄罗斯方块游戏的设计工作既复杂又富有挑战性,它包含的内容多,涉及的知识广泛,与图形界面联系比较大。。游戏是一种新兴的媒体,是一种新的设计领域,也是一种新的艺术形式。同时开发电脑游戏可以提高学生研究和学习的兴趣,培养他们通过互联网收集和获得信息、分析整理信息、撰写报告论文等能力。俄罗斯方块的开发无疑是给电脑游戏的增加了色彩,拓宽了电脑游戏的平台,给人们带来乐趣。1.2俄罗斯方块游戏的现状小方块的魅力经久不衰。截至2009年,俄罗斯方块发售了1.25亿份,受到50多个国家和地区的玩家喜爱,有超过50种语言的版本,运行在几十种游戏平台上,从掌机、街机、个人电脑,到手机和PDA。美国蓝色行星软件公司总裁亨克·罗杰斯说,移动设备已经成为俄罗斯方块新的主要平台,该领域的发售量已超过7500万份,并且还在快速增长。在俄罗斯方块网络版的北美和欧洲官方网站上,每天超过100万人次玩这个游戏。俄罗斯方块成功的奥妙在哪里?它的创造者帕基特诺夫认为,可能在于这个游戏非常简单,而且拼图的过程有“从混乱中寻找秩序”的成就感。罗杰斯则说,俄罗斯方块是一个建设性的游戏,这一点与中国的围棋相似,“国际象棋就是杀杀杀,围棋则重视构建领地,是建设性的,俄罗斯方块也是”。25年过去了,电脑业和电子游戏业都发生了巨大变化,拥有华丽画面、震撼音效和丰富剧情的大型游戏包括网络游戏纷纷出现,开辟并占据了新的市场。俄罗斯方块这样的游戏还有前途吗?帕基特诺夫认为还很有前途。他说,俄罗斯方块是一个休闲游戏,它面对的是那些没有精力或兴趣玩大型游戏的玩家,这些人需要一类简单好玩的游戏,拿起来就能进入状态,在忙碌的生活中寻求片刻放松。帕基特诺夫表示,将对俄罗斯方块进行改进,使人们能够更容易从中获得休闲乐趣。罗杰斯说,今后的努力方向包括发展俄罗斯方块的竞技性,开发能够适应玩家特点的“智能”俄罗斯方块,并使来自世界各地、说不同语言的人们能够一起娱乐,通过这个游戏寻求共同点。对于中国市场,现在俄罗斯方块已集成到即时通讯软件中国腾讯QQ中,即为火拼俄罗斯。另外,联众世界也有单机版的俄罗斯方块和网络版的俄罗斯方块。由此看来,俄罗斯方块经典还将继续。1.3研究的主要内容俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。这款游戏最初是由苏联的游戏制作人AlexPajitnov制作的,它看似简单但却变化无穷,令人上瘾。相信大多数用户都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时代。从游戏的基本玩法出发,主要就是俄罗斯方块的形状和旋转,我在设计中在一个图片框中构造了一些的网状小块,由这些小块组合成新的形状,每四个小块连接在一起就可以构造出一种造型,因此我总共设计了7种造型,每种造型又可以通过旋转而变化出24种形状,利用随机函数在一个预览窗体中提前展示形状供用户参考,在游戏窗体中用户就可以使用键盘的方向键来控制方块的运动,然后对每一行进行判断,如果有某行的方块是满的,则消除这行的方块,并且使上面的方块自由下落,最后就可以得出用户的分数。1.4研究的意义那么研究基于Qt的俄罗斯方块游戏有什么意义呢?虽然目前俄罗斯方块游戏已经有各种语言的不同版本,并且已经将其搬上了网络的平台,单人、双人单机对战和双人网络对战等各种模式均已被大众熟知。由于开发平台不统一,造成软件的管理和使用极不方便,并且容易受到软硬件环境更新的影响,限制了这些新技术在科研生产中发挥更好的作用.如果舍弃原有软件而重新开发,将会耗费大量的人力和资金,而且浪费了许多成熟的软件成果。而Qt在源代码级上实现了跨平台特性,极大的支持了跨平台通用软件的开发。Qt可以用同一个源程序在不同平台上编译链接,生成目标代码,并取得相同的运行效果,称为“一次编写,随处编译”,利用这种方法充分实现了程序的跨平台运行。这种基于源代码的跨平台特性不仅解决了性能的问题,而且可以发挥各个平台的优势,充分利用每个平台自身的特点;并且即可以在新环境下实现原有软件的功能和特点,减少开发费用,还可以改进原有软件的不足,增加新的需求,从而提高软件的质量,延长软件生命期。因此,利用Linux下基于Qt的应用程序开发是一个非常有意义的课题,具有重要的研究和商业价值。另外,通过本游戏的设计,检验了学习效果和动手能力,进一步深入Qt的学习,提高自己的编程水平,从而达到理论与实践相结合的目的。在成为一个真正的游戏开发者的路上,俄罗斯方块是一个完美开始。为什么?因为它包括任何一个游戏中所有的元素。并且,不需要艺术家般的才能就能做出非常好看的俄罗斯方块游戏。任何一个能画出方块的人,每个作图形程序的人,就能做出商业品质的俄罗斯方块游戏。以俄罗斯方块开始还有另外一个好处,不仅能做出一个完整的既好玩又容易上瘾游戏,而且它看上来和那些商业版本没什么区别。方块就是方块,不管是谁画出它们的,而且tetraminos(俄罗斯方块中使用的形状)也不过是一些方块的组合。俄罗斯方块拥有所有游戏共通的独立成份。它有一个游戏循环(这个过程被反复执行直到游戏退出)。这个游戏循环读取玩家的输入,处理这个输入,然后更新游戏的元素(下落的tetraminos),并且检查是输还是赢。以后要做的所有的简单的游戏都要用到这些东西,所以学习这个过程并且实现它是非常重要的。当第一次完成它之后,以后再做游戏时就能看出那个游戏有多难以及要花多长时间。如果没有完整的完成过这些,哪怕一次,就永远不能完整地正确领会其中的每个元素。当做大的项目时,就更不能确定其复杂性及所要的时间。如果甚至不能正确地领会这整个过程(因为你没能完成它),可能是没能建立一个合适的时间表或估计合适的时间,更有可能的是不够努力。还有,玩俄罗斯方块可以练习人的反映能力,开始时快速的下降会让人手无足措,但适应了之后就会发现自己的反应力变的很快了。另外长时间的手指活动可以让人血液流通加快有利健康。还有俄罗斯方块高手都知道要想赢,就要有远大的布局,决不能只局限于一点一点的减,这在无形中就提高了人的智慧。2可行性研究2.1设计目的通过俄罗斯方块的设计,综合自己在校以及在杰普公司实习期间所学的理论知识,使自己熟悉应用系统的开发过程,培养独立思考能力,检验学习效果和动手能力,初步掌握软件工程的系统理论,进一步巩固和加强自身对C与C++基础知识的理解,提高自己的编程水平,从而达到理论与实践相结合的目的。2.2软件问题定义基本要求:本游戏开发的总体任务是实现游戏的可操作性,以及界面的美观性。整个开发过程遵循软件工程规范,采用MFC编程来实现界面以及事件的控制,用户根据键盘的四个方向键控制翻转、向左、向右和向下操作,通过菜单栏中的相应菜单选项实现游戏的开始、结束、变换方块、积分以及等级的功能。目标:通过本游戏的开发,主要实现游戏的可操作性以及美观性,同时使自己对C++语言的了解更进一层,为将来的实际工作打下坚实的基础。条件、假定和限制:由于知识以及能力的限制,本游戏所实现的功能不够强大,可对本游戏进行改善,从而增强游戏的功能。可行性研究的方法:通过研究分析俄罗斯方块所具备的能力及实现的方法、确定主体结构。利用现阶段我所能达到的能力,以最简洁、最容易的办法,边开发边测试边修改,实现一个初级游戏软件。评价尺度:由于本软件是一个初级产品,对其要求不是太苛刻,所以能够达到俄罗斯游戏的一般功能即可。2.3可行性分析2.3.1技术可行性开发本游戏的编程语言有多种,考虑到自身对语言的掌握程度,选择C++语言进行游戏的开发,采用GUI编程来实现界面以及事件的控制。2.3.2经济可行性本游戏是为丰富人们业余生活开发的,规模适中,工作复杂性低,实用性强。从开发人力、物力、时间上考虑,开发成本少。而且利用C与C++程序,加快了开发进度,大大的缩短了开发周期,节省了人力、物力、时间,提高了项目开发的效率,降低了开发成本。由于需求分析完整,减少了很多后期维护的复杂性。另外,本系统具有很实用的现实意义。因此,从经济角度考虑在线考试系统的开发在经济上是完全可行的。2.3.3操作可行性本游戏是采用QT下的GUI(图形用户界面)组件创建的简单有好的操作界面,运行也效果简单明了,所有功能均根据基本需求进行开发。强调人—机—环境三者作为一个系统进行总体设计。使操作更人性化,减轻了用户的认知负担,使其更适合用户的操作需求。对所有数据的输入进行完整性和合法性检查,尽量减少误操作。因此在操作上是可行的。2.3.4法律可行性本游戏的开发主要为了完成毕业设计,开发的主体是个人,不存在法律上的侵权行为,也不会为社会造成影响,这方面是完全可行的。2.4结论意见综上所述,本游戏软件的技术成熟、完备。各方面均无重大问题,因此本游戏软件可开始着手编写。

3需求分析3.1引言需求分析是软件定义时期的最后一个阶段,也是关系到软件开发成败的关键步骤。确定系统必须完成哪些工作,也就是对目标系统提出完整、准确、清晰、具体的要求。在这个阶段中,开发者要做大量的调查和研究,收集信息,明确系统功能。需求分析的结果是系统开发的基础,它的成功与否直接关系到项目的成败和软件的质量。对软件需求的理解程度是决定软件开发工作成功与否的至关重要的环节,需求分析的任务是发现、规范的过程,有益于提高软件开发过程中的能见度;便于对软件开发过程进行控制与管理;便于采用工程方法开发软件,提高软件的质量;便于开发人员、维护人员、管理人员之间的交流、协作。3.2游戏功能分析3.2.1系统概述28种状态的方块随机产生,自由下落,落下时可由玩家用上、下、左、右控制键控制翻转和移动,以便以玩家所需要的形态和位置落下。如果落下时,方块的方格能填满某一行,则这一行可消去。消去一行后,游戏可给玩家加分,若由存在空格的方块填满整个窗口,则游戏失败。游戏功能需求如下:游戏界面需求:设计良好的游戏界面可以让玩家充分感受到游戏带来的娱乐性,游戏的背景色是黑色,方块用蓝色颜色,在一定的区域内运动和变形,落下后的障碍物用黄色显示,这样看起来会有一定的美感。游戏形状需求:用数组作为存储方块28种状态的数据结构,即长条形、Z字形、反Z形、田字形、7字形、反7形、T字型,各个方块要能实现它的变形,可设为顺时针或逆时针变形,一般为逆时针。键盘处理事件需求:方块下落时,可通过键盘方向键(上、下、左、右键)对该方块进行向上(变形),向下(加速)、向左、向右移动。鼠标处理事件需求:通过点击菜单栏中相应的菜单项,可以实现游戏的开始、结束,方块形状的变换,分数、等级的显示,以及游戏帮助等功能。显示需求:当不同的方块填满一行时可以消行,剩余方块向下移动并统计分数。当达到一定分数的时候,会增加相应的等级。3.2.2系统运行环境操作系统:ubuntu12.04或windows硬件环境:内存:4.00G硬盘:500MCPU:P7450@2.13GHz开发工具:QT5.2.03.3游戏的UML基本模型3.3.1游戏的用例图用例图是由软件需求分析到最终实现的第一步,它描述人们希望如何使用一个系统。用例图在需求分析阶段有很重要的作用,它是作为参与者的外部用户所能观察到的系统功能的模型图,它显示多个外部参与者以及他们与系统提供的用例之间的连接[4]。整个开发过程都是围绕需求阶段的用例进行的。通过分析确定本系统的抽象参与者有:计算机和玩家两类。计算机(computer)。计算机可以实现方块定时下移、随机产生方块、自动消除满行、更新分数、报告游戏结果等。计算机控制游戏的用例图如图3-1所示。图3-1计算机控制游戏的用例图玩家(player)。玩家是本游戏的重要参与者。玩家可以选择控制方块。控制方块用例包括旋转方块、左移方块、右移方块、下移方块、丢下方块等用例。其中:玩家可以控制游戏和设置游戏,控制游戏用例又包括控制游戏状态和控制背景音乐。控制游戏状态用例包括开始游戏、暂停游戏、继续游戏、从新开始、退出等用例,其中从新开始是对开始游戏用例的扩展.图3-2玩家操作游戏的用例图3.3.2游戏的状态图 状态图是系统分析的一种常用工具,它能够表征系统的变化状态。游戏的状态图如图3-3所示。图3-3游戏状态图 玩家进入单机版游戏模式后,可以点击“开始”按钮开始游戏,游戏进行过程中如果游戏最小化或者玩家点击“暂停”按钮或菜单项,则游戏暂停。如果游戏界面恢复或玩家点击“继续”按钮或菜单项则游戏可以继续,游戏进行过程中玩家还可以点击“停止”按钮或菜单项,使游戏停止。无论游戏是否进行,玩家都可以点击“退出”按钮或菜单项退出游戏。3.3.3游戏的活动图活动图是UML用于对系统的动态行为建模的一种常用工具,它描述活动的顺序,展现从一个活动到另一个活动的控制流。活动图在本质上是一种流程图。俄罗斯方块游戏总的活动图如图3-4所示。一旦游戏开始,玩家即可对游戏的状态进行控制,包括暂停游戏、继续游戏、关于游戏和退出游戏的操作,当感觉马上会失败时,换可以选择从新开始游戏。当游戏结束,玩家可退出游戏。3-4俄罗斯方块游戏的活动图

4游戏详细设计游戏的实现主要由三个部分设计而成:方块图形的产生处理、主窗口(画布)的显示以及游戏的具体实现方式。其中方块的处理tetrixpiece.h、tetrixpiece.cpp实现各种形状方块的产生和变化,主窗口tetrixwindow.h、tetrixwindow.cpp是游戏的显示部分(包括LCD的数字显示),游戏的具体实现tetrixboard.h、tetrixboard.cpp则是游戏的核心部分,包括游戏的开始事件、暂停事件、键盘响应、计时以及消行等。4.1图形实体类TetrixPiece实现4.1.1图形的产生定义一个枚举类型,表示方块的七种形状,通过图形实体类TetrixPiece的setRandomShape()方法随机产生一个初值,用于产生图形的某种状态,如图4.1和图4.2所示:图4.1图形的随机产生图4.2俄罗斯方块图形每个形状由4个小方块组成,这里每行的四个坐标即4个小方块的坐标,其中横向为X,纵向为Y,上图分别为Z字形、S字形、一字形、T字形、田字形、L字形和反L字形,各个图形的坐标依次如下:{{0,-1},{0,0},{-1,0},{-1,1}},{{0,-1},{0,0},{1,0},{1,1}},{{0,-1},{0,0},{0,1},{0,2}},{{-1,0},{0,0},{1,0},{0,1}},{{0,0},{1,0},{0,1},{1,1}},{{-1,-1},{0,-1},{0,0},{0,1}},{{1,-1},{0,-1},{0,0},{0,1}}4.1.2图形的旋转图形的旋转是通过绘制4个方向的方块,在不同旋转角度显示不同方向的方块来实现的。定义一个函数rotatedLeft()const,当每次响应键盘向上的方向键时,方块顺时针旋转90度,同时画布刷新一次,这样,方块的变形就实现了。4.2游戏内容的实现4.2.1游戏实现控制方式游戏核心功能:游戏区域的绘制、方块的移动、游戏区域背景及区域内方块的绘制、游戏的运行、游戏的满行及消行、游戏的结束判断。游戏其他功能:游戏区域及方块颜色设置、响应键盘按下事件。4.2.2方块下移功能:判断图形能否向下移动,显示下移后的界面,或者游戏结束。实现:先向下移动一步,此时并不在界面上显示下移后的界面,判断是否到底,若到底则消行记录分数、出现下一个图形;判断是否一开始就与其它图形重合,若是则游戏结束;经过以上判断,此时方可显示下一步后的界面,并进入下一次计时,流程图如图4.3所示:图4.3下移一步流程图4.2.3满行及消行判断功能:判断是否有已满行,然后把该行消去。实现:游戏在方块下移到底后,利用循环判断有几行已满,并对已满行进行清零和进行加分操作,同时更新窗口,从而实现消行的效果。4.2.4绘制游戏区域及方块通过调用QPainter的drawLine的方法绘制游戏网格,调用QPainter的drawPixmap和drawRect绘制方块背景和边框。4.2.5键盘事件响应俄罗斯方块是通过上下左右移动来控制游戏的运行,那么是具体如何实现的呢?这就需要用到键盘的按下事件,通过响应键盘的按下事件来实现。本游戏设计的是用上下左右方向键键来控制游戏的操作,其中左右方向键控制方块向左向右移,向上键控制方块的形状,操作向下键则方块直接下坠。键盘响应事件功能图如图4.4所示:图4.4键盘事件功能图 具体代码实现:通过重新实现虚函数QWidget::keyPressEvent来响应相应的键盘按键事件。4.3游戏主窗体的实现游戏主窗体是整个游戏的显示部分,主要用于放置绘制好的游戏区域,显示游戏玩家的得分情况、关卡和其它基本信息。游戏区域的宽分成10等分,高分成22等分,也就是说每行有10小矩形,总共有22行(BoardWidth=10,BoardHeight=22)。左边是LCD的显示部分,LCD的显示最大为五位数。分为分数(scoreLcd)、等级(levelLcd)、消行(linesLcd)。另外,主窗体还设计了游戏的选项按钮,方便游戏者的操作。

5代码分析5.1Tetrix工程每个程序都有一个工程,此工程下包含各种头文件以及对应的函数,本工程包含的头文件有:tetrixboard.h,tetrixpiece.h,tetrixwindow.h,三个函数tetrixboard.cpp,tetrixpiece.cpp,tetrixwindow.cpp,后面将对各头文件及函数具体分析。由于游戏代码量大,时间仓促,而且刚学QT,运用不是很熟练,本设计在老师的指导下完成,有部分代码框架是老师代为实现,本人主要对tetrixboard.cpp部分,包括游戏各功能的实现,游戏加分奖励机制,方块的移动方式,按键的映射,按钮与槽的链接,计时模块等核心内容进行编程实现。截图如图5-1。后面将对各部分详细说明。图5-1Tetrix工程5.2main.cpp主程序代码Main函数是C,C++,Qt程序的入口,main函数代码少,起引导作用,也包括程序的出口。intmain(intargc,char*argv[])//C++入口{QApplicationapp(argc,argv);//Qt入口TetrixWindowwindow;window.show();qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));returnapp.exec();//C++于Qt出口window.setWindowIcon(QIcon(":/Chrome.ico"));window.show();//当前时间作为随机种子qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));returnapp.exec();//程序的事件循环}5.3tetrixboard.h头文件代码tetrixboard.h头文件主要是声明了各个按钮,显示窗口的实现方法,以及窗体尺寸,头文件只起到声明的作用,具体的实例化在函数中实现。TetrixBoard(QWidget*parent=0);voidsetNextPieceLabel(QLabel*label);QSizesizeHint()const;//最适合大小QSizeminimumSizeHint()const;//最小限制publicslots://公有槽voidstart();voidpause();voidrestart();signals://信号:只需声明,根据参数变化来判断voidscoreChanged(intscore);voidlevelChanged(intlevel);voidlinesRemovedChanged(intnumLines);protected://着色、键盘、计时事件:其中着色事件随着update()不断触发voidpaintEvent(QPaintEvent*event);voidkeyPressEvent(QKeyEvent*event);voidtimerEvent(QTimerEvent*event);private:enum{BoardWidth=10,BoardHeight=22};//把主游戏区宽分成10等份,高分成22等份,也就是说每行有10小矩形,总共有22行TetrixShape&shapeAt(intx,inty){returnboard[(y*BoardWidth)+x];}inttimeoutTime(){return1000/(1+level);}//contentsRect():返回当前布局(QLayout)的矩形,可访问其长、宽//conntentsRect().width()/BoardWidth把游戏区矩形的宽分成了BoardWidth份intsquareWidth(){returncontentsRect().width()/BoardWidth;}//同上,把高分成了BoardHeight份intsquareHeight(){returncontentsRect().height()/BoardHeight;}//此时squareWidth(),squareHeight()分别是分割后的小矩形宽和高voidclearBoard();//清屏voiddropDown();//下落事件voidoneLineDown();//下落一行voidpieceDropped(intdropHeight);voidremoveFullLines();//移除填满的行voidnewPiece();//新方块voidshowNextPiece();//显示下一个方块booltryMove(constTetrixPiece&newPiece,intnewX,intnewY);//判断方块是否可以移动voiddrawSquare(QPainter&painter,intx,inty,TetrixShapeshape);//着色QBasicTimertimer;//相当于QLabel*nextPieceLabelQPointer<QLabel>nextPieceLabel;boolisStarted;boolisPaused;boolisWaitingAfterLine;TetrixPiececurPiece;//当前方块TetrixPiecenextPiece;//下一个方块intcurX;intcurY;intnumLinesRemoved;intnumPiecesDropped;intscore;intlevel;TetrixShapeboard[BoardWidth*BoardHeight];QImage*m_image;};5.4tetrixboard.cpp程序代码此部分实现功能多,代码量大,是本设计游戏功能实现的核心,这里将其拆分成几个小模块来解释说明。5.4.1游戏初始化,复位的实现TetrixBoard::TetrixBoard(QWidget*parent):QFrame(parent){setFrameStyle(QFrame::Panel|QFrame::Sunken);//面板,方块活动界面setFocusPolicy(Qt::StrongFocus);//设置焦点isStarted=false;//赋初值isPaused=false;//赋初值clearBoard();//游戏开始前清空底板nextPiece.setRandomShape();//下一个显示,随机显示图形}//随机产生方块形状//默认尺寸voidTetrixBoard::setNextPieceLabel(QLabel*label){nextPieceLabel=label;//实例化出来下一个方块显示}QSizeTetrixBoard::sizeHint()const{returnQSize(BoardWidth*15,BoardHeight*15);}//面板默认尺寸QSizeTetrixBoard::minimumSizeHint()const//最小尺寸{returnQSize(BoardWidth*5,BoardHeight*5);}//初始化5.4.2游戏开始与暂停//游戏开始voidTetrixBoard::start(){if(isPaused)//判断是否处于暂停状态return;isStarted=true;//游戏开始为真isWaitingAfterLine=false;//numLinesRemoved=0;//刚开始游戏没有消除行,所以为0numPiecesDropped=0;score=0;//开始前分数为零,游戏开始,分数开始改变level=1;//开始时关卡为1clearBoard();emitlinesRemovedChanged(numLinesRemoved);emitscoreChanged(score);emitlevelChanged(level);//各部分功能激活,开始工作newPiece();timer.start(timeoutTime(),this);//记时器开始计时}//暂停功能voidTetrixBoard::pause(){if(!isStarted)//判断游戏是否已经开始return;isPaused=!isPaused;if(isPaused){ timer.stop();//如果处于暂停状态,停止计时}else{ timer.start(timeoutTime(),this);}update();}voidTetrixBoard::paintEvent(QPaintEvent*event){QFrame::paintEvent(event);//绘图事件QPainterpainter(this);QRectrect=contentsRect();//if(isPaused){painter.drawText(rect,Qt::AlignCenter,tr("*zzia^briup*"));//暂停时方块活动窗口显示内容,当然可以改为其它,比如“Pause”。return;}5.4.3按键控制游戏//按键控制板块switch(event->key()){caseQt::Key_Left:tryMove(curPiece,curX-1,curY); break;//左键控制方块左移,x坐标减小,y不变caseQt::Key_Right:tryMove(curPiece,curX+1,curY); break;//右键控制方块右移,x坐标增加,y不变caseQt::Key_Down:tryMove(curPiece.rotatedRight(),curX,curY); break;//下键控制方块向右旋转caseQt::Key_Up:tryMove(curPiece.rotatedLeft(),curX,curY); break;//上键控制方块想做旋转caseQt::Key_Space: dropDown(); break;//空格键控制方块直接下降到底部caseQt::Key_D: oneLineDown(); break;//D键控制下降加速default: QFrame::keyPressEvent(event);//按钮触发事件}}5.4.4计时模块//计时模块voidTetrixBoard::timerEvent(QTimerEvent*event){if(event->timerId()==timer.timerId()){if(isWaitingAfterLine){ isWaitingAfterLine=false; newPiece();timer.start(timeoutTime(),this);//新开时游戏,计时开始}else{oneLineDown();}}else{QFrame::timerEvent(event);}}这里用到多充判断,因为多种情况都涉及到计时的开始于暂停。5.4.5方块的活动在方块活动区域,通过按键对方块的活动进行控制,方块本身就有下降的功能,这里方块的坐标随时都在改变。方块活动区域初始状态没有图形voidTetrixBoard::clearBoard(){for(inti=0;i<BoardHeight*BoardWidth;++i)board[i]=NoShape;//初始,没有方块}//方块下降voidTetrixBoard::dropDown(){intdropHeight=0;intnewY=curY;//开始出现方块时坐标while(newY>0){if(!tryMove(curPiece,curX,newY-1))break;--newY;//不断下降,y坐标跟着减小++dropHeight;//而下降的高度增加}pieceDropped(dropHeight);}voidTetrixBoard::oneLineDown(){if(!tryMove(curPiece,curX,curY-1)) pieceDropped(0);//没有左右移动时,只有y坐标变化}5.4.6过关与奖励本游戏每分数达到一定分数关卡加一,采用多种奖励加分机制。//分数达到一定程度等级加一voidTetrixBoard::pieceDropped(intdropHeight){for(inti=0;i<4;++i){intx=curX+curPiece.x(i);inty=curY-curPiece.y(i);shapeAt(x,y)=curPiece.shape();}++numPiecesDropped;if(numPiecesDropped%25==0){++level;//出现25个方块,关卡加一timer.start(timeoutTime(),this);//计时emitlevelChanged(level);//关卡控制}score+=dropHeight+7;//奖励机制,快速下降加分emitscoreChanged(score);//分数变化removeFullLines();if(!isWaitingAfterLine)newPiece();}voidTetrixBoard::removeFullLines()//消除{intnumFullLines=0;for(inti=BoardHeight-1;i>=0;--i){boollineIsFull=true;//此行已满,返回真for(intj=0;j<BoardWidth;++j){if(shapeAt(j,i)==NoShape){lineIsFull=false;//不满,有空隙break;}}if(lineIsFull){ ++numFullLines;//满了就消除一行,显示加一 for(intk=i;k<BoardHeight-1;++k){for(intj=0;j<BoardWidth;++j)shapeAt(j,k)=shapeAt(j,k+1); } for(intj=0;j<BoardWidth;++j)shapeAt(j,BoardHeight-1)=NoShape; }}if(numFullLines>0){ numLinesRemoved+=numFullLines;//消除行数显示score+=10*numFullLines;//消除一行再次奖励10分 emitlinesRemovedChanged(numLinesRemoved);emitscoreChanged(score);//分数改变timer.start(500,this);//初始速度,这里以下降间隔时间来//表示,默认第一关500msisWaitingAfterLine=true;curPiece.setShape(NoShape);update();}}5.4.7方块颜色控制随机产生不同的颜色,这里也由数组控制,列出几种颜色。//方块颜色(随机产生)voidTetrixBoard::drawSquare(QPainter&painter,intx,inty,TetrixShapeshape){staticconstQRgbcolorTable[8]={0x000000,0xCC6666,0x66CC66,0x6666CC,0xCD2626,0xCC66CC,0x66CCCC,0xDAAA00};//颜色代码块,各种颜色随机出现QColorcolor=colorTable[int(shape)];painter.fillRect(x+1,y+1,squareWidth()-2,squareHeight()-2,color);painter.setPen(color.light());//产生亮色painter.drawLine(x,y+squareHeight()-1,x,y);painter.drawLine(x,y,x+squareWidth()-1,y);painter.setPen(color.dark());//暗色painter.drawLine(x+1,y+squareHeight()-1,x+squareWidth()-1,y+squareHeight()-1);painter.drawLine(x+squareWidth()-1,y+squareHeight()-1,x+squareWidth()-1,y+1);}5.5tetrixpiece.h头文件代码Tetrixpiece.h声明定义方块形状的实现,通过坐标来控制,同样这里也只是声明,具体实现不在此处。//俄罗斯方块类:方块形状/旋转情况#ifndefTETRIXPIECE_H#defineTETRIXPIECE_H//定义一个枚举类型(0-7):无形状、Z字形、S字形、直线形,T字形,田字形形、L字形,翻转L字形enumTetrixShape{NoShape,ZShape,SShape,LineShape,TShape,SquareShape,LShape,MirroredLShape};classTetrixPiece{public:TetrixPiece(){setShape(NoShape);}//inline构造函数:初始设置成NoShapevoidsetRandomShape();//设置随机规则voidsetShape(TetrixShapeshape);//构造方块形状的数据结构//通过inline公有函数成员shape()访问私有数据成员pieceShapepublic:TetrixPiece(){setShape(NoShape);}voidsetRandomShape();voidsetShape(TetrixShapeshape);//产生图形TetrixShapeshape()const{returnpieceShape;}intx(intindex)const{returncoords[index][0];}inty(intindex)const{returncoords[index][1];}intminX()const;//x最小值intmaxX()const;//x最大值intminY()const;//y最小值intmaxY()const;//y最大值TetrixPiecerotatedLeft()const;//左旋转TetrixPiecerotatedRight()const;//右旋转private:voidsetX(intindex,intx){coords[index][0]=x;}//x坐标voidsetY(intindex,inty){coords[index][1]=y;}//y坐标TetrixShapepieceShape;intcoords;5.6tetrixpiece.cpp程序代码voidTetrixPiece::setShape(TetrixShapeshape){staticconstintcoordsTable[8][4][2]={{{0,0},{0,0},{0,0},{0,0}},{{0,-1},{0,0},{-1,0},{-1,1}},{{0,-1},{0,0},{1,0},{1,1}},{{0,-1},{0,0},{0,1},{0,2}},{{-1,0},{0,0},{1,0},{0,1}},{{0,0},{1,0},{0,1},{1,1}},{{-1,-1},{0,-1},{0,0},{0,1}},{{1,-1},{0,-1},{0,0},{0,1}}};//次数组有八个成员,因为虽然只有七种图形,但//是一字型竖起来又是一种新的图形for(inti=0;i<4;i++){for(intj=0;j<2;++j)coords[i][j]=coordsTable[shape][i][j];}pieceShape=shape;//图形随机产生并出现在活动区域}//伪随机函数:利用当前系统时间增加随机性voidTetrixPiece::setRandomShape(){//QTimetime=QTime::currentTime();//qsrand(time.msec()+time.second()*1000);//重设随机种子:当前时间为随机变量setShape(TetrixShape(qrand()%7+1));//共六种方块形状for(inti=0;i<4;i++){for(intj=0;j<2;++j)coords[i][j]=coordsTable[shape][i][j];}pieceShape=shape;}//获取最小X坐标值,QtGlobal::qMinintTetrixPiece::minX()const{intmin=coords[0][0];for(inti=1;i<4;++i)min=qMin(min,coords[i][0]);returnmin;}//获取最大X坐标值,QtGlobal::qMaxintTetrixPiece::maxX()const{intmax=coords[0][0];for(inti=1;i<4;++i)max=qMax(max,coords[i][0]);returnmax;}//获取最小Y坐标值intTetrixPiece::minY()const{intmin=coords[0][1];for(inti=1;i<4;++i)min=qMin(min,coords[i][1]);returnmin;}//获取最大Y坐标值intTetrixPiece::maxY()const{intmax=coords[0][1];for(inti=0;i<4;++i)max=qMax(max,coords[i][1]);returnmax;}//按顺时针方向左转90度://x=-y;//y=x;for(inti=0;i<4;i++){for(intj=0;j<2;++j)coords[i][j]=coordsTable[shape][i][j];}pieceShape=shape;//图形随机产生并出现在活动区域}5.7tetrixwindow.h头文件代码Tetrixwindow.h部分是声明按钮与显示框,只是把图形界面声明出来,与前面Tetrixboard声明的实现方法有所区别,两部分配合才能实现完整的功能。classTetrixWindow:publicQWidget{Q_OBJECTpublic:TetrixWindow();private:QLabel*createLabel(constQString&text);TetrixBoard*board;QLabel*nextPieceLabel;//下一个方块显示框QLCDNumber*scoreLcd;//分数显示框QLCDNumber*levelLcd;//关卡显示框QLCDNumber*linesLcd;//消除行数显示框QPushButton*startButton;//开始按钮QPushButton*quitButton;//退出按钮QPushButton*pauseButton;//暂停按钮};5.8tetrixwindow.cpp程序代码tetrixwindow.cpp是对tetrixwindow.h头文件的实例化,包括三个功能按钮,五个显示部分,信号与槽的链接等。5.8.1显示框nextPieceLabel=newQLabel;nextPieceLabel->setFrameStyle(QFrame::Box|QFrame::Raised);nextPieceLabel->setAlignment(Qt::AlignCenter);board->setNextPieceLabel(nextPieceLabel);//下一个将出现的图形预览scoreLcd=newQLCDNumber(5);scoreLcd->setSegmentStyle(QLCDNumber::Filled);//分数显示区域levelLcd=newQLCDNumber(2);levelLcd->setSegmentStyle(QLCDNumber::Filled);//关卡显示linesLcd=newQLCDNumber(5);linesLcd->setSegmentStyle(QLCDNumber::Filled);//消除行数显示5.8.2功能按钮startButton=newQPushButton(tr("&Start"));startButton->setFocusPolicy(Qt::NoFocus);quitButton=newQPushButton(tr("&Quit"));quitButton->setFocusPolicy(Qt::NoFocus);pauseButton=newQPushButton(tr("&Pause"));pauseButton->setFocusPolicy(Qt::NoFocus);//三个按钮的功能及实现机制5.8.3信号与槽 connect(startButton,SIGNAL(clicked()),board,SLOT(start()));connect(quitButton,SIGNAL(clicked()),qApp,SLOT(quit()));connect(pauseButton,SIGNAL(clicked()),board,SLOT(pause()));connect(board,SIGNAL(scoreChanged(int)),scoreLcd,SLOT(display(int)));connect(board,SIGNAL(levelChanged(int)),levelLcd,SLOT(display(int)));connect(board,SIGNAL(linesRemovedChanged(int)),linesLcd,SLOT(display(int)));//信号与槽的链接,按键产生的信号与槽相连接5.8.4游戏面板布局layout->addWidget(board,0,0,14,4);layout->addWidget(createLabel(tr("分数")),2,7);layout->addWidget(scoreLcd,3,7);layout->addWidget(createLabel(tr("消行")),4,7);layout->addWidget(linesLcd,5,7);layout->addWidget(startButton,8,4,1,2);layout->addWidget(pauseButton,9,6,1,2);layout->addWidget(aboutButton,10,4,1,2);layout->addWidget(quitButton,11,6,1,2);layout->addWidget(reStartButton,12,4,1,2);layout->addWidget(helpButton,13,6,1,2);setLayout(layout);//设置该布局,使之有效//QWidget::setWindowTitle(tr("张盛楠毕业设计俄罗斯方块"));//设置主窗口标题intw=550;inth=530;resize(w,h);//设置主窗口默认大小宽*高setMaximumSize(w,h);setMinimumSize(w,h);

6整体测试6.1游戏运行测试运行QT程序,游戏成功运行如图5.1所示6.1游戏成功运行6.2游戏界面测试当进入游戏后,游戏界面为图6.2图6.2界面测试图点击“关于”,显示作者基本信息,如图6.3所示:图6.3界面测试图点击“游戏帮助”,显示游戏的基本信息,如图6.4所示:图6.4界面测试图6.3界面功能测试点击“开始游戏”按钮时游戏立即开始,方块自动下落且形状随机。界面如下图6.4:图6.4游戏开始功能测试图当点击“暂停游戏”时,游戏则停止,方块停止下落,此时的界面为:图6.5游戏暂停功能测试图当游戏进行进行一段时间后对游戏等级,分数,消行显示框进行测试如图6.6.1与6.6.2:图6.6.1等级,分数,消行显示框进行测试图图6.6.2等级,分数,消行显示框进行测试图若由存在空格的方块填满整个窗口,则游戏失败,此时会立即弹出游戏结束的对话框。此时的游戏界面为:图6.6游戏结束功能测试图6.4测试总结游戏代码的分析到此结束,通过本设计,我熟练掌握了QT中图形界面的实现,信号与槽的链接,对C与C++时学过的数组,循环,指针,条件判断等有了进一步的理解,运用更灵活,增强了动手动脑能力,对编程有了新的认识,对所学知识确实起到了复习巩固的作用。本游戏操作简单,界面清晰,让玩家容易上手操作,但是由于本人技术有限,本游戏所实现的功能不够完善,不够强大,表现在不能建立连接,因此游戏只供单人玩,界面也不够美观,可选择的窗口风格少,以后可对本游戏进行改善,从而增强游戏的功能。

结论游戏设计与实践是一项复杂而且庞大的工作,在选题之后,我才意识到过程的艰难,因为以前从来没有接触过游戏设计,刚开始时有点迷茫和彷徨。后来通过看书和在网上查找资料,逐渐找到了一些感觉,也依照资料自己动手编写了几个简单经典的游戏。本文仅以俄罗斯方块为例予以说明。本次设计让我初步懂得了电子游戏所涉及到的有关技术、方法,包括电子游戏分类、选题、构思等。并实现几个可演示的游戏软件,其中有很多应用了学习的相关技术,并且做到了图、文、声并茂,能实际演示。此次设计过程中印象最深的收获有:1、学到了很多新知识,并且对老知识进行了回顾。经过长时间的学习,更进一步熟悉了各类语言。2、通过不断上机实验,调试程序,总结经验,从对课题的不理解到能够开始动手去做,提出问题并自己想办法解决问题,自己多实践,所以增强了动手能力。3、提高了中、英文资料的检索能力。这次毕业设计过程中我查阅了很多资料,不但有期刊、杂志、图书,还有网络中的电子文档、电子书籍、网页及下载的视频教学课程;还有中文资料还有英文资料。这些资料,使我的眼界更开阔,对课题的认识更加深刻,编写程序的时候思路更加清楚,少走了很多弯路。但如果真的要从事游戏设计的工作,需要走的路还很长,即便是对于国际知名的大公司,也是在不断的探索和实践中前进。但这并不表明前途就是渺茫的,通过这次实践,进行了一次从底而上和自上而下的归纳和演绎的过程,在变化多端的游戏面前,总算领悟了一点它的奥妙。内容繁复、采用的表现手段多姿多彩的游戏世界,即便是再复杂,也可以通过一定程度的归纳演绎得出适应其规则和表现的契合点。回顾这个设计过程,我学到了许多书本上没有学到的知识。通过这次自己制作的软件,丰富了自己的实践技能,扩展了本专业的知识面,使我受益非浅,同时也体验到了搞软件开发的困难度。在这次设计的同时,我又从中学到了许多东西。但由于我对这样的软件开发还只是一个开始,了解的不多,这其中或许还有很多的不足,有些模块做得不是很好,有些功能还不能够完全的实现,如不能把要装载的方块提前显示出来。因此做得不是很好,界面的设计及整体的布局还比较简单,没有突出特色出来,这也可能是我这个系统的不足之处。还有任何问题都不能想当然,假如你接手一个简单的项目,你可能会认为某些部分很容易完成。千万不要这样认为,除非你有一个类、组件、或者一段已经写好的代码并且已经测试通过。总之,通过本次毕业设计,学到了很多,收获了不少。我相信这将使我人生中一次宝贵的经验。致谢大学四年的学习即将结束。感谢大学四年来,各位老师对我的教诲,感谢太原理工大学软件学院对我的栽培,感谢杰普科技有限公司(昆山浦东软件园)给我培训实习的机会,感谢大家有缘能在生命中重要的四年,出现在彼此的生活中。大学四年学到的文化知识,做人道理将使我受益终生,我很荣幸在大学期间有这样辅导员,他使我们人生的导师。在这里还要特别感谢华红艳主任,王义琴,刘涛,晋剑老师对本次毕业设计的指导支持。感谢我的父母,对我的支持,没有他们的支持,我走不到今天。感谢与我共同走过大学的朋友们、同学们,每个在我脆弱、困难的时候,扶过我一把的你,我都记得。最后希望各位领导、各位老师工作顺利,身体健康,所有关心支持我的同学、朋友都有一个美好的前程。参考文献[1]王亚民,陈青,刘畅生.组态软件设计与开发[M].西安:西安电子科技大学出版 社,2003.WangYam,ChenQing,LiuChangsheng,Designanddevelopmentofconfigurationsoftware[M].Xi'an:Xi'anElectronicandScienceUniversitypress,2003[2]W.RichardStevens,StephenA.Rago.UNIX环境高级编程[M].北京:人民邮电出 版社,2006W.RichardStevens,StephenA.Rago.UNIXadvancedprogrammingintheUNIXenvironment[M].Beijing:People'spostandTelecommunicationsPublishingHouse,2006[3]王世江.Linux基础学习篇(第三版)[M].北京:人民邮电出版社,2010.7WangShijiang,Linuxofbasedlearning(ThirdEdition)[M].Beijing:People'spostandTelecommunicationsPublishingHouse,2010.7[4]蔡志明.精通Qt4编程[M].北京:电子工业出版社,2008.1CaiZhiming,inQt4programming[M].Beijing:PublishingHouseofelectronicsindustry,2008.1[5]姚全珠.C++面向对象程序设计[M].北京:电子工业出版社,2010YaoQuanzhu.C++object-orientedprogramming[M].Beijing:PublishingHouseofelectronicsindustry,2010[6](印)拉克什曼.LinuxShell脚本攻略[M]北京:人民邮电出版社.2011.1(IND)Lakshmana.LinuxShellscriptRaiders[M].Beijing:People'spostandTelecommunicationsPublishingHouse.2011.1[7](美)萨莉.Linux嵌入式系统高级程序设计[M],北京:人民邮电出版社,2010.11(US)Sallie,GuoXutransl,Linuxembeddedsystemprogrammingdesign[M],Beijing:People'spostandTelecommunicationsPublishingHouse,2010.11[8](加)亚荷毛尔.构建嵌入式Linux系统[M].北京:中国电力出版社,2011.1(CAN)Yaghmour.ConstructionadaptedforembeddedLinuxsystem[M].Beijing:ChinaElectricPowerPress,2011.1[9]黄照鹤.Linux指令范例速查手册[M].北京:清华大学出版社,2011.1HuangZhaohe.LinuxcommandexamplesHandbook[M].Beijing:TsinghuaUniversitypress,2011.1[10]张倪.嵌入式软件基础[M].北京:电子工业出版社,2010.9ZhangNi.Fundamentalsofembeddedsoftware[M].Beijing:ElectronicIndustryPress,2010.9[11]陈爽.Linux与Qt程序设计[M].北京:清华大学出版社,2011.12ChenShuang.LinuxandQtprogramdesign[M].Beijing:TsinghuaUniversitypress,2011.12[12](美)伊斯特(EEzust,A),(美)伊斯特(EEzust,P)著,李仁见,战晓明译C++设计模式——基于Qt4开源跨平台开发框架[M],北京:清华大学出版社.2007.8(USA)EEzust(EEzust,A),(USA)EEzust(EEzust,P),bytranslatedLiRenjian.ZhanXiaomingC++designpatternsbasedonQt--4opensourcecross-platformdevelopmentframework[M].Beijing:TsinghuaUniversitypress,2007.8[13]成洁,卢紫毅.Linux窗口程序设计[M].北京:清华大学出版社,2008.11ChengJie,LuZiyi.Linuxwindowsprogramdesign[M].Beijing:TsinghuaUniversitypress,2008.11[14]Eastbourne(EEzust,A.),Eastbourne(Ezust,P.).C++design patterns

-

basedon

Qt4

opensource

cross-platformdevelopmentframework[M].Beijing:TsinghuaUniversitypress,2007[15]郑莉,董江周.C++语言程序设计(第4版)[M].清华大学出版社,2010 ZhengLi,DongJiangzhou.C++languageprogramdesign(FourthEdition) [M].TsinghuaUniversitypress,2010[16]黄丽琴,丁林松.Qt4图形设计与嵌入式开发[M].人民邮电出版社,2009HuangLiqin,DingLinsong.Qt4graphicdesignandsoftwaredevelopment of[M].people'spostandTelecommunicationsPress,2009[17]谭浩强,张基温,C语言程序设计教程(第3版)[M].高等教育出版社,1991年08月[18]陈超,C语言常用函数速查手册[M],化学工业出版社,2010年06月[19](美)AndreiAlexandrescu著,侯捷,於春景译,C++程序设计语言(特别版),华中科技大学出版社[20]韦东山,嵌入式应用开发完全手册[M],人民邮电出版社[21](美)(KennethA.Reek),C与指针,人民邮电出版社,2008年[22](美)史蒂文斯,(美)拉戈著,尤晋元,张亚英,戚正伟译,unix环境高级编程,人民邮电出版社,2006年5月

外文

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论