学位论文—基于qt的俄罗斯方块游戏的设计与实现论文.doc
北京邮电大学毕业设计 基于QT的俄罗斯方块游戏设计与实现摘要为了能够更进一步掌握Qt编程,我决定用Qt开发一个单机版的的俄罗斯方块游戏。俄罗斯方块的实现由四块正方形的色块组成,计算机随机产生不同七种类型的方块,根据计算机时钟控制它在一定的时间不停的产生,用户根据键盘的四个方向键控制翻转、向左、向右和向下操作,(控制键的实现是由键盘的方向键的事件处理实现)。然后程序根据这七种方块堆叠成各种不同的模型。本次设计用到的工具是基于UBUNTU或windows下的QT软件实现,图行界面的处理都是代码实现.论文描述了游戏的历史,开发此游戏的环境,游戏开发的意义。遵循软件工程的知识,从软件问题定义开始,接着进行可行性研究、需求分析、概要设计、详细设计,最后对软件进行了测试,整个开发过程贯穿软件工程的知识体系。本游戏操作简单,界面清晰,让玩家容易上手操作。关键词:游戏设计;算法;数组;事件;QTDesign and implementation of Tetris, based on the QTABSTRACTIn order to further grasp the Qt programming, I decided to use Qt to develop a stand-alone version of the game tetris.Tetris implementation is composed of four square of color piece, the computer randomly generate different seven types of square, according to the control it in a certain amount of time on the computer clock, users according to the four keyboard direction key control flip, left, right and down operation, (the realization of the control key is by the keyboard direction key event handling implementation).Then the program according to the seven squares stack into a variety of different models.The design tool used is based on the QT under UBUNTU or windows software, the graph line interface processing is code to achieve. The thesis has described the game history , has developed this game environment, development significance of game. Knowledge abiding by a software engineering, definition begins from software problem , proceed to carry out feasibility study , need analysis , essentials design , detailed design, the at last has carried out a testing on the software , entire exploitation process has run through the software engineering knowledge hierarchy. This game is simple, clear interface, easy operation for players.Key words:game design;calculate way;several;event;QT ii 目 录摘要iABSTRACTii目 录31绪 论11.1 开发目的11.2 俄罗斯方块游戏的现状11.3 研究的主要内容21.4 研究的意义22 可行性研究42.1 设计目的42.2 软件问题定义42.3 可行性分析42.3.1技术可行性42.3.2经济可行性42.3.3操作可行性52.3.4法律可行性52.4 结论意见53需求分析63.1 引言63.2游戏功能分析63.2.1 系统概述63.2.2 系统运行环境73.3 游戏的UML基本模型73.3.1 游戏的用例图73.3.2 游戏的状态图83.3.3 游戏的活动图94游戏详细设计114.1 图形实体类TetrixPiece实现114.1.1 图形的产生114.1.2 图形的旋转124.2 游戏内容的实现134.2.1 游戏实现控制方式134.2.2 方块下移134.2.3 满行及消行判断144.2.4 绘制游戏区域及方块144.2.5 键盘事件响应144.3 游戏主窗体的实现145代码分析165.1 Tetrix工程165.2 main.cpp主程序代码:165.3 tetrixboard.h头文件代码:175.4 tetrixboard.cpp程序代码:185.4.1游戏初始化,复位的实现185.4.2 游戏开始与暂停195.4.3 按键控制游戏205.4.4计时模块215.4.5 方块的活动215.4.6 过关与奖励225.4.7 方块颜色控制235.5 tetrixpiece.h头文件代码:245.6 tetrixpiece.cpp程序代码:255.7 tetrixwindow.h头文件代码:265.8 tetrixwindow.cpp程序代码275.8.1显示框275.8.2功能按钮275.8.3信号与槽285.8.4游戏面板布局286整体测试296.1游戏运行测试296.2游戏界面测试296.3界面功能测试306.4 测试总结33结 论34致 谢36参考文献37外文原文39中文翻译471绪 论1.1 开发目的在现金电子信息高速发展的时代,电子游戏已深入人们的日常生活,由于经典有趣,因而得到了广泛的流行,成为老少皆宜的娱乐方式。俄罗斯方块是一款风靡全球的游戏,最初是由苏联人制作的,规则简单,容易上手且游戏全过程变化无穷,可以让玩家充分感受游戏中的乐趣。俄罗斯方块游戏可以说是随计算机的发展而发展,并不断推陈出新演变出各种类似游戏, 深受广大玩家喜爱。这个游戏有的简单, 有的复杂, 但其根本原理是一样的都是对运动的方块进行组合, 来训练玩家的反应能力。谈到游戏软件, 大多数人都认为其神妙莫测, 高不可及。而一般游戏软件也确实具有很高的技术难度, 随着开发工具及软件开发方法学的不断发展, 动手开发游戏也不是十分困难的。俄罗斯方块游游戏软件不计其数, 网上就有好多关于实现的复杂算法和设计, 其难度让一般初学者望而却步。而俄罗斯方块是编程的入门项目,它可以检验编辑人员的知识熟练程度。在游戏设计方面,俄罗斯方块游戏的设计工作既复杂又富有挑战性,它包含的内容多,涉及的知识广泛,与图形界面联系比较大。 游戏是一种新兴的媒体,是一种新的设计领域,也是一种新的艺术形式。同时开发电脑游戏可以提高学生研究和学习的兴趣,培养他们通过互联网收集和获得信息、分析整理信息、撰写报告论文等能力。俄罗斯方块的开发无疑是给电脑游戏的增加了色彩,拓宽了电脑游戏的平台,给人们带来乐趣。1.2 俄罗斯方块游戏的现状小方块的魅力经久不衰。截至2009年,俄罗斯方块发售了125亿份,受到50多个国家和地区的玩家喜爱,有超过50种语言的版本,运行在几十种游戏平台 上,从掌机、街机、个人电脑,到手机和PDA。美国蓝色行星软件公司总裁亨克·罗杰斯说,移动设备已经成为俄罗斯方块新的主要平台,该领域的发售量已超过7500万份,并且还在快速增长。在俄罗斯方块网络版的北美和欧洲官方网站上,每天超过100万人次玩这个游戏。俄罗斯方块成功的奥妙在哪里?它的创造者帕基特诺夫认为,可能在于这个游戏非常简单,而且拼图的过程有“从混乱中寻找秩序”的成就感。罗杰斯则说,俄罗斯方 块是一个建设性的游戏,这一点与中国的围棋相似,“国际象棋就是杀杀杀,围棋则重视构建领地,是建设性的,俄罗斯方块也是”。25年过去了,电脑业和电子游戏业都发生了巨大变化,拥有华丽画面、震撼音效和丰富剧情的大型游戏包括网络游戏纷纷出现,开辟并占据了新的市场。俄罗斯方块这样的游戏还有前途吗?帕基特诺夫认为还很有前途。他说,俄罗斯方块是一个休闲游戏,它面对的是那些没有精力或兴趣玩大型游戏的玩家,这些人需要一类简单好 玩的游戏,拿起来就能进入状态,在忙碌的生活中寻求片刻放松。帕基特诺夫表示,将对俄罗斯方块进行改进,使人们能够更容易从中获得休闲乐趣。罗杰斯说,今后的努力方向包括发展俄罗斯方块的竞技性,开发能够适应玩家特点的“智能”俄罗斯方块,并使来自世界各地、说不同语言的人们能够一起娱乐,通过这个游戏寻求共同点。对于中国市场,现在俄罗斯方块已集成到即时通讯软件中国腾讯QQ中,即为火拼俄罗斯。另外,联众世界也有单机版的俄罗斯方块和网络版的俄罗斯方块。由此看来,俄罗斯方块经典还将继续。1.3 研究的主要内容俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。这款游戏最初是由苏联的游戏制作人Alex Pajitnov制作的,它看似简单但却变化无穷,令人上瘾。相信大多数用户都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时代。 从游戏的基本玩法出发,主要就是俄罗斯方块的形状和旋转,我在设计中在一个图片框中构造了一些的网状小块,由这些小块组合成新的形状,每四个小块连接在一起就可以构造出一种造型,因此我总共设计了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。整个开发过程都是围绕需求阶段的用例进行的。通过分析确定本系统的抽象参与者有:计算机和玩家两类。1) 计算机(computer)。计算机可以实现方块定时下移、随机产生方块、自动消除满行、更新分数、报告游戏结果等。计算机控制游戏的用例图如图3-1所示。图3-1 计算机控制游戏的用例图2) 玩家(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.1 Tetrix工程每个程序都有一个工程,此工程下包含各种头文件以及对应的函数,本工程包含的头文件有:tetrixboard.h,tetrixpiece.h,tetrixwindow.h,三个函数tetrixboard.cpp,tetrixpiece.cpp,tetrixwindow.cpp,后面将对各头文件及函数具体分析。由于游戏代码量大,时间仓促,而且刚学QT,运用不是很熟练,本设计在老师的指导下完成,有部分代码框架是老师代为实现,本人主要对tetrixboard.cpp部分,包括游戏各功能的实现,游戏加分奖励机制,方块的移动方式,按键的映射,按钮与槽的链接,计时模块等核心内容进行编程实现。截图如图5-1。后面将对各部分详细说明。图5-1 Tetrix工程5.2 main.cpp主程序代码Main函数是C,C+,Qt程序的入口,main函数代码少,起引导作用,也包括程序的出口。int main(int argc, char *argv) /C+入口 QApplication app(argc, argv); /Qt入口 TetrixWindow window; window.show(); qsrand(QTime(0,0,0).secsTo(QTime:currentTime(); return app.exec(); /C+于Qt出口 window.setWindowIcon(QIcon(":/Chrome.ico"); window.show(); / 当前时间作为随机种子 qsrand(QTime(0,0,0).secsTo(QTime:currentTime(); return app.exec(); / 程序的事件循环5.3 tetrixboard.h头文件代码tetrixboard.h 头文件主要是声明了各个按钮,显示窗口的实现方法,以及窗体尺寸,头文件只起到声明的作用,具体的实例化在函数中实现。 TetrixBoard(QWidget *parent = 0); void setNextPieceLabel(QLabel *label); QSize sizeHint() const;/最适合大小 QSize minimumSizeHint() const; / 最小限制public slots: / 公有槽 void start(); void pause(); void restart();signals: / 信号:只需声明,根据参数变化来判断 void scoreChanged(int score); void levelChanged(int level); void linesRemovedChanged(int numLines);protected: / 着色、键盘、计时事件:其中着色事件随着update()不断触发 void paintEvent(QPaintEvent *event); void keyPressEvent(QKeyEvent *event); void timerEvent(QTimerEvent *event);private: enum BoardWidth = 10, BoardHeight = 22 ; / 把主游戏区宽分成10等份,高分成22等份,也就是说每行有10小矩形,总共有22行 TetrixShape &shapeAt(int x, int y) return board(y * BoardWidth) + x; int timeoutTime() return 1000 / (1 + level); / contentsRect():返回当前布局(QLayout)的矩形,可访问其长、宽 / conntentsRect().width()/BoardWidth 把游戏区矩形的宽分成了BoardWidth份 int squareWidth() return contentsRect().width() / BoardWidth; / 同上,把高分成了BoardHeight份 int squareHeight() return contentsRect().height() / BoardHeight; / 此时squareWidth(),squareHeight()分别是分割后的小矩形宽和高 void clearBoard(); / 清屏 void dropDown(); / 下落事件 void oneLineDown();/ 下落一行 void pieceDropped(int dropHeight); void removeFullLines(); / 移除填满的行 void newPiece(); / 新方块 void showNextPiece(); / 显示下一个方块 bool tryMove(const TetrixPiece &newPiece, int newX, int newY); / 判断方块是否可以移动 void drawSquare(QPainter &painter, int x, int y, TetrixShape shape); / 着色 QBasicTimer timer; / 相当于QLabel *nextPieceLabel QPointer<QLabel> nextPieceLabel; bool isStarted; bool isPaused; bool isWaitingAfterLine; TetrixPiece curPiece; / 当前方块 TetrixPiece nextPiece; / 下一个方块 int curX; int curY; int numLinesRemoved; int numPiecesDropped; int score; int level; TetrixShape boardBoardWidth * BoardHeight; QImage *m_image;5.4 tetrixboard.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(); /下一个显示,随机显示图形/随机产生方块形状/默认尺寸void TetrixBoard:setNextPieceLabel(QLabel *label) nextPieceLabel = label; /实例化出来下一个方块显示QSize TetrixBoard:sizeHint() const return QSize(BoardWidth * 15, BoardHeight * 15); /面板默认尺寸QSize TetrixBoard:minimumSizeHint() const/最小尺寸 return QSize(BoardWidth * 5, BoardHeight * 5);/初始化5.4.2 游戏开始与暂停/游戏开始void TetrixBoard:start() if (isPaused) /判断是否处于暂停状态 return; isStarted = true; /游戏开始为真 isWaitingAfterLine = false; / numLinesRemoved = 0; /刚开始游戏没有消除行,所以为0 numPiecesDropped = 0; score = 0; /开始前分数为零,游戏开始,分数开始改变 level = 1; /开始时关卡为1 clearBoard(); emit linesRemovedChan