基于QT的俄罗斯方块游戏设计与实现

基于QT的俄罗斯方块游戏设计与实现

摘要:信息时代正处于高速发展中,而电子游戏已经成为人生活中或不可少的消磨工具之一。科技时代在不断地高速发展中,游戏相关编程设计也随着发展变得越来越重要, 俄罗斯方块游戏是一款古老传遍世界的经典游戏,这个游戏看似简单易懂但却变化多端。
这个游戏的整体界面展示组成包括方块显示即主要游戏区域、分数等显示框、开始等按键。在游戏过程中由四个正方形组成的形状随机出现,用户按下键盘上的四个方向键操控游戏区域的方块,其中上下左右分别控制组合形状的旋转方向、加速下降、左右运动方向等,最终实现方块在底部满行消除积分,增加等级直至游戏结束。
这个论文课题内容包括俄罗斯方块的发展背景、游戏开发所需环境和开发目的和意义等内容。根据自己所学的知识,本论文分别论述俄罗斯游戏游戏背景与目的、可行性研究分析、需求分析、基本功能、界面设计、测试结果等方面。此游戏设计是在系统支持下,以C++为开发编程语言,在QT Creator 5.3.2版本的编程开发平台上实现游戏设计。
关键词:游戏设计与开发,QT编程,信号,槽函数

Design and implementation of Tetris based on Qt
Abstract:The information age is in the high-speed development, but the electronic game already became one of the people life or essential attrition tools. Tetris is a classic game that has been around the world for a long time, and game related programming is becoming more important as the technology age continues to accelerate, it’s a simple game, but it’s a very varied one. The game’s overall interface display consists of a box showing the main game area, scores and other display boxes, start and other keys. During the course of the game, the shapes composed of four squares appear randomly. The user presses the four directional keys on the keyboard to control the squares in the game area, the top, bottom, left and right respectively control the direction of rotation, accelerated descent, left and right movement direction, etc. . Finally, the bottom of the box full line to eliminate integral, increase the level until the end of the game. This thesis includes the background of Tetris, the environment and the purpose and significance of game development. According to the knowledge, this paper discusses the Russian game background and purpose, feasibility study analysis, demand analysis, basic functions, interface design, test results, etc. . This game design is in the system support, with C + + as the development programming language, in QT Creator 5.3.2 version of the programming platform to achieve game design.
Keywords:Game Design and Development,QT Programming,Signal , Slot function

目 录

第1章 绪 论 1
1.1 游戏背景和意义 1
俄罗斯方块的历史背景 1
1.1.1 游戏软件的现状和意义 1
1.1.2 课题实现的研究意义 2
第2章 课题实现的可行性分析 3
2.1 课题的设计目的 3
2.2 可行性研究前提 3
2.2.1 课题研究的基本要求 3
2.2.2 课题研究的目的 3
2.2.3 课题研究的基本方法 4
2.3 可行性分析 4
2.4 游戏设计结论意见 4
第3章 需求分析 5
3.1 需求分析的含义和目的 5
3.2 游戏的开发需求 5
3.3 俄罗斯方块游戏开发环境平台 6
第4章 课题所需技术支持 7
4.1 面向对象的程序设计 7
4.2 程序设计思想 7
4.3 关于QT平台 7
4.4 QT内部进程通讯机制 9
第5章 课题的设计与实现 11
5.1 建立项目 11
5.2 界面设计 12
5.2.1 窗口大小和命名 13
5.2.2 显示实例化 13
5.2.3 信号与槽函数连接 14
5.2.4 界面布局设计 14
5.3 方块组合实现 14
5.3.1 构造方块组合 15
5.3.2 设置方块随机出现 15
5.3.3 获取方块信息 15
5.3.4 对方块进行变换 16
5.3.5 方块的颜色设置 16
5.4 游戏开始与暂停等功能实现 17
5.5 游戏开始按钮处理 17
5.6 按键处理事件 18
5.7 游戏计时事件 18
5.8 满行消行、等级划分、分数累加 19
5.8.1 实现等级划分 19
5.8.2 实现满行消行 19
5.8.3 实现用户分数累加显示 20
5.9 新方块的产生和下一方块的展示 20
5.9.1 游戏新方块 20
5.9.2 下一方块显示 21
第6章 俄罗斯方块游戏测试 22
6.1 关于软件测试 22
6.2 性能要求 22
6.3 测试的结果 23
参考文献 25
致 谢 26

第1章 绪 论

1.1 游戏背景和意义
俄罗斯方块的历史背景
这个游戏的发明者是利用工作外空闲时间编程出来的,第一次问世是在1984年6月6号。俄罗斯方块游戏是由发明者最喜欢的运动(网球)和希腊字母前缀(tetra-)组合而成的。
1989年4月21日,《俄罗斯方块》被当做唯一捆绑游戏随第一代Game Boy游戏机一同发售,在全球范围内卖出超过1亿台,直到现在也仍旧是一个了不起的数字。俄罗斯方块是游戏与娱乐形式相对匮乏的时代里的一个不可或缺的存在,Game Boy游戏机中的俄罗斯方块游戏是处于波斯湾战争期间的军人用于消磨时光的小游戏这个游戏能够至今还是被大家所熟知,并没有陨落。
游戏的运行规则是用户通过四个方向键改变方块的旋转方向、移动方向和位置等,方块是由四个正方形组成的。游戏过程中这些方块排列满一行或多行,系统消除方块,玩家分数和等级数值增加,剩下的方块移动到底部直到没有空间放置降落的方块。
俄罗斯方块游戏的产权纠纷在历史中存在蛮多的,因为这个游戏容易开发,其他很多产品上面的俄罗斯方块游戏都是没得到授权就被开发。但很多产权纠纷的官司中,持有者却是败诉的,这说明像这种结构和逻辑十分简单的小游戏的产权纠纷中版权持有者是劣势的,致使很多游戏厂家都不想开发这种类型的游戏了。
俄罗斯方块游戏操作规则简单、适用范围广,当时无人不晓,它在历史游戏中获得的评价极高,在很多杂志里面的游戏访问中采访者对俄罗斯方块游戏的评分都十分高,认可了这个游戏的经典之处。
1.1.1 游戏软件的现状和意义
现在,除了美国、韩国等国家外,很多国家也发现了游戏商机,游戏行业越来越发达,已经慢慢成为全球娱乐类中最大的产业,每年有着大于200亿美元的收入。目前北美那边的游戏行业的产值已经差不多靠近整个影视产业的市值了,这些事实结论就可以看出游戏行业在众多行业中的地位以及其发展潜力之大。
我国的游戏行业发展得晚,但有很多游戏都是在推出来的时候就备受年轻人喜欢,在2019年中游戏行业甚至有着947.3亿元的收入,这个数据比上年增加了13.5%,我国的游戏行业经过这几年的发展已经趋于平稳,扩展出去的销售等行业,也处于很好的发展过程。
游戏行业有着宏大的经济发展和大数量的用户,对游戏的规范和合理引导就是必不可少的,游戏开发不再仅限于实现功能,用户体验感和界面视觉效果变得越来越重要。所谓用户体验感就是实现交互设计,而整体界面视觉效果界面布局实现美观,游戏行业越来越注重界面设计,所以现在的游戏开发不再是简单的编程,还涉及到交互和设计等方面。
1.1.2 课题实现的研究意义
俄罗斯方块游戏进化发展到现在已经有1000多种版本了,开发不同版本的游戏需要不同运行环境的开发平台上运行,开发时容易受到软硬件环境的影响,这种影响限制了新技术的作用和功能的实现,许多成熟的软件成果就被搁置了,十分浪费。而且这是一个特别容易上手的小游戏,编程也是比较简单,在玩游戏的过程中可以锻炼玩家的脑力,手机也能够进行一定的运动,大脑有进行思考,对身心都是十分有益的。
Qt可以在多系统上跨平台运转,还能够通过版本控制可视化编辑器和系统,这使编程变得更加方便。Qt能够让同一个源代码在不同的平台实现编译(Compile)和链接(Link),并且运行出来的结果完全一样,这种形式被叫做“一次编写,到处编译”。Qt Creator的跨平台特点一方面实现了编程,另一方面在开发过程中能够减少开发所用开支,还能够通过不同的开发平台环境发现到软件的不足,不断地改进和完善功能软件。
这次课题的开发实现,让我能够熟练运用QT相关开发软件和深入学习C++语言,在这个过程中我充分体会到这两者相结合的独到之处;与此同时,我学会通过思考问题并运用已学内容解决问题,将我自己已经学习的内容进一步稳固,又能够学习到新的内容。

第2章 课题实现的可行性分析

2.1 课题的设计目的
完成本次游戏开发的毕业设计任务;掌握C++编程语言的特点并用此语言完成代码编写;本次设计是基于拥有跨平台的集成开发环境的Qt软件的,熟练掌握Qt编程软件,并且领略平台的独特,掌握跨平台开发的精华;体会跨平台开发软件在代码开发过程中的贡献之处。
通过本次毕业设计熟悉软件开发过程,学会将理想与实践两者完美地相结合,在实践开发这个将已经拥有的知识巩固起来,并且不断学习新知识,不断总结解决困难的办法。
2.2 可行性研究前提
2.2.1 课题研究的基本要求
课题的要求是实现游戏开发的逻辑可操作性、界面美观性、及时反映性、方便性、游戏兼容性;在编码时须遵照标准,使程序编码整体严谨有依据、有序,富有逻辑,并且易于理解,在开发时也须根据计算机软件开发标准,利用面向对象分析与设计(00AD)方法,实现游戏的基本功能,图形化界面是符合美观性的,通过用户按键实现开始和暂停等,游戏进行过程中玩家可通过键盘四个方向键控制方块翻转、下降等,方块在底部满行消除,且分数累加显示。
2.2.2 课题研究的目的
研究该课题过程中我能感受到俄罗斯方块这种简单游戏的独特之处,体验游戏设计与开发的趣味所在;期望最后能够很好地运用QT相关开发软件并且可以进一步地了解到其跨平台地特点、并且对C++编程语言有进一步的掌握,编程和思考逻辑能力等能有所提高。随着俄罗斯游戏的代码编写和设计,检验了学习效果和动手能力,把拥有的知识运行到开发项目中,巩固所学知识基础,加深理解。
2.2.3 课题研究的基本方法
本课题利用行动研究法、文献研究法、经验总结法、案例研究法,测试法等研究基本方法。根据课题题目对整体剖析研究,通过分析建立数据模型等步骤一步步对系统分析成部分,然后画出程序流程图、用例图,对整体功能实现进行描述最终建立出系统逻辑结构。分析结构建立基本架构之后需要后期慢慢进行对游戏功能进行补充和完善,整个过程下来能够使系统整体结构更加完善、数据持久性设计、代码逻辑顺通要求以及界面美观设计,最终实现软件相应功能,完成本次课程开发与实现任务。
2.3 可行性分析
技术可行性分析:本次毕业设计课题是基于Qt Creator开发环境平台,通过C++语言编写代码实现游戏基本功能。因为Qt具有跨平台性,能够使同一个源代码在不同的平台软件上面编译链接运行出一模一样的结果,利用这种“一次编写,到处编译”的方法给跨平台通用软件的开发给予了极大的支持,给编程人员带来很大的便利。
因此此设计课题在技术可行性上是能够进行合理设计的。
经济可行性:这只是一个毕业设计课题,并不需要支付任何经济成本和产生任何经济效益,主要需要一台电脑及线管开发环境平台即可完成设计,因此在经济可行性上是满足开发要求的。
使用可行性:此课题主要完成游戏开始等功能,界面整体简单,玩家通过键盘掌控方块,方块下降后实现整行或者多行消除,消除成功后得到积分。因此游戏整体功能与界面设计实现好后就可以运行供使用,因此具有使用可行性。
社会可行性:本次课题设计属于个人毕业设计,主要由毕业生本人独立完成,与社会发展无直接关系,不会出现各种社会问题。
2.4 游戏设计结论意见
根据上述可行性研究分析与思考,本次基于QT俄罗斯方块游戏设计与实现在可行性研究上是具有绝对可行的,并且拥有一定的使用价值,可以作为毕业设计课题研究开发。

第3章 需求分析

3.1 需求分析的含义和目的
需求分析就是指将疑难点进行具体剖析,将问题需要解决的要求搞清楚,如输入的内容和获得的成果分别是什么,回馈给用户的结果是怎样的;需求分析可以帮助我们确定对计算机系统的需求,确定对最后输出的结果的需求,可见一定的需求分析是十分重要的。
在软件工程中,需求分析是指将系统建立的目的、使用范围和所含功能等描述出来。在开发时需求分析过程是十分关键和重要的,这个过程首先需将客户的需求确定下来,只有确定需求后,编程人员才可以开始着手分析需求并得到好的解决方法。有很多人觉得需求分析在软件开发过程中是最简单的,但随着时间的沉淀,人们开始意识到需求分析的重要之处,它是不可或缺的。一个项目最主要就是在规定时间内解决客户的需求,假如在需求分析过程中因为轻视而导致我们不能正确理解到用户的需求,那么最后出来的项目肯定是不符合客户需求的。
需求分析报告能使代码更加规范化,管理者能更好地管制和操控开发过程,将开发人员和客户之间的沟通目的更好地在开发过程中体现出来,开发需求报告分析能够使程序员更好地根据用户需求编写程序;并且这个报告在后期能够为最终工作成果提供本始根据,期待在更大范围内生产使用。
3.2 游戏的开发需求
以俄罗斯方块游戏为载体开发能够让编程人员在开发过程中充分感受到游戏开发的经典,感受这种简单操作上手的游戏背后蕴涵的精妙,让开发人员能够在整个开发过程中有趣地学习到知识;这个课题是借助Qt环境平台,使用C++编程语言开发的,所以在编程的过程中,学习到Qt软件的使用方法、领悟编程语言的魅力,并体会到两者之间结合的独特之处。
这个游戏是通过键盘对方块进行移动、旋转和摆放等,让这些方块能够通过排列消除得分。具体实现过程是游戏开始会有由方形随机组成的不同形状的组合陆续从屏幕上方落下,用户按下键盘上的上下左右四个键就可以对方块组合的位置还有方向进行调整,方块可在底部排成满一/多行并清除,用户分数得到叠加。剩下的方块慢慢堆积直到触碰到界面顶部,游戏结束,用户被通知游戏失败。
通过前面的需求分析报告,确定此开发最终需要具有以下基本功能:
(1)游戏界面布局:界面代表着用户最直接的视觉体验。这个毕业设计课题的图形界面要满足包括按钮与显示方块翻转降落消除等过程的界面,以及用户分数显示框等;
(2)点击处理:用户用鼠标点击界面按钮,实现按钮功能;
(3)实现方块组合:通过不同方块组合实现游戏,共有七种基础形状(一字型、Z形状、反Z形、正方形、L形状、反L形、T字型),这些方块在界面中进行自由下落运动;
(4)键盘按键事件处理:游戏过程中用户点击键盘操控方块,其中上键来可让随机出现的方块旋转、左右两键控制方块移动方向、而键盘下键能够让方块快速下落到界面底部。
(5)积分实现:方块排列成完整一/多行实现消除,未消除的方块向下移动,消除后累计的分数加到界面显示的用户分数框中显示。
3.3 俄罗斯方块游戏开发环境平台
操作系统:Microsoft Windows10(64位)
开发环境平台:Qt Creator 5.3.2

第4章 课题所需技术支持

4.1 面向对象的程序设计
面向对象程序设计包含各类单独却能够相互调用的对象,如果把它当成一种思想,那么它与将程序当做一连串函数的集合的传统思想是刚好相反的。它觉得任何对象都可以收到和返还数据给别的对象。
这个程序设计方法有利于开发人员对程序的理解,使程序的设计和维护更加简单方便,很多使用者都觉得此方法比以往的对学习更有利。现在在许多大型开发项目中被广泛应用到。当然,一个使用方法有支持者的存在肯定也会有反对者的存在,在某些领域对这个方法也存在着否认的声音,这是一种正常的现象。在某些意义上这个方法也是一种软件开发形式,把它当做是一种软件开发方式时,我们就必须了解更多知识。
4.2 程序设计思想
C++是从C语言直接发展过来的,是对C语言的补充和扩展,是一种面向对象的程序设计语言,C++语言的功能和便捷性都比C强,不过其面向对象的特征比较复杂,如今使用得十分普遍。
C++编程语言的发展历程:它是由Bjame Sgoustrup在贝尔实验室工作时开发的。一开始是作为C语言的有效补充。C++在被科研人员发明后至今,一共经历了3次关键的修订,C++语言在这几次修订中除了作出一些修正还增添了新的特点。其中第三次修订发生在C++语言的标准化过程中。人们创立了一个委员会,这个委员会在九四年提出首个C++语言标准化草案。其中表示委员会在添加新特征的同时必须坚持Stroustrup当初定义的一切特点。
4.3 关于QT平台
Qt Creator是一个集成的编译器,可在多种基本操作系统中运行,编程人员可利用Qt进行开发。
Qt的发展史:Qt是被奇趣科技公司发明出来的,这个公司后面被诺基亚公司受够了,公司旗下的Qt便成为诺基亚红丝旗下的工具。后来,Qt又在2012年的时候被Digia收购,2014年4月,拥有跨平台特征的Qt Creator 3.1.0被正式推出,这个软件的发布达成了对于iOS的整体支持,废弃了没有Python接口的程序调试工具,还新增了部分的插件,将根据Clang(轻量级编译器)的C/C++代码模块集成在一起,在一定程度上也对安卓系统的支持做出了修改。现在基本实现了对IOS、安卓等系统的全面支持。
Qt Creato的代码编辑工具功能包括辅助代码的建立、编写和浏览,能够对C++或者QML编程语言进行完整的表达式检查。如当编程人员键入代码时行与行之间出现错误和警告时能够立即得到指示;通过软件还能够根据语义上对各种变量、类、跳转函数等作出分析说明和上下文关联,对程序提供辅助;还可以对变量进行智能化的命名,例如对在不同域中的两个相同名字的变量任一个进行重命名,并且这对另一个变量不会造成影响;还能够告知编程人员函数程序声明和调用的位置。
Qt Creator具有下列良好特征:
良好的跨平台特征:Qt Creator软件对Windows、Linux等多种操作系统都具有支持性;
面向对象:Qt 具有优良的封装机制、可重用性比较好,Qt 对于回调函数(callback)提供了一种称为 信息与槽(signals/slots)进行代替,这种功能使程序的各个元件之间的配合工作进行地更加简单;Qt也可以看做是一个C++的工具箱,是由几百个C++类构成,这些类在编写程序时都可以被使用,这个软件可以方便地重新编写或者更改现有的组件以防Qt软件不具有真正符合需求的组件。Qt软件还具有其他的特点,如对模块化设计特点和重视软件体系结构的可重用性。编程人员开发过程中能够将这个软件面对对象的特征和模块化设计的特点充分利用出来。
丰富的API接口:API是操作系统留给应用程序的一个调用接口。对于开发人员来说,在开发过程中拥有一套完善的组件,他们就能够直接根据这些已经存在的组件开发出优秀美观的界面;这个软件有着丰富的API函数,还提供各种根据模板的集成接口, 序列化、文件、输入输出设备、date/time类等。
图形绘制:这个软件的绘画类工具是Qpainter,这个类能够绘制各种图形,通过结合使用OpenGL和Qt两个组件达到更好的效果。Qt初始界面如图4-1所示:
在这里插入图片描述

图 4-1 Qt Creator初始界面图
4.4 QT内部进程通讯机制
Qt系统是一个拥有着整体完整的系统结构的系统,这个系统还建立了若干新的系统机制能满足编程人员在编写设计UI界面的应用程序时的各种请求。而这些根据QT的常见用于进程间的通讯机制有三种,分别是QCOP协议(Qt 内部的一种通信协议)、信号-槽(Signal-Slot)机制、FIFO机制。
这里主要针对信号-槽(Signal-Slot)机制进行说明:
信号-槽(Signal-Slot):信号-槽(Signal-Slot)机制是Qt的重点机制,这种机制在QT中有着提供给对象与对象之间的通信的作用。在 Qt中,“信号”=事件,“槽”=对事件作出反应的方法,一个类定义了多个信息和槽,为了完成程序由事件触发,必须要A类的信号与B类的槽通过connet连接起来。GUI工具大多是利用回调函数(一个指针指向着函数)将能够触发的行为定义出来,而信号-槽(Signal-Slot)机制也能够实现相同的功能,因此在Qt中取代了它。并且这个机制不管携带着多少不同类型、数量的参数,系统都不会奔溃十分安全。
这种机制下编程人员能够把很多信号和单独的一个槽函数结合联系起来,相同的,很多槽函数也可以很单独一个信号联系,另外,若把A信号和B信号直接两者联系,A信号被发出的时候信号B就能够被立马发出。
所以,信号-槽两者结合就生成了一种强大功能的编程机制,这种机制的原理如图4-2所示:
在这里插入图片描述

图 4-2信息与槽机制图

第5章 课题的设计与实现

5.1 建立项目
编程人员打开QT软件首先建立应用程序项目,这个项目的名称为游戏的英语game;如图5-1所示:
在这里插入图片描述

图 5-1新建项目图a
命名后就开始建立类,类名称是gameBoard,基类的话点击选择选择QWidget,这个时候软件会自动生成对应名称的头文件和源文件。如图5-2所示:
在这里插入图片描述

图 5-2 新建项目图b
创建项目完成之后,选择源文件进行右键点击,编程人员手动添加两个新文件,这两个新文件的类名一个为gamewindow,另一个为gamepiece,且基类还是选择QWidget,都是QWidget,软件还是会同步自动生成两个对应名称的头文件和源文件,分别为:gamewindow.h、gamewindow.cpp、gamepiece.h、gamepiece.cpp;如图5-3所示:
在这里插入图片描述

图 5-3 添加新文件
整个项目创建完毕,这个命名为tetris的项目文件包括一个main.cpp函数以及三个头文件gamewindow.h、gamepiece.h、gameboard.h,和三个相应的源文件gamewindow.cpp、gamepiece.cpp、gameboard.cpp;
源文件中的gamewindow函数是主窗体函数,这个函数的主要功能是实现主要显示窗体大小和窗口标题定义,设置开始、退出、暂停按钮和分数、等级显示框等部件指针、界面显示布局设计、实现信号和槽(Signal-Slot)函数的连接;而gamepiece函数主要实现显示方块的形状变化,随机方块组合做自由下落运动、控制方块的位置和方向等功能;最后,gameboard函数是游戏开发程序的核心,实现着游戏的主要功能,如鼠标点击事件(如用户点击开始或者暂停)的运行、界面设计显示,方块着色,键盘按键处理事件,计时器处理事件,游戏结束清屏处理,程序主功能的实现,方块完成满一行或多行消除事件,分数叠加显示等级等功能的实现。如图5-4所示:
在这里插入图片描述

图 5-4 项目组成图
5.2 界面设计
主窗体界面有六部分,包括整个游戏界面主窗口、通过关卡显示框、累计分数显示框、消行数的显示框,以及下一个方块预显示,开始按钮、暂停按钮、退出按钮,整体布局如图5-5所示:
在这里插入图片描述

图 5-5 主窗体界面图
5.2.1 窗口大小和命名
TetrixWindow函数是主窗体函数,窗口显示位置和命名都通过此函数实现,一个窗口界面的设置第一步一般就是对整体窗口大小进行设计,下面显示代码中,setWindowTitle就是用于对窗体标题命名,resize(w,h)是设定窗口大小。代码如下所示:
在这里插入图片描述

5.2.2 显示实例化
在主窗口函数的头文件中对需用到的部件指针进行声明,这些部件指针包括开始按钮、退出按钮、暂停按钮,分数显示框、等级显示框、消行数值、下一个方块预显示区等;这些按钮还有显示框的实例化都是通过gamewindow.cpp函数实现,实现代码如下:
在这里插入图片描述

5.2.3 信号与槽函数连接
信号-槽机制是Qt的核心机制,这种机制是一种用于对象之间通信的方法,在Qt中编写程序就是用到这种方法,采用这种机制使对应信号和槽函数的连接影响着程序设计能否实现,这里采用了QObject::connect(信号发射对象,SIGNAL(信号),信号接收对象,SLOT(触发槽))作为信号与槽函数之间连接的结构。代码如下所示:
在这里插入图片描述

5.2.4 界面布局设计
实例化后的按钮还有显示框怎么能够合理地排放好位置呢?主窗体布局设计能够解决这个问题,水平布局与垂直布局两者结合就是对布局进行设计,在这次课题的主窗口布局设计中,这里主要是采用了网格化的排列方式布局,按钮还有显示框都在左边显示,右边显示游戏方块。代码如下所示:
在这里插入图片描述

5.3 方块组合实现
游戏中界面出现随机方形组合,这种组合包括七种不同的形状(一字型、Z形状、反Z形、正方形、L形状、反L形、T字型),用户通过键盘控制方块的方向和位置,这样就共有7x4=28不种同方块形状在界面中显示并实现自由下落运动。如图5-6所示:
在这里插入图片描述

图 5-6 七种基本方块组合形状图
5.3.1 构造方块组合
游戏的实现首先需要构造出七种基础形状,gamepiece.cpp函数中的GameShape函数就是通过枚举顺序的方法还有数组的形式对方块进行构造组合实现,四个小方块组合成7种形状,每个组合形状由4个小方块组成,设置X表示横坐标,Y表示纵坐标,而每行的四个坐标就是这4个小方块的坐标。
5.3.2 设置方块随机出现
游戏玩家点击开始按钮,七种基础形状组合中的任一个随机出现下落,利用系统的时间和通过伪随机函数的设置对组合方块下落增加随机性。主要代码如下所示:
在这里插入图片描述

5.3.3 获取方块信息
方块组合形成后,就是在游戏过程中能够对方块得到获取,主要是对方块的横纵坐标进行获取;这里获取到最小/大横坐标数值分别通过函数QtGlobal::qMin和函数QtGlobal::qMax,代码如下所示:
在这里插入图片描述

5.3.4 对方块进行变换
游戏过程中玩家通过键盘的四个方向键改变方块位置和方向,其中向上键是对方块的旋转方向的控制,共有四个方向,最终就形成了4*7=28种图形组合,这些形状会在主窗口界面上方随机出现并且实现自由下落运动。主要代码如图所示:
在这里插入图片描述

5.3.5 方块的颜色设置
为了整个界面的美观,这里对方块进行不同的着色,使形状在颜色上也有区分,如图5.3.1中方格色彩。代码如下所示:
在这里插入图片描述

5.4 游戏开始与暂停等功能实现
在这里插入图片描述

图 5-7 界面开始、暂停、退出按钮
在界面设计中对开始、退出、暂停按钮都实现了实例化,开发过程中通过代码编写实现按钮对应功能。
5.5 游戏开始按钮处理
开始按钮的处理,首先是判断出这个游戏是否是出于暂停状态,若游戏处于暂停状态,则开始按钮按下无效,系统不作出反应,若游戏并未处于暂停状态,游戏开始。随机出现方块。代码如下所示:
在这里插入图片描述

暂停处理是系统先判断游戏状态,游戏是否是处于开始的状态,非开始状态也非暂停状态则暂停按钮点击无效,系统不坐反应,开始状态且非暂停状态则实现暂停处理函数,游戏出于暂停状态,暂停状态下再次运行暂停处理函数,游戏变成开始状态;游戏暂停状态下,界面显示改变,主窗体界面的主游戏区域方块清除,显示“游戏已暂停”,主要代码如下所示。
在这里插入图片描述

5.6 按键处理事件
玩家通过键盘方向键对随机下落的方块组合进行控制,其中上键是控制方块旋转方向,左右两键对方块进行左右方向的移动控制,下键使方块快速下降至底部。通过键盘处理事件,玩家能够很好地控制方块,实现游戏的运行。代码中是通过tetrixboard.cpp函数中keyPressEvent函数实现键盘处理。主要代码如下所示:
在这里插入图片描述

5.7 游戏计时事件
玩家点击开始按钮后,方块开始进行自由下落运动,系统也开始进行开始计时事件,这个事件是系统先对之前下落的方块状态进行分析,判断其是否下落完毕,若此方块已经下落完毕,则实现新方块的下落,若未下落完毕,则标记状态为有方块正处于下落过程,与此同时在主窗口界面的下一个方块文字下的方块预显示框添加新的方块,此方块就是下一次将要下落的方块形状,并且等到此方块下落完毕,新方进行下落。代码如下所示:
在这里插入图片描述

5.8 满行消行、等级划分、分数累加
游戏过程中,方块满一/多行进行消除,剩下没有被消除的方块随着往底部下降,与此同时,系统将满行消行后取得的分数累加到已有的分数中,分数显示框中的数值更新显示,并且游戏玩家分数累计到一定的程度就会将等级框中的数值累计加一级,并更新显示在主窗口界面中,直到游戏结束。
5.8.1 实现等级划分
系统会根据玩家累计的分数进行相应的等级划分,玩家分数越高游戏的难度越高,闯关等级也是越高。而闯关难度的提高是通过随机出现的方块组合的下降速度的更改实现的。主要代码如下所示:
在这里插入图片描述

5.8.2 实现满行消行
根据俄罗斯游戏的游戏规则,方块在主窗体界面中实现满足一行或者多行填满就必须完成消除,而这个过程需先判断已经下落到底的方块是否满行的,而满行分为满一行以及满多行,对行的话就需要不断地循环判断才可以实现,不管是满足一行还是多行都会将这些满的行数消除,之后剩余没有消除的方块往底部降落,出现新方块。主要代码如下所示:
在这里插入图片描述

5.8.3 实现用户分数累加显示
方块实现消行后,系统会根据消除行数进行分数的叠加,整个叠加操作是系统首先对满行消行数值进行判断,判断是否大于0,如若消除行数大于0的话,就对已有的分数进行累加更新显示,并且更新到主窗口界面中显示,后面遇到消行情况同样操作。主要代码如下所示:
在这里插入图片描述

5.9 新方块的产生和下一方块的展示
5.9.1 游戏新方块
游戏运行过程中随着之前出现的方块的降落到底,界面上方就会出现新方块缓慢下落,这个过程首先是将要下降的方块的形状先随机预设好,于此同时设置好新方块出现在界面中的位置,而这个位置必须满足游戏区域的顶部的中心。设置好后等待之前的方块降落至底之后就可以显示出现,实现下落,方块下落过程中系统会判断用户能否通关键盘输入控制方块的移动,若新方块不能移动则表示游戏结束。主要代码如下所示:
在这里插入图片描述

5.9.2 下一方块显示
新方块出现时在下一个方块文字下面的预显示方块区域就会显示下一个出现的方块的具体形状。这个过程首先是在预显示区域显示出方块具体像素形状,系统绘制出这个方块并且加载出来,等待出现在界面顶部中心。这个过程的实现函数主要代码若下所示:

在这里插入图片描述

第6章 俄罗斯方块游戏测试

6.1 关于软件测试
软件测试存在的目的是为了检验编程好的软件是否满足需求分析阶段定下的要求的,检验实际运行结果与期待的结果之间的差别并两者相比较等。软件测试是在特定的条件下铜鼓对编程好的程序经一些操作,通过程序表现出来的错误,对软件的质量有一定的衡量,并判断程序是否满足开发需求。软件测试能够使开发的软件的正确性、完整性都有所提高。
关于软件测试,《软件测试的艺术》一书进行了论述:
测试的目的不是致力于将程序中的错误找出来,并且测试的目的也不能局限于找出错误,还要注重于分析各种原因与趋势,分析错误发生的原因还有发生的趋势,这个在开发过程对项目的负责人找出软件的缺陷是十分有利的,这能够方便错误的及时更改,避免一些没必要的错误的产生以及造成一定的损失。而且若分析之后如果能够总结出有针对性的解决方法,对日后的追踪或者他人的开发带来便利都是十分好的。
软件测试是有原则的,第一测试这种事情肯定是能够早期进行就尽量早,在需求的阶段就开始着手是最好的,因为这个时段就算测试出来很大的错误,但造成的最大后果无非就是用户的需求不能够得到满足。第二,软件测试人员与编程人员不是同一批人进行,软件测试应该由第三方负责。第三,进行测试使,认定是错误是需要一个过程的,A检测出来的错误但还是需要由第三方介入确定,并且出现严重错误的情况,是需要召开会议进行集合分析评论下言论的,并且对其严重程度也需要确定。第四,测试是一个过程,作为过程就是包含着计划才是严谨的,阮籍测试也是一样,整个过程必须是严谨的,有指导性,赶时间是得不到高质量的结果的。
综上所述,在开发的过程中软件测试是不可或缺的。
6.2 性能要求
下列主要是叙述这个游戏开发实现应该具有的性能要求:
准确性:玩家玩游戏的过程中需要确保基础的错误不会出现,如确保随机出现的方块的自由下降过程无误、分数累加显示和等级显示都是准确的。
稳当性:游戏在运行的过程中只有具有足够的稳当性,才能够使程序持续运行,不会有突然停止卡顿的事情发生致使程序整体崩塌。
可延伸性:除了基本功能的实现,正常投放使用的程序都是可以将原有的项目继续延伸发展的。
跨版本性:随着科技的发展,系统还有开发软件都在不断地升级。程序需满足能在不同版本的系统还有Qt开发平台上运行。
6.3 测试的结果
主窗体界面界面测试:整体界面布局舒适合理,包含下一个方块显示区、分数累计显示区、当前等级显示区、消行数显示区、开始按钮、暂停按钮、退出按钮还有主游戏区域,整体界面排版清晰,方便玩家理解与操作。
在这里插入图片描述

图 6-1 游戏测试主界面图
基本功能测试:
鼠标点击处理事件:用户点击按钮时,系统对按钮作出相应事件处理。基础形状组合生成:游戏进行过程中,界面顶部随机出现方块进行自由下落运动,这些方块组合是由四个正方体方块组成的,共有七种图形组合,而玩家通过上方向键控制形状的旋转方向,共形成4*7=28种不同形状组合,这些组合都能够实现呈现在游戏界面中。
按键处理事件:游戏过程中用户能够通过键盘四个方向键控制方块,其中上键控制方块旋转方向、下键使方块快速下降到底部,左右方向键控制方块移动方向。
满行消行、分数累加、等级划分:游戏过程中方块自动满行消除,且剩下方块降落至界面底部,消除之后所得的分数累积相加后更新显示到所得分数显示框,并且分数到一定程度之后玩家游戏等级增加,通过关卡的显示框显示相应等级。
界面实现:测试时暂停游戏界面是玩家点击暂停按钮后界面出现游戏已暂停字眼;运行界面就是有不同颜色不同形状的方块自由降落;分数累计界面是随着游戏的进行,关卡、分数、消行数都得到累计增加显示;结束界面是方块排列最高的点接近顶部,降落的新方块没有办法移动。

参考文献

[1]谭浩强.《C++面向对象程序设计》.清华大学出版社:2006.01第一版
[2]Ian Joyner.《C++ A Critique of C++ and Programming and Language Trends of the 1990s》
[3]Stanley B. Lippman,Josée Lajoie,Barbara E. Moo. C++ Primer.(有中文译本:人民邮电出版社出版,ISBN 978-7-115-14554-3)
[4]Luca Cardelli and Peter Wegner. “On Understanding Types,Data Abstraction,and Polymorphism”:Computing Surveys,Volume 17, Number 4, pp. 471–522, 1985
[5]陈超.C语言常用函数速查手册[M].北京:化学工业出版社,2010.06
[6]黄丽琴,丁林松.Qt4图形设计与嵌入式开发[M].北京:人民邮电出版社
7布兰切特(Blanchette,J),(英)萨默菲尔德(Summerfield,M).闫锋欣译.C++GUI Qt4编程(第二版)[M] .New York: Spring-Verlag,2008.08
[8](美)伊斯特(EEzust,A.),(美)伊斯特(Ezust,P.)著.李仁见,战晓明译.C++设计模式Qt4开源跨平台开发框架[M].北京:清华大学,2007.08
9萨特,(罗)亚历山德雷斯库.C++编程规范:101条规则、准则与最佳实践[M].北京:人民邮电出版社,2010
[10]郑莉,董江周.C++语言程序设计(第4版)[M].清华大学出版社:2010
[11]蔡志明.精通Qt4编程[M].北京:电子工业出版社,2008.1
[12]霍亚飞.《Qt及Qt Quick开发实战精解》.北京航天航空大学出版社:2012.05.01
[13]Eric Raymond .《unix编程艺术》一书:第十四章第四节“语言评估”
[14]霍亚飞.《Qt5编程入门》.北京航天航空大学出版社:2015.02.01
[15]Scott Meyers,Effective C++: 50 Specific Ways to Improve Your Programs and Design (2nd Edition) (Addison-Wesley Professional Computing Series)

致 谢

从开始写作至论文最终定稿,时间过得很快,随着毕业设计基本完成,说明我四年的大学生活也即将面对结束了,这也代表着我的学生生涯的结束。时间真的过得飞快啊,回顾四年的校园生活,从青涩地进入校园到毕业进入社会,好像学习了很多东西,但又感觉很当初差不多。
毕业设计代表着最终的结束,在这次的毕业设计中也让我学到了很多东西,将大学四年所学融为一体、倾注于设计,同时在整个毕业设计过程中又让我学到了很多课外知识,又通过亲自动手实践,提高了自己的实践能力,将理论与实践相结合,既实践操作提高动手能力,同时也在实践过程中夯实了基础,更扎实的掌握了理论知识,从而提高了自身的专业技能,因此在这次毕业设计过程中,收获颇丰。
回首四年,有太多的感慨,四年一路走来,有一直陪伴我的同学和老师,真心感谢学校的领导、老师、和我的同学们,谢谢你们一路的陪伴。
不管将来走到哪里,我都不会忘记曾今帮助过我、陪伴过我的老师同学们。今后我会更加努力,严格要求自己,让自己越来越优秀,不辜负大家的期望。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/181923.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

引领Serverless构建之路,亚马逊云科技re:Invent 2023首日主题演讲重磅发布

在每年的亚马逊云科技re:lnvent大会,由Peter DeSantis带来的《周一晚间直播》是re:lnvent大会的第一个并让人值得期待的主题演讲。作为亚马逊云科技高级副总裁,Peter发布了数据库和应用领域的三项Serverless创新,使客户能够更快、更轻松地扩展…

Java最难的语法<泛型>

时间过得很快,我们马上就进入了,Java最难语法的学习,加油吧! 1.包装类 想要学好泛型就要了解包装类。 在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个…

基于springBoot实现的学生成绩在线管理

一、系统架构 前端:html | js | css | jquery | bootstrap 后端:springboot | ibatis 环境:jdk1.7 | mysql | maven 二、代码及数据库 三、功能介绍 01. 登录页 02. 管理员-首页 03. 管理员-学生管理 04. 管理员-教师管理 05. 管理员-班级管…

任务管理流程及任务管理工具

Leangoo领歌是一款永久免费的专业的敏捷开发管理工具,提供端到端敏捷研发管理解决方案,涵盖敏捷需求管理、任务协同、进展跟踪、统计度量等。 Leangoo支持敏捷研发管理全流程,包括小型团队敏捷开发,规模化敏捷SAFe,Scr…

【LeetCode】每日一题 2023_11_29 无限集中的最小数字(哈希/堆)

文章目录 刷题前唠嗑题目:无限集中的最小数字题目描述代码与解题思路偷看大佬题解 结语 刷题前唠嗑 LeetCode?启动!!! 今天的题目也比较的简单,因为数据量不大,所以什么做法都能过的去 题目&a…

主流之选!Galaxybase荣获工信部赛宝信创解决方案全国三等奖

喜报!“创邻图智能方案”再获工信部官方认可! 11月23日,由工业和信息化部电子第五研究所和中国通信企业协会联合主办的“第二届中国赛宝信息技术应用创新优秀解决方案征集活动”结果正式公布,创邻科技Galaxybase智能风控解决方案…

leetcode刷题详解十一

⭕️583. 两个字符串的删除操作 思路:核心代码就是最长公共子序列,但是需要注意的是结果 就是如果说公共子序列为0,则需要两个字符串长度的才行 如果有,就是 n m ∗ 2 d p [ n ] [ m ] nm*2dp[n][m] nm∗2dp[n][m] int minDist…

【LeetCode刷题】数组篇1

🎇数组简单题Part 🌈 开启LeetCode刷题之旅 🌈 文章目录 🎇数组简单题Part🍰1.两数之和👑思路分析1.暴力法2.哈希表法 🍰26.删除有序数组中的重复项👑思路分析1.双指针2.利用vector…

Trapcode Suite 2024.0.2

Trapcode Suite是一款用于在After Effects中模拟和建模3D粒子和效果的软件。 该软件包包含11种不同的工具,可以帮助用户模拟火、水、烟、雪等粒子效果,以及创建有机视觉效果和3D元素。它还支持在AE与PR 2022插件,使得用户可以轻松地在后期制作…

11月第4周榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩平台)发布!

飞瓜轻数发布2023年11月20日-11月26日飞瓜数据UP主排行榜(B站平台),通过充电数、涨粉数、成长指数、带货数据等维度来体现UP主账号成长的情况,为用户提供B站号综合价值的数据参考,根据UP主成长情况用户能够快速找到运营…

《第一行代码:Android》第三版-如何为一个Activity添加layout文件

确切地说就是讲如何给一个不带view的Activity添加一个view,就是添加一个layout文件。 新建安卓项目,如果选择:就会给你创建一个没有view的Activity,如果后来你发现需要为这个Activity添加view,就是添加一个布局文件怎…

又有两大巨头官宣加入鸿蒙, 鸿蒙已成, 华为余承东说得没错

自从华为发布HarmonyOS 4系统后,宣布下一个鸿蒙版本将不再支持安卓应用,并启动鸿蒙原生应用,随后国内巨头纷纷响应,为鸿蒙系统开发原生应用。 如今,又有两大巨头官宣加入鸿蒙,一家是广汽传祺,M…

软著项目推荐 深度学习图像风格迁移 - opencv python

文章目录 0 前言1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习图像风格迁移 - opencv python 该项目较为新颖,适合作为竞赛课题…

CodeTON Round #7 (Div. 1 + Div. 2)

A.jagged Swaps 题意: 给出一个包含 n n n个数字的序列,每次可以选择一个同时大于左右两边相邻的数字,将这个数字与它右边的数字交换,问能否在经过若干次操作后使序列变为升序。 分析: 由于交换只能向后进行&#…

Java 基础学习(四)操作数组、软件开发管理

1 操作数组 1.1.1 System.arraycopy 方法用于数组复制 当需要将一个数组的元素复制到另一个数组中时,可以使用System.arraycopy方法。它提供了一种高效的方式来复制数组的内容,避免了逐个元素赋值的繁琐过程。相对于使用循环逐个元素赋值的方式&#x…

C#-串口通信入门及进阶扩展

目录 一、串口相关参数介绍 1、端口(COM口) 2、波特率(Baud rate) 3、起始位 4、停止位(StopBits) 5、数据位 6、校验位 7、缓存区 二、串口通信助手 三、虚拟串口工具 四、进阶扩展 1、位运算…

InnoDB存储引擎中的锁

文章目录 概要一、需要解决的问题二、共享锁和独占锁1.1 锁定读1.2 表级别的共享锁、独占锁 三、行锁3.1 数据准备3.2 几种常见的行级锁3.3 行锁升级为表锁 概要 关于MySQL涉及到的锁,大致可以总结如下: MyISAM存储引擎在开发过程中几乎很少使用了&…

SpringSecurity+JWT实现权限控制以及安全认证

一.简介 Spring Security 是 Spring家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。 认证:验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户​ 授权&…

Spring Boot + MyBatis-Plus实现数据库读写分离

文章目录 1. 引言2. MyBatis-Plus简介3. 准备工作4. 配置数据源5. 配置MyBatis-Plus6. 创建实体类和Mapper接口7. 编写Service8. 控制器层9. 测试10. 数据库读写分离的原理11. 拓展11.1. 动态数据源11.2. 多数据源事务管理11.3. 多租户支持 12. 总结 🎉Spring Boot …

【多线程】-- 06 线程状态之线程停止与休眠

多线程 5 线程状态 线程的五大状态:创建状态、就绪状态、阻塞状态、运行状态、死亡状态。如下图所示: 具体解释如下: 线程方法: 5.1 停止线程 不推荐使用JDK提供的stop()方法、destroy()方法【已废弃 – deprecated】推荐线程自…