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

下载本文档

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

文档简介

基于QT的俄罗斯方块游戏设计与实现摘要为了能够更进一步掌握QT编程,我决定用QT开发一个单机版的的俄罗斯方块游戏。俄罗斯方块的实现由四块正方形的色块组成,计算机随机产生不同七种类型的方块,根据计算机时钟控制它在一定的时间不停的产生,用户根据键盘的四个方向键控制翻转、向左、向右和向下操作,(控制键的实现是由键盘的方向键的事件处理实现)。然后程序根据这七种方块堆叠成各种不同的模型。本次设计用到的工具是基于UBUNTU或WINDOWS下的QT软件实现,图行界面的处理都是代码实现论文描述了游戏的历史,开发此游戏的环境,游戏开发的意义。遵循软件工程的知识,从软件问题定义开始,接着进行可行性研究、需求分析、概要设计、详细设计,最后对软件进行了测试,整个开发过程贯穿软件工程的知识体系。本游戏操作简单,界面清晰,让玩家容易上手操作。关键词游戏设计;算法;数组;事件;QTDESIGNANDIMPLEMENTATIONOFTETRIS,BASEDONTHEQTABSTRACTINORDERTOFURTHERGRASPTHEQTPROGRAMMING,IDECIDEDTOUSEQTTODEVELOPASTANDALONEVERSIONOFTHEGAMETETRISTETRISIMPLEMENTATIONISCOMPOSEDOFFOURSQUAREOFCOLORPIECE,THECOMPUTERRANDOMLYGENERATEDIFFERENTSEVENTYPESOFSQUARE,ACCORDINGTOTHECONTROLITINACERTAINAMOUNTOFTIMEONTHECOMPUTERCLOCK,USERSACCORDINGTOTHEFOURKEYBOARDDIRECTIONKEYCONTROLFLIP,LEFT,RIGHTANDDOWNOPERATION,THEREALIZATIONOFTHECONTROLKEYISBYTHEKEYBOARDDIRECTIONKEYEVENTHANDLINGIMPLEMENTATIONTHENTHEPROGRAMACCORDINGTOTHESEVENSQUARESSTACKINTOAVARIETYOFDIFFERENTMODELSTHEDESIGNTOOLUSEDISBASEDONTHEQTUNDERUBUNTUORWINDOWSSOFTWARE,THEGRAPHLINEINTERFACEPROCESSINGISCODETOACHIEVETHETHESISHASDESCRIBEDTHEGAMEHISTORY,HASDEVELOPEDTHISGAMEENVIRONMENT,DEVELOPMENTSIGNIFICANCEOFGAMEKNOWLEDGEABIDINGBYASOFTWAREENGINEERING,DEFINITIONBEGINSFROMSOFTWAREPROBLEM,PROCEEDTOCARRYOUTFEASIBILITYSTUDY,NEEDANALYSIS,ESSENTIALSDESIGN,DETAILEDDESIGN,THEATLASTHASCARRIEDOUTATESTINGONTHESOFTWARE,ENTIREEXPLOITATIONPROCESSHASRUNTHROUGHTHESOFTWAREENGINEERINGKNOWLEDGEHIERARCHYTHISGAMEISSIMPLE,CLEARINTERFACE,EASYOPERATIONFORPLAYERSKEYWORDSGAMEDESIGN;CALCULATEWAY;SEVERAL;EVENT;QT目录摘要IABSTRACTII目录31绪论111开发目的112俄罗斯方块游戏的现状113研究的主要内容214研究的意义22可行性研究421设计目的422软件问题定义423可行性分析4231技术可行性4232经济可行性4233操作可行性5234法律可行性524结论意见53需求分析631引言632游戏功能分析6321系统概述6322系统运行环境733游戏的UML基本模型7331游戏的用例图7332游戏的状态图8333游戏的活动图94游戏详细设计1141图形实体类TETRIXPIECE实现11411图形的产生11412图形的旋转1242游戏内容的实现13421游戏实现控制方式13422方块下移13423满行及消行判断14424绘制游戏区域及方块14425键盘事件响应1443游戏主窗体的实现145代码分析1651TETRIX工程1652MAINCPP主程序代码1653TETRIXBOARDH头文件代码1754TETRIXBOARDCPP程序代码18541游戏初始化,复位的实现18542游戏开始与暂停19543按键控制游戏20544计时模块21545方块的活动21546过关与奖励22547方块颜色控制2355TETRIXPIECEH头文件代码2456TETRIXPIECECPP程序代码2557TETRIXWINDOWH头文件代码2658TETRIXWINDOWCPP程序代码27581显示框27582功能按钮27583信号与槽28584游戏面板布局286整体测试2961游戏运行测试2962游戏界面测试2963界面功能测试3064测试总结33结论34致谢36参考文献37外文原文39中文翻译471绪论11开发目的在现金电子信息高速发展的时代,电子游戏已深入人们的日常生活,由于经典有趣,因而得到了广泛的流行,成为老少皆宜的娱乐方式。俄罗斯方块是一款风靡全球的游戏,最初是由苏联人制作的,规则简单,容易上手且游戏全过程变化无穷,可以让玩家充分感受游戏中的乐趣。俄罗斯方块游戏可以说是随计算机的发展而发展,并不断推陈出新演变出各种类似游戏,深受广大玩家喜爱。这个游戏有的简单,有的复杂,但其根本原理是一样的都是对运动的方块进行组合,来训练玩家的反应能力。谈到游戏软件,大多数人都认为其神妙莫测,高不可及。而一般游戏软件也确实具有很高的技术难度,随着开发工具及软件开发方法学的不断发展,动手开发游戏也不是十分困难的。俄罗斯方块游游戏软件不计其数,网上就有好多关于实现的复杂算法和设计,其难度让一般初学者望而却步。而俄罗斯方块是编程的入门项目,它可以检验编辑人员的知识熟练程度。在游戏设计方面,俄罗斯方块游戏的设计工作既复杂又富有挑战性,它包含的内容多,涉及的知识广泛,与图形界面联系比较大。游戏是一种新兴的媒体,是一种新的设计领域,也是一种新的艺术形式。同时开发电脑游戏可以提高学生研究和学习的兴趣,培养他们通过互联网收集和获得信息、分析整理信息、撰写报告论文等能力。俄罗斯方块的开发无疑是给电脑游戏的增加了色彩,拓宽了电脑游戏的平台,给人们带来乐趣。12俄罗斯方块游戏的现状小方块的魅力经久不衰。截至2009年,俄罗斯方块发售了125亿份,受到50多个国家和地区的玩家喜爱,有超过50种语言的版本,运行在几十种游戏平台上,从掌机、街机、个人电脑,到手机和PDA。美国蓝色行星软件公司总裁亨克罗杰斯说,移动设备已经成为俄罗斯方块新的主要平台,该领域的发售量已超过7500万份,并且还在快速增长。在俄罗斯方块网络版的北美和欧洲官方网站上,每天超过100万人次玩这个游戏。俄罗斯方块成功的奥妙在哪里它的创造者帕基特诺夫认为,可能在于这个游戏非常简单,而且拼图的过程有“从混乱中寻找秩序”的成就感。罗杰斯则说,俄罗斯方块是一个建设性的游戏,这一点与中国的围棋相似,“国际象棋就是杀杀杀,围棋则重视构建领地,是建设性的,俄罗斯方块也是”。25年过去了,电脑业和电子游戏业都发生了巨大变化,拥有华丽画面、震撼音效和丰富剧情的大型游戏包括网络游戏纷纷出现,开辟并占据了新的市场。俄罗斯方块这样的游戏还有前途吗帕基特诺夫认为还很有前途。他说,俄罗斯方块是一个休闲游戏,它面对的是那些没有精力或兴趣玩大型游戏的玩家,这些人需要一类简单好玩的游戏,拿起来就能进入状态,在忙碌的生活中寻求片刻放松。帕基特诺夫表示,将对俄罗斯方块进行改进,使人们能够更容易从中获得休闲乐趣。罗杰斯说,今后的努力方向包括发展俄罗斯方块的竞技性,开发能够适应玩家特点的“智能”俄罗斯方块,并使来自世界各地、说不同语言的人们能够一起娱乐,通过这个游戏寻求共同点。对于中国市场,现在俄罗斯方块已集成到即时通讯软件中国腾讯QQ中,即为火拼俄罗斯。另外,联众世界也有单机版的俄罗斯方块和网络版的俄罗斯方块。由此看来,俄罗斯方块经典还将继续。13研究的主要内容俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。这款游戏最初是由苏联的游戏制作人ALEXPAJITNOV制作的,它看似简单但却变化无穷,令人上瘾。相信大多数用户都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时代。从游戏的基本玩法出发,主要就是俄罗斯方块的形状和旋转,我在设计中在一个图片框中构造了一些的网状小块,由这些小块组合成新的形状,每四个小块连接在一起就可以构造出一种造型,因此我总共设计了7种造型,每种造型又可以通过旋转而变化出24种形状,利用随机函数在一个预览窗体中提前展示形状供用户参考,在游戏窗体中用户就可以使用键盘的方向键来控制方块的运动,然后对每一行进行判断,如果有某行的方块是满的,则消除这行的方块,并且使上面的方块自由下落,最后就可以得出用户的分数。14研究的意义那么研究基于QT的俄罗斯方块游戏有什么意义呢虽然目前俄罗斯方块游戏已经有各种语言的不同版本,并且已经将其搬上了网络的平台,单人、双人单机对战和双人网络对战等各种模式均已被大众熟知。由于开发平台不统一,造成软件的管理和使用极不方便,并且容易受到软硬件环境更新的影响,限制了这些新技术在科研生产中发挥更好的作用如果舍弃原有软件而重新开发,将会耗费大量的人力和资金,而且浪费了许多成熟的软件成果。而QT在源代码级上实现了跨平台特性,极大的支持了跨平台通用软件的开发。QT可以用同一个源程序在不同平台上编译链接,生成目标代码,并取得相同的运行效果,称为“一次编写,随处编译”,利用这种方法充分实现了程序的跨平台运行。这种基于源代码的跨平台特性不仅解决了性能的问题,而且可以发挥各个平台的优势,充分利用每个平台自身的特点;并且即可以在新环境下实现原有软件的功能和特点,减少开发费用,还可以改进原有软件的不足,增加新的需求,从而提高软件的质量,延长软件生命期。因此,利用LINUX下基于QT的应用程序开发是一个非常有意义的课题,具有重要的研究和商业价值。另外,通过本游戏的设计,检验了学习效果和动手能力,进一步深入QT的学习,提高自己的编程水平,从而达到理论与实践相结合的目的。在成为一个真正的游戏开发者的路上,俄罗斯方块是一个完美开始。为什么因为它包括任何一个游戏中所有的元素。并且,不需要艺术家般的才能就能做出非常好看的俄罗斯方块游戏。任何一个能画出方块的人,每个作图形程序的人,就能做出商业品质的俄罗斯方块游戏。以俄罗斯方块开始还有另外一个好处,不仅能做出一个完整的既好玩又容易上瘾游戏,而且它看上来和那些商业版本没什么区别。方块就是方块,不管是谁画出它们的,而且TETRAMINOS(俄罗斯方块中使用的形状)也不过是一些方块的组合。俄罗斯方块拥有所有游戏共通的独立成份。它有一个游戏循环(这个过程被反复执行直到游戏退出)。这个游戏循环读取玩家的输入,处理这个输入,然后更新游戏的元素(下落的TETRAMINOS),并且检查是输还是赢。以后要做的所有的简单的游戏都要用到这些东西,所以学习这个过程并且实现它是非常重要的。当第一次完成它之后,以后再做游戏时就能看出那个游戏有多难以及要花多长时间。如果没有完整的完成过这些,哪怕一次,就永远不能完整地正确领会其中的每个元素。当做大的项目时,就更不能确定其复杂性及所要的时间。如果甚至不能正确地领会这整个过程(因为你没能完成它),可能是没能建立一个合适的时间表或估计合适的时间,更有可能的是不够努力。还有,玩俄罗斯方块可以练习人的反映能力,开始时快速的下降会让人手无足措,但适应了之后就会发现自己的反应力变的很快了。另外长时间的手指活动可以让人血液流通加快有利健康。还有俄罗斯方块高手都知道要想赢,就要有远大的布局,决不能只局限于一点一点的减,这在无形中就提高了人的智慧。2可行性研究21设计目的通过俄罗斯方块的设计,综合自己在校以及在杰普公司实习期间所学的理论知识,使自己熟悉应用系统的开发过程,培养独立思考能力,检验学习效果和动手能力,初步掌握软件工程的系统理论,进一步巩固和加强自身对C与C基础知识的理解,提高自己的编程水平,从而达到理论与实践相结合的目的。22软件问题定义基本要求本游戏开发的总体任务是实现游戏的可操作性,以及界面的美观性。整个开发过程遵循软件工程规范,采用MFC编程来实现界面以及事件的控制,用户根据键盘的四个方向键控制翻转、向左、向右和向下操作,通过菜单栏中的相应菜单选项实现游戏的开始、结束、变换方块、积分以及等级的功能。目标通过本游戏的开发,主要实现游戏的可操作性以及美观性,同时使自己对C语言的了解更进一层,为将来的实际工作打下坚实的基础。条件、假定和限制由于知识以及能力的限制,本游戏所实现的功能不够强大,可对本游戏进行改善,从而增强游戏的功能。可行性研究的方法通过研究分析俄罗斯方块所具备的能力及实现的方法、确定主体结构。利用现阶段我所能达到的能力,以最简洁、最容易的办法,边开发边测试边修改,实现一个初级游戏软件。评价尺度由于本软件是一个初级产品,对其要求不是太苛刻,所以能够达到俄罗斯游戏的一般功能即可。23可行性分析231技术可行性开发本游戏的编程语言有多种,考虑到自身对语言的掌握程度,选择C语言进行游戏的开发,采用GUI编程来实现界面以及事件的控制。232经济可行性本游戏是为丰富人们业余生活开发的,规模适中,工作复杂性低,实用性强。从开发人力、物力、时间上考虑,开发成本少。而且利用C与C程序,加快了开发进度,大大的缩短了开发周期,节省了人力、物力、时间,提高了项目开发的效率,降低了开发成本。由于需求分析完整,减少了很多后期维护的复杂性。另外,本系统具有很实用的现实意义。因此,从经济角度考虑在线考试系统的开发在经济上是完全可行的。233操作可行性本游戏是采用QT下的GUI图形用户界面组件创建的简单有好的操作界面,运行也效果简单明了,所有功能均根据基本需求进行开发。强调人机环境三者作为一个系统进行总体设计。使操作更人性化,减轻了用户的认知负担,使其更适合用户的操作需求。对所有数据的输入进行完整性和合法性检查,尽量减少误操作。因此在操作上是可行的。234法律可行性本游戏的开发主要为了完成毕业设计,开发的主体是个人,不存在法律上的侵权行为,也不会为社会造成影响,这方面是完全可行的。24结论意见综上所述,本游戏软件的技术成熟、完备。各方面均无重大问题,因此本游戏软件可开始着手编写。3需求分析31引言需求分析是软件定义时期的最后一个阶段,也是关系到软件开发成败的关键步骤。确定系统必须完成哪些工作,也就是对目标系统提出完整、准确、清晰、具体的要求。在这个阶段中,开发者要做大量的调查和研究,收集信息,明确系统功能。需求分析的结果是系统开发的基础,它的成功与否直接关系到项目的成败和软件的质量。对软件需求的理解程度是决定软件开发工作成功与否的至关重要的环节,需求分析的任务是发现、规范的过程,有益于提高软件开发过程中的能见度;便于对软件开发过程进行控制与管理;便于采用工程方法开发软件,提高软件的质量;便于开发人员、维护人员、管理人员之间的交流、协作。32游戏功能分析321系统概述28种状态的方块随机产生,自由下落,落下时可由玩家用上、下、左、右控制键控制翻转和移动,以便以玩家所需要的形态和位置落下。如果落下时,方块的方格能填满某一行,则这一行可消去。消去一行后,游戏可给玩家加分,若由存在空格的方块填满整个窗口,则游戏失败。游戏功能需求如下游戏界面需求设计良好的游戏界面可以让玩家充分感受到游戏带来的娱乐性,游戏的背景色是黑色,方块用蓝色颜色,在一定的区域内运动和变形,落下后的障碍物用黄色显示,这样看起来会有一定的美感。游戏形状需求用数组作为存储方块28种状态的数据结构,即长条形、Z字形、反Z形、田字形、7字形、反7形、T字型,各个方块要能实现它的变形,可设为顺时针或逆时针变形,一般为逆时针。键盘处理事件需求方块下落时,可通过键盘方向键(上、下、左、右键)对该方块进行向上变形,向下(加速)、向左、向右移动。鼠标处理事件需求通过点击菜单栏中相应的菜单项,可以实现游戏的开始、结束,方块形状的变换,分数、等级的显示,以及游戏帮助等功能。显示需求当不同的方块填满一行时可以消行,剩余方块向下移动并统计分数。当达到一定分数的时候,会增加相应的等级。322系统运行环境操作系统UBUNTU1204或WINDOWS硬件环境内存400G硬盘500MCPUP7450213GHZ开发工具QT52033游戏的UML基本模型331游戏的用例图用例图是由软件需求分析到最终实现的第一步,它描述人们希望如何使用一个系统。用例图在需求分析阶段有很重要的作用,它是作为参与者的外部用户所能观察到的系统功能的模型图,它显示多个外部参与者以及他们与系统提供的用例之间的连接4。整个开发过程都是围绕需求阶段的用例进行的。通过分析确定本系统的抽象参与者有计算机和玩家两类。1)计算机COMPUTER。计算机可以实现方块定时下移、随机产生方块、自动消除满行、更新分数、报告游戏结果等。计算机控制游戏的用例图如图31所示。图31计算机控制游戏的用例图2)玩家PLAYER。玩家是本游戏的重要参与者。玩家可以选择控制方块。控制方块用例包括旋转方块、左移方块、右移方块、下移方块、丢下方块等用例。其中玩家可以控制游戏和设置游戏,控制游戏用例又包括控制游戏状态和控制背景音乐。控制游戏状态用例包括开始游戏、暂停游戏、继续游戏、从新开始、退出等用例,其中从新开始是对开始游戏用例的扩展图32玩家操作游戏的用例图332游戏的状态图状态图是系统分析的一种常用工具,它能够表征系统的变化状态。游戏的状态图如图33所示。停停停停停停停停停停停停停停停停停停停停停停停停停停停停停停停停停停停停停停停停停停停停停停停停停停停停停图33游戏状态图玩家进入单机版游戏模式后,可以点击“开始”按钮开始游戏,游戏进行过程中如果游戏最小化或者玩家点击“暂停”按钮或菜单项,则游戏暂停。如果游戏界面恢复或玩家点击“继续”按钮或菜单项则游戏可以继续,游戏进行过程中玩家还可以点击“停止”按钮或菜单项,使游戏停止。无论游戏是否进行,玩家都可以点击“退出”按钮或菜单项退出游戏。333游戏的活动图活动图是UML用于对系统的动态行为建模的一种常用工具,它描述活动的顺序,展现从一个活动到另一个活动的控制流。活动图在本质上是一种流程图。俄罗斯方块游戏总的活动图如图34所示。一旦游戏开始,玩家即可对游戏的状态进行控制,包括暂停游戏、继续游戏、关于游戏和退出游戏的操作,当感觉马上会失败时,换可以选择从新开始游戏。当游戏结束,玩家可退出游戏。34俄罗斯方块游戏的活动图4游戏详细设计游戏的实现主要由三个部分设计而成方块图形的产生处理、主窗口(画布)的显示以及游戏的具体实现方式。其中方块的处理TETRIXPIECEH、TETRIXPIECECPP实现各种形状方块的产生和变化,主窗口TETRIXWINDOWH、TETRIXWINDOWCPP是游戏的显示部分(包括LCD的数字显示),游戏的具体实现TETRIXBOARDH、TETRIXBOARDCPP则是游戏的核心部分,包括游戏的开始事件、暂停事件、键盘响应、计时以及消行等。41图形实体类TETRIXPIECE实现411图形的产生定义一个枚举类型,表示方块的七种形状,通过图形实体类TETRIXPIECE的SETRANDOMSHAPE方法随机产生一个初值,用于产生图形的某种状态,如图41和图42所示图41图形的随机产生图42俄罗斯方块图形每个形状由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,1412图形的旋转图形的旋转是通过绘制4个方向的方块,在不同旋转角度显示不同方向的方块来实现的。定义一个函数ROTATEDLEFTCONST,当每次响应键盘向上的方向键时,方块顺时针旋转90度,同时画布刷新一次,这样,方块的变形就实现了。42游戏内容的实现421游戏实现控制方式游戏核心功能游戏区域的绘制、方块的移动、游戏区域背景及区域内方块的绘制、游戏的运行、游戏的满行及消行、游戏的结束判断。游戏其他功能游戏区域及方块颜色设置、响应键盘按下事件。422方块下移功能判断图形能否向下移动,显示下移后的界面,或者游戏结束。实现先向下移动一步,此时并不在界面上显示下移后的界面,判断是否到底,若到底则消行记录分数、出现下一个图形;判断是否一开始就与其它图形重合,若是则游戏结束;经过以上判断,此时方可显示下一步后的界面,并进入下一次计时,流程图如图43所示图43下移一步流程图423满行及消行判断功能判断是否有已满行,然后把该行消去。实现游戏在方块下移到底后,利用循环判断有几行已满,并对已满行进行清零和进行加分操作,同时更新窗口,从而实现消行的效果。424绘制游戏区域及方块通过调用QPAINTER的DRAWLINE的方法绘制游戏网格,调用QPAINTER的DRAWPIXMAP和DRAWRECT绘制方块背景和边框。425键盘事件响应俄罗斯方块是通过上下左右移动来控制游戏的运行,那么是具体如何实现的呢这就需要用到键盘的按下事件,通过响应键盘的按下事件来实现。本游戏设计的是用上下左右方向键键来控制游戏的操作,其中左右方向键控制方块向左向右移,向上键控制方块的形状,操作向下键则方块直接下坠。键盘响应事件功能图如图44所示图44键盘事件功能图具体代码实现通过重新实现虚函数QWIDGETKEYPRESSEVENT来响应相应的键盘按键事件。43游戏主窗体的实现游戏主窗体是整个游戏的显示部分,主要用于放置绘制好的游戏区域,显示游戏玩家的得分情况、关卡和其它基本信息。游戏区域的宽分成10等分,高分成22等分,也就是说每行有10小矩形,总共有22行(BOARDWIDTH10,BOARDHEIGHT22)。左边是LCD的显示部分,LCD的显示最大为五位数。分为分数(SCORELCD)、等级(LEVELLCD)、消行(LINESLCD)。另外,主窗体还设计了游戏的选项按钮,方便游戏者的操作。5代码分析51TETRIX工程每个程序都有一个工程,此工程下包含各种头文件以及对应的函数,本工程包含的头文件有TETRIXBOARDH,TETRIXPIECEH,TETRIXWINDOWH,三个函数TETRIXBOARDCPP,TETRIXPIECECPP,TETRIXWINDOWCPP,后面将对各头文件及函数具体分析。由于游戏代码量大,时间仓促,而且刚学QT,运用不是很熟练,本设计在老师的指导下完成,有部分代码框架是老师代为实现,本人主要对TETRIXBOARDCPP部分,包括游戏各功能的实现,游戏加分奖励机制,方块的移动方式,按键的映射,按钮与槽的链接,计时模块等核心内容进行编程实现。截图如图51。后面将对各部分详细说明。图51TETRIX工程52MAINCPP主程序代码MAIN函数是C,C,QT程序的入口,MAIN函数代码少,起引导作用,也包括程序的出口。INTMAININTARGC,CHARARGV/C入口QAPPLICATIONAPPARGC,ARGV/QT入口TETRIXWINDOWWINDOWWINDOWSHOWQSRANDQTIME0,0,0SECSTOQTIMECURRENTTIMERETURNAPPEXEC/C于QT出口WINDOWSETWINDOWICONQICON“/CHROMEICO“WINDOWSHOW/当前时间作为随机种子QSRANDQTIME0,0,0SECSTOQTIMECURRENTTIMERETURNAPPEXEC/程序的事件循环53TETRIXBOARDH头文件代码TETRIXBOARDH头文件主要是声明了各个按钮,显示窗口的实现方法,以及窗体尺寸,头文件只起到声明的作用,具体的实例化在函数中实现。TETRIXBOARDQWIDGETPARENT0VOIDSETNEXTPIECELABELQLABELLABELQSIZESIZEHINTCONST/最适合大小QSIZEMINIMUMSIZEHINTCONST/最小限制PUBLICSLOTS/公有槽VOIDSTARTVOIDPAUSEVOIDRESTARTSIGNALS/信号只需声明,根据参数变化来判断VOIDSCORECHANGEDINTSCOREVOIDLEVELCHANGEDINTLEVELVOIDLINESREMOVEDCHANGEDINTNUMLINESPROTECTED/着色、键盘、计时事件其中着色事件随着UPDATE不断触发VOIDPAINTEVENTQPAINTEVENTEVENTVOIDKEYPRESSEVENTQKEYEVENTEVENTVOIDTIMEREVENTQTIMEREVENTEVENTPRIVATEENUMBOARDWIDTH10,BOARDHEIGHT22/把主游戏区宽分成10等份,高分成22等份,也就是说每行有10小矩形,总共有22行TETRIXSHAPEINTTIMEOUTTIMERETURN1000/1LEVEL/CONTENTSRECT返回当前布局QLAYOUT的矩形,可访问其长、宽/CONNTENTSRECTWIDTH/BOARDWIDTH把游戏区矩形的宽分成了BOARDWIDTH份INTSQUAREWIDTHRETURNCONTENTSRECTWIDTH/BOARDWIDTH/同上,把高分成了BOARDHEIGHT份INTSQUAREHEIGHTRETURNCONTENTSRECTHEIGHT/BOARDHEIGHT/此时SQUAREWIDTH,SQUAREHEIGHT分别是分割后的小矩形宽和高VOIDCLEARBOARD/清屏VOIDDROPDOWN/下落事件VOIDONELINEDOWN/下落一行VOIDPIECEDROPPEDINTDROPHEIGHTVOIDREMOVEFULLLINES/移除填满的行VOIDNEWPIECE/新方块VOIDSHOWNEXTPIECE/显示下一个方块BOOLTRYMOVECONSTTETRIXPIECE/判断方块是否可以移动VOIDDRAWSQUAREQPAINTER/着色QBASICTIMERTIMER/相当于QLABELNEXTPIECELABELQPOINTERNEXTPIECELABELBOOLISSTARTEDBOOLISPAUSEDBOOLISWAITINGAFTERLINETETRIXPIECECURPIECE/当前方块TETRIXPIECENEXTPIECE/下一个方块INTCURXINTCURYINTNUMLINESREMOVEDINTNUMPIECESDROPPEDINTSCOREINTLEVELTETRIXSHAPEBOARDBOARDWIDTHBOARDHEIGHTQIMAGEM_IMAGE54TETRIXBOARDCPP程序代码此部分实现功能多,代码量大,是本设计游戏功能实现的核心,这里将其拆分成几个小模块来解释说明。541游戏初始化,复位的实现TETRIXBOARDTETRIXBOARDQWIDGETPARENTQFRAMEPARENTSETFRAMESTYLEQFRAMEPANEL|QFRAMESUNKEN/面板,方块活动界面SETFOCUSPOLICYQTSTRONGFOCUS/设置焦点ISSTARTEDFALSE/赋初值ISPAUSEDFALSE/赋初值CLEARBOARD/游戏开始前清空底板NEXTPIECESETRANDOMSHAPE/下一个显示,随机显示图形/随机产生方块形状/默认尺寸VOIDTETRIXBOARDSETNEXTPIECELABELQLABELLABELNEXTPIECELABELLABEL/实例化出来下一个方块显示QSIZETETRIXBOARDSIZEHINTCONSTRETURNQSIZEBOARDWIDTH15,BOARDHEIGHT15/面板默认尺寸QSIZETETRIXBOARDMINIMUMSIZEHINTCONST/最小尺寸RETURNQSIZEBOARDWIDTH5,BOARDHEIGHT5/初始化542游戏开始与暂停/游戏开始VOIDTETRIXBOARDSTARTIFISPAUSED/判断是否处于暂停状态RETURNISSTARTEDTRUE/游戏开始为真ISWAITINGAFTERLINEFALSE/NUMLINESREMOVED0/刚开始游戏没有消除行,所以为0NUMPIECESDROPPED0SCORE0/开始前分数为零,游戏开始,分数开始改变LEVEL1/开始时关卡为1CLEARBOARDEMITLINESREMOVEDCHANGEDNUMLINESREMOVEDEMITSCORECHANGEDSCOREEMITLEVELCHANGEDLEVEL/各部分功能激活,开始工作NEWPIECETIMERSTARTTIMEOUTTIME,THIS/记时器开始计时/暂停功能VOIDTETRIXBOARDPAUSEIFISSTARTED/判断游戏是否已经开始RETURNISPAUSEDISPAUSEDIFISPAUSEDTIMERSTOP/如果处于暂停状态,停止计时ELSETIMERSTARTTIMEOUTTIME,THISUPDATEVOIDTETRIXBOARDPAINTEVENTQPAINTEVENTEVENTQFRAMEPAINTEVENTEVENT/绘图事件QPAINTERPAINTERTHISQRECTRECTCONTENTSRECT/IFISPAUSEDPAINTERDRAWTEXTRECT,QTALIGNCENTER,TR“ZZIABRIUP“/暂停时方块活动窗口显示内容,当然可以改为其它,比如“PAUSE”。RETURN543按键控制游戏/按键控制板块SWITCHEVENTKEYCASEQTKEY_LEFTTRYMOVECURPIECE,CURX1,CURYBREAK/左键控制方块左移,X坐标减小,Y不变CASEQTKEY_RIGHTTRYMOVECURPIECE,CURX1,CURYBREAK/右键控制方块右移,X坐标增加,Y不变CASEQTKEY_DOWNTRYMOVECURPIECEROTATEDRIGHT,CURX,CURYBREAK/下键控制方块向右旋转CASEQTKEY_UPTRYMOVECURPIECEROTATEDLEFT,CURX,CURYBREAK/上键控制方块想做旋转CASEQTKEY_SPACEDROPDOWNBREAK/空格键控制方块直接下降到底部CASEQTKEY_DONELINEDOWNBREAK/D键控制下降加速DEFAULTQFRAMEKEYPRESSEVENTEVENT/按钮触发事件544计时模块/计时模块VOIDTETRIXBOARDTIMEREVENTQTIMEREVENTEVENTIFEVENTTIMERIDTIMERTIMERIDIFISWAITINGAFTERLINEISWAITINGAFTERLINEFALSENEWPIECETIMERSTARTTIMEOUTTIME,THIS/新开时游戏,计时开始ELSEONELINEDOWNELSEQFRAMETIMEREVENTEVENT这里用到多充判断,因为多种情况都涉及到计时的开始于暂停。545方块的活动在方块活动区域,通过按键对方块的活动进行控制,方块本身就有下降的功能,这里方块的坐标随时都在改变。方块活动区域初始状态没有图形VOIDTETRIXBOARDCLEARBOARDFORINTI0I0IFTRYMOVECURPIECE,CURX,NEWY1BREAKNEWY/不断下降,Y坐标跟着减小DROPHEIGHT/而下降的高度增加PIECEDROPPEDDROPHEIGHTVOIDTETRIXBOARDONELINEDOWNIFTRYMOVECURPIECE,CURX,CURY1PIECEDROPPED0/没有左右移动时,只有Y坐标变化546过关与奖励本游戏每分数达到一定分数关卡加一,采用多种奖励加分机制。/分数达到一定程度等级加一VOIDTETRIXBOARDPIECEDROPPEDINTDROPHEIGHTFORINTI0I0IBOOLLINEISFULLTRUE/此行已满,返回真FORINTJ0J0NUMLINESREMOVEDNUMFULLLINES/消除行数显示SCORE10NUMFULLLINES/消除一行再次奖励10分EMITLINESREMOVEDCHANGEDNUMLINESREMOVEDEMITSCORECHANGEDSCORE/分数改变TIMERSTART500,THIS/初始速度,这里以下降间隔时间来/表示,默认第一关500MSISWAITINGAFTERLINETRUECURPIECESETSHAPENOSHAPEUPDATE547方块颜色控制随机产生不同的颜色,这里也由数组控制,列出几种颜色。/方块颜色(随机产生)VOIDTETRIXBOARDDRAWSQUAREQPAINTER/颜色代码块,各种颜色随机出现QCOLORCOLORCOLORTABLEINTSHAPEPAINTERFILLRECTX1,Y1,SQUAREWIDTH2,SQUAREHEIGHT2,COLORPAINTERSETPENCOLORLIGHT/产生亮色PAINTERDRAWLINEX,YSQUAREHEIGHT1,X,YPAINTERDRAWLINEX,Y,XSQUAREWIDTH1,YPAINTERSETPENCOLORDARK/暗色PAINTERDRAWLINEX1,YSQUAREHEIGHT1,XSQUAREWIDTH1,YSQUAREHEIGHT1PAINTERDRAWLINEXSQUAREWIDTH1,YSQUAREHEIGHT1,XSQUAREWIDTH1,Y155TETRIXPIECEH头文件代码TETRIXPIECEH声明定义方块形状的实现,通过坐标来控制,同样这里也只是声明,具体实现不在此处。/俄罗斯方块类方块形状/旋转情况IFNDEFTETRIXPIECE_HDEFINETETRIXPIECE_H/定义一个枚举类型07无形状、Z字形、S字形、直线形,T字形,田字形形、L字形,翻转L字形ENUMTETRIXSHAPENOSHAPE,ZSHAPE,SSHAPE,LINESHAPE,TSHAPE,SQUARESHAPE,LSHAPE,MIRROREDLSHAPECLASSTETRIXPIECEPUBLICTETRIXPIECESETSHAPENOSHAPE/INLINE构造函数初始设置成NOSHAPEVOIDSETRANDOMSHAPE/设置随机规则VOIDSETSHAPETETRIXSHAPESHAPE/构造方块形状的数据结构/通过INLINE公有函数成员SHAPE访问私有数据成员PIECESHAPEPUBLICTETRIXPIECESETSHAPENOSHAPEVOIDSETRANDOMSHAPEVOIDSETSHAPETETRIXSHAPESHAPE/产生图形TETRIXSHAPESHAPECONSTRETURNPIECESHAPEINTXINTINDEXCONSTRETURNCOORDSINDEX0INTYINTINDEXCONSTRETURNCOORDSINDEX1INTMINXCONST/X最小值INTMAXXCONST/X最大值INTMINYCONST/Y最小值INTMAXYCONST/Y最大值TETRIXPIECEROTATEDLEFTCONST/左旋转TETRIXPIECEROTATEDRIGHTCONST/右旋转PRIVATEVOIDSETXINTINDEX,INTXCOORDSINDEX0X/X坐标VOIDSETYINTINDEX,INTYCOORDSINDEX1Y/Y坐标TETRIXSHAPEPIECESHAPEINTCOORDS56TETRIXPIECECPP程序代码VOIDTETRIXPIECESETSHAPETETRIXSHAPESHAPESTATICCONSTINTCOORDSTABLE8420,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/次数组有八个成员,因为虽然只有七种图形,但/是一字型竖起来又是一种新的图形FORINTI0ISETFRAMESTYLEQFRAMEBOX|QFRAMERAISEDNEXTPIECELABELSETALIGNMENTQTALIGNCENTERBOARDSETNEXTPIECELABELNEXTPIECELABEL/下一个将出现的图形预览SCORELCDNEWQLCDNUMBER5SCORELCDSETSEGMENTSTYLEQLCDNUMBERFILLED/分数显示区域LEVELLCDNEWQLCDNUMBER2LEVELLCDSETSEGMENTSTYLEQLCDNUMBERFILLED/关卡显示LINESLCDNEWQLCDNUMBER5LINESLCDSETSEGMENTSTYLEQLCDNUMBERFILLED/消除行数显示582功能按钮STARTBUTTONNEWQPUSHBUTTONTR“STARTBUTTONSETFOCUSPOLICYQTNOFOCUSQUITBUTTONNEWQPUSHBUTTONTR“QUITBUTTONSETFOCUSPOLICYQTNOFOCUSPAUSEBUTTONNEWQPUSHBUTTONTR“PAUSEBUTTONSETFOCUSPOLICYQTNOFOCUS/三个按钮的功能及实现机制583信号与槽CONNECTSTARTBUTTON,SIGNALCLICKED,BOARD,SLOTSTARTCONNECTQUITBUTTON,SIGNALCLICKED,QAPP,SLOTQUITCONNECTPAUSEBUTTON,SIGNALCLICKED,BOARD,SLOTPAUSE1CONNECTBOARD,SIGNALSCORECHANGEDINT,SCORELCD,SLOTDISPLAYINTCONNECTBOARD,SIGNALLEVELCHANGEDINT,LEVELLCD,SLOTDISPLAYINTCONNECTBOARD,SIGNALLINESREMOVEDCHANGEDINT,LINESLCD,SLOTDISPLAYINT/信号与槽的链接,按键产生的信号与槽相连接584游戏面板布局LAYOUTADDWIDGETBOARD,0,0,14,4LAYOUTADDWIDGETCREATELABELTR“分数“,2,7LAYOUTADDWIDGETSCORELCD,3,7LAYOUTADDWIDGETCREATELABELTR“消行“,4,7LAYOUTADDWIDGETLINESLCD,5,7LAYOUTADDWIDGETSTARTBUTTON,8,4,1,2LAYOUTADDWIDGETPAUSEBUTTON,9,6,1,2LAYOUTADDWIDGETABOUTBUTTON,10,4,1,2LAYOUTADDWIDGETQUITBUTTON,11,6,1,2LAYOUTADDWIDGETRESTARTBUTTON,12,4,1,2LAYOUTADDWIDGETHELPBUTTON,13,6,1,2SETLAYOUTLAYOUT/设置该布局,使之有效/QWIDGETSETWINDOWTITLETR“张盛楠毕业设计俄罗斯方块“/设置主窗口标题INTW550INTH530RESIZEW,H/设置主窗口默认大小宽高SETMAXIMUMSIZEW,HSETMINIMUMSIZEW,H6整体测试61游戏运行测试运行QT程序,游戏成功运行如图51所示61游戏成功运行62游戏界面测试当进入游戏后,游戏界面为图62图62界面测试图点击“关于”,显示作者基本信息,如图63所示图63界面测试图点击“游戏帮助”,显示游戏的基本信息,如图64所示图64界面测试图63界面功能测试点击“开始游戏”按钮时游戏立即开始,方块自动下落且形状随机。界面如下图64图64游戏开始功能测试图当点击“暂停游戏”时,游戏则停止,方块停止下落,此时的界面为图65游戏暂停功能测试图当游戏进行进行一段时间后对游戏等级,分数,消行显示框进行测试如图661与662图661等级,分数,消行显示框进行测试图图662等级,分数,消行显示框进行测试图若由存在空格的方块填满整个窗口,则游戏失败,此时会立即弹出游戏结束的对话框。此时的游戏界面为图66游戏结束功能测试图64测试总结游戏代码的分析到此结束,通过本设计,我熟练掌握了QT中图形界面的实现,信号与槽的链接,对C与C时学过的数组,循环,指针,条件判断等有了进一步的理解,运用更灵活,增强了动手动脑能力,对编程有了新的认识,对所学知识确实起到了复习巩固的作用。本游戏操作简单,界面清晰,让玩家容易上手操作,但是由于本人技术有限,本游戏所实现的功能不够完善,不够强大,表现在不能建立连接,因此游戏只供单人玩,界面也不够美观,可选择的窗口风格少,以后可对本游戏进行改善,从而增强游戏的功能。结论游戏设计与实践是一项复杂而且庞大的工作,在选题之后,我才意识到过程的艰难,因为以前从来没有接触过游戏设计,刚开始时有点迷茫和彷徨。后来通过看书和在网上查找资料,逐渐找到了一些感觉,也依照资料自己动手编写了几个简单经典的游戏。本文仅以俄罗斯方块为例予以说明。本次设计让我初步懂得了电子游戏所涉及到的有关技术、方法,包括电

温馨提示

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

最新文档

评论

0/150

提交评论