基于QT的俄罗斯方块游戏的设计与实现论文修改版.docx
《基于QT的俄罗斯方块游戏的设计与实现论文修改版.docx》由会员分享,可在线阅读,更多相关《基于QT的俄罗斯方块游戏的设计与实现论文修改版.docx(26页珍藏版)》请在冰豆网上搜索。
![基于QT的俄罗斯方块游戏的设计与实现论文修改版.docx](https://file1.bdocx.com/fileroot1/2023-2/9/bcdb42af-85d7-4cdc-bdec-2059aad129c9/bcdb42af-85d7-4cdc-bdec-2059aad129c91.gif)
基于QT的俄罗斯方块游戏的设计与实现论文修改版
本科毕业论文(设计)
QT俄罗斯方块游戏的设计与实现
作者姓名
指导教师
所学专业
计算机科学与技术
班级
08计2
所属院系
信息学院
学习年限
2008
年
9
月至
2012
年
7
月
二○
一二
年
七
月
QT俄罗斯方块游戏的设计与实现
学生姓名:
樊超
指导教师:
张永奎朱君亮刘忠宝
内容提要俄罗斯方块是个老幼皆宜的小游戏,它实现由四块正方形的色块组成,然后存储在一个数组的四个元素中,计算机随机产生不同七种类型的方块,根据计算机定时器控制它在一定的时间不停的产生,用户根据键盘的四个方向键控制翻转、向左、向右和向下操作,(用信号和槽函数的关联来实现对按键事件的控制)。
然后程序根据这七种方块堆叠成各种不同的模型。
Qt是诺基亚开发的一个跨平台的C++图形用户界面应用程序框架。
它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。
论文描述了游戏的历史,开发此游戏的环境,游戏开发的意义。
遵循软件工程的知识,从软件问题定义开始,接着进行可行性研究、需求分析、概要设计、详细设计,整个开发过程贯穿软件工程的知识体系。
本设计基于用QT这种流行的软件制作大众喜爱的俄罗斯方块游戏,以QT+Creator为开发语言,使用C++和QT库来进行游戏的设计与实现。
采用信号和槽函数的关联来实现对按键事件的控制,实现键盘的控制。
需要解决的难题是方块的移动和消行的方法,解决的方法是用判断是否重合的方法来决定方块的移动,用让已满的行和它上面的所有的行均等于其上面的一行来实现消行。
最终实现了游戏功能和主要的控制功能,具有一定的实用和推广价值。
关键词:
QT定时器信号槽函数随机函数
1.引言
在现今电子信息高速发展的时代,电子游戏已经深入人们的日常生活,成为老少皆宜的娱乐方式。
俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。
这款游戏最初是由苏联的游戏制作人AlexPajitnov制作的,它看似简单但却变化无穷,令人上瘾。
相信大多数用户都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时代。
究其历史,俄罗斯方块最早还是出现在PC机上,而我国的用户都是通过红白机了解、喜欢上它的。
现在QQ等游戏平台又将重新掀起这股让人沉迷的俄罗斯方块风潮。
对一般用户来说,它的规则简单,容易上手,且游戏过程变化无穷,而在游戏平台上的对战模式更增加了它的娱乐性和挑战性,使用户既能感受到游戏中的乐趣,也给用户提供了一个展现自己高超技艺的场所。
俄罗斯方块游戏可以说是随计算机的发展而发展,并不断推陈出新演变出各种类似游戏,深受广大玩家喜爱。
这个游戏有的简单,有的复杂,但其根本原理是一样的都是对运动的方块进行组合,来训练玩家的反应能力。
谈到游戏软件,大多数人都认为其神妙莫测,高不可及。
而一般游戏软件也确实具有很高的技术难度,随着开发工具及软件开发方法学的不断发展,动手开发游戏也不是十分困难的。
俄罗斯方块游戏是一种古老而又有趣的游戏,游戏软件不计其数,网上就有好多关于实现的复杂算法和设计,其难度让一般初学者望而却步。
本文利用数组作为方块的数据结构,用QT来实现这款游戏的制作,对初学者可仿此开发类似游戏,并了解游戏软件的设计与开发过程。
1.1游戏的历史
游戏开发至今已经有30多年,在这个短暂的时期里,随着硬件水平的提高,游戏开发新技术层出不穷,经典游戏比比皆是。
真正的电子游戏机产生于20世纪70年代。
1971年,麻省理工学院的学生NolanBushnell设计了世界上的第一个业务用游戏机(俗名街机),叫做《电脑空间》。
这台游戏机用一台黑白电视机作为显示屏,用一个控制柄作为操纵器,不过由于市场因素这款游戏以失败告终。
但是最后他在电子游戏的发展上取得了非凡的成就。
上面介绍的是专用机游戏的历史,而最早的电脑游戏可以追溯到1972年,一个叫Crowther的工程师用当时最流行的主机――DEC公司的PDP-10编写一段简单的FORTRAN程序。
在这个程序里,Crowther设计了一张地图,地图上不规则的分布着陷阱,游戏者必须寻找路径避开陷阱。
这个程序被公认为是最早的电脑游戏程序。
1989年,BroderBund公司的设计师乔丹.麦克纳根据阿拉伯民族的古老传说《一千零一夜》在Apple平台上制作了一部动作冒险相结合的电脑游戏――波斯王子。
这个游戏获得了第一作,它代表了当时电脑技术的最高水平。
1986年,任天堂公司发售了一款真正的游戏巨作――超级马里奥。
20世纪80年代IBMPC兼容机的出现打破了Apple公司的垄断地位。
到了20世纪90年代,游戏业才真正成熟起来,成为了一种产业。
由于PC机价格非常低而且硬件速度越来越快,游戏逐渐成为人们生活中不可缺少的一部分。
游戏产业也逐渐发展成熟。
1.2游戏的组成要素
“游戏”,最简单的定义,就是一种供人们娱乐休闲的快乐元素。
从更专业的角度形容,“游戏”是具有特定行为模式、规则条件、身心娱乐及输赢的一种行为表现。
这种行为表现具备以下4个要素。
1.2.1行为模式
行为模式:
“游戏”最简单的要素就是游戏有特定的流程模式,这种流程模式贯穿于整个游戏的行为,用户必须依照它的模式流程来执行。
倘若一种游戏没有了特定的行为模式,那么就没有执行的行为;在没有执行的行为之后,这个游戏也玩不下去了。
举个例子来说,如果猜拳游戏没有了剪刀、石头、布等行为模式,那么这还能叫做“猜拳游戏”吗?
所以不管游戏的流程有多么复杂还是多么简单,一定要有特定的行为模式。
1.2.2条件规则
条件规则:
当游戏有了一定的行为模式后,接着就必须制定出一系列的条件规则。
简单来说,这些游戏的条件规则就是大家必须去遵守的游戏行为守则,只要是大家一致以为的游戏行为,在游戏中,玩家就必须遵守它,如果不遵守这种游戏行为,那么就失去了公平性。
如同一种简单的球赛,打球的英文解释可以用PLAYGAME来加以说明,按照英文字面上的解释,它就是执行游戏的行为,而球赛必须有一定的条件规则,并且参与者都要必须去遵守它,不能遵守它就会“犯规”。
所以不管是什么游戏,它都会具备一组规则条件,在游戏进行的时候才会有足够的公平性。
1.2.3娱乐身心
娱乐身心:
一种游戏所带来的娱乐性,关键就在于为玩家所带来的刺激感,这也是游戏的精华所在。
简单来说,不管是很多人玩的游戏,还是一个人玩的单机游戏,游戏本身就会存在它的娱乐和刺激性,使得玩家们想要去玩它。
1.2.4输赢
输赢:
其实针对游戏而言,输赢是所有游戏的最终目的。
一个没有输赢的游戏,也就没有了它存在的意义,如同我们常常接触到的猜拳游戏,说穿了最终目的就是为了分出胜负而己。
1.2.5小结
一般而言,游戏又可以分为动态和静态两种形态。
动态的游戏必须配合肢体动作,如猜拳游戏;而静态游戏则是较偏向思考的行为,如同纸上游戏。
然而不管是动态或是静态游戏,只要具备上述4项组成要素,都可以将它称为“游戏”。
虽然这个游戏已有,我做它的主要原因就是这个游戏风靡全球,老少皆知,我从小也玩这个游戏,一直好奇究竟是通过怎样的一个程序实现的,所以我选择以此游戏作为我的毕业设计很有意义。
2.可行性研究
2.1设计目的
综合运用在校期间所学理论知识和技能,设计开发俄罗斯方块,使自己熟悉应用系统的开发过程,培养独立思考能力,检验学习效果和动手能力,提高工程实践能力,为将来实际工作打下坚实的基础。
2.2可行性研究前提
2.2.1基本需求
基本需求:
系统开发的总体任务是实现游戏的可操作性、美观性、及时性。
开发过程遵循软件工程规范,可采用结构化或面向对象分析设计方法。
主要实现对游戏程序的开发和UI界面的实现,对游戏中的图形图像进行键盘控制。
游戏者可以通过上下左右键来对游戏进行操作。
2.2.2主要开发目标
主要开发目标:
采用结构化设计方法,开发出一个可操作性、美观性、及时性的游戏,主要实现对游戏程序的开发和UI界面的实现,并通过此次软件开发过程全面提高自身的综合素质。
2.2.3条件假定和限制
条件假定和限制:
由于本软件目前是我的初次版本,可能还存在一些问题。
如果该软件提高版本,本软件需要根据游戏者的要求进行进一步的修改。
2.2.4方法及步骤
可行性研究所采用的方法和步骤:
通过研究分析俄罗斯方块所具备的能力及实现的方法、确定主体结构。
利用现阶段我所能达到的能力,以最简洁、最容易的办法,边开发边测试边修改,实现一个初级游戏软件。
评价尺度:
由于本软件是一个初级产品,对其要求不是太苛刻,所以能够达到俄罗斯游戏的一般功能即可。
2.3可行性分析
2.3.1管理可行性
该游戏软件为首次开发,目的只为提高工作自身素质和检查自学QT和C语言的效果,所有功能均根据基本需求所做。
便于管理,所以在这方面是可以实现的。
2.3.2经济可行性
由于本游戏的主要背景是毕业课程设计,不注重直接的经济效益和其后的发展方向,只在注重自身水平和能力的提高,对自身的经济要求也不高,只要有一台能运行的电脑便可,所以不用考虑到经济问题。
2.3.3技术可行性
可用与本游戏的编程语言有C语言,C++,Java,Delphi等,考虑到用于编写程序的困难度,和对语言的了解程度,选择C语言和QT库作为编程语言。
需要对变量定义、变量初始化、界面初始化、游戏初始化、然后进入游戏、处理游戏过程中的各种操作。
2.3.4社会可行性
本游戏的开发作为毕业课程设计以巩固先前所学的知识,以个人为单位,仅供个人平常娱乐所用,无须考虑有可能造成的社会影响,不用考虑到法律、版权等的社会因素,所以在这方面是完全可行的。
2.4结论
综上所述,本游戏软件的技术成熟、完备。
各方面均无重大问题,因此本游戏软件可开始着手编写。
3.需求分析
3.1引言
对软件需求完全理解对于软件开发工作的成功是至关重要的,需求说明的任务是发现、规范的过程,有益于提高软件开发过程中的能见度,便于对软件开发过程中的控制与管理,便于采用工程方法开发软件,提高软件的质量,便于开发人员、维护人员、管理人员之间的交流、协作,并作为工作成果的原始依据,并且在向潜在用户传递软件功能、性能需求,使其能够判断该软件是否与自己的需求相关。
3.2游戏需求
游戏产业作为现代电脑电子技术的产物,正在以其独特的魅力在全世界的娱乐领域占据主流位置,我们在承认广大娱乐网民的选择空间狭小的同时,也必须明确的一点就是游戏本身所具有的强大的吸引力。
游戏“俄罗斯方块”,俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分,如果未被消除的方块堆放的高度超过场地所规定的最大高度,则游戏结束。
规则简单容易上手。
游戏速度节奏快,画面清晰可爱。
总是排在受玩家最欢迎游戏排名前5位的连连看,休闲、趣味,且不分男女老少、工薪白领,在娱乐的同时还可以训练眼明手快及增强逻辑判断能力。
是一款适合大众的经典小游戏。
小游戏制作的目的是满足了人们休闲的需要,在紧张工作之余休闲类的小游戏能够给人带来最大程度的放松,也可以增进人们之间的交流,沟通,通过游戏还可以认识更多的朋友。
3.3游戏设计的必要性
大多数的此类游戏都是用JAVA或其他方法来设计的,本设计采用QT+Creator来实现,与之前的设计相比,界面更加的美观,设计思想更加简单,代码更加简洁高效。
4.游戏的基本功能
参考QT库中基本的Tetrix实例,设计自己的方块类程序。
在QT中新建一个工程,向工程中添加新的普通文本文件。
将设计好的4个文件添加复制到工程文件夹下并加入到工程中。
在主函数中新建一个类的对象,用参数设置好方块的下移速度,就可以成功运行出一个基本的游戏程序。
4.1方块类定义函数
方块和地图数据信息是游戏中最基本的功能模块。
这个类提供方块图形,图形在4*4区域的位置信息,对图形进行旋转变化功能。
Myitem.hMyitem.cpp这两个文件是方块类的定义文件,用来提供随机产生的方块。
定义7个四维数组unsignedcharitem[4*4],数组的第一维表示七种不同形态的方块,第二维代表方块的四种不同翻转状态。
数组的第三维和第四维代表某一种形态的方块的某一状态。
然后用代码实现下列功能:
(1)每次执行首先为随机数产生不同的初值。
(2)随机选取一个图形
图4.1随机产生方块图
(3)当前图形在其4*4网格中的位置信息
(4)改变图形形状
定义一个4x4方阵,共16个小格。
用“0”和“1”来表示每个方格是绘制还是空白,由此可以组合出多种图形,如图所示:
图4.2方块图
4.2程序核心函数
Gamearea.hGamearea.cpp是游戏区域类的定义文件,实现了游戏的所有功能。
其中包括了核心功能控制函数,设置颜色参数,设置声音参数,设置游戏区域旋转函数和其他功能函数等。
具体功能的实现在下一章节中阐述。
5.程序主要功能设计及按键事件的控制
5.1建立工程
(1)首先建立工程Qt4GuiApplication,这里命名为Tetris,选用QWidget作为Baseclass。
(2)然后将myitem.cpp,myitem.h,gamearea.cpp,gamearea.h四个文件复制到工程文件
夹下并添加到工程中。
(3)在widget.h中添加#include"gamearea.h"的头文件包含。
并在下面的private中声明一个
游戏类对象GameArea*gameArea;
(4)在widget.cpp的构造函数里添加语句。
Widget:
:
Widget(QWidget*parent):
QWidget(parent),
ui(newUi:
:
Widget)
{
ui->setupUi(this);
this->resize(800,500);
this->gameArea=newGameArea(this);
}
这里重新设定了主窗口大小,并在主窗口上新建了一个游戏区域对象。
5.2添加定时器和开始按钮
(1)在widget.h里的private中添加定时器对象和分数变量的声明。
QTimer*timer;
intscore;
在public中添加显示分数函数的声明。
voiddoScore(int);
添加槽函数的声明。
privateslots:
voidtimer_upDate();
(2)在widget.cpp文件中的构造函数里添加下面的语句:
this->timer=newQTimer(this);
connect(this->timer,SIGNAL(timeout()),this,SLOT(timer_upDate()));
score=0;
定义了定时器并进行了信号和槽函数的关联,初始化分数为0;
(3)然后在下面定义两个函数。
voidWidget:
:
timer_upDate()//定时器溢出处理
{
this->gameArea->moveOneStep();//先移动一步,这时并没有显示出来
if(this->gameArea->isMoveEnd())//如果无法移动,到底了或结束了
{
if(this->gameArea->isGame_Over())//如果是结束了
{
this->timer->stop();//停止计时
QMessageBox:
:
warning(this,tr("warning"),tr("Game
Over!
"),QMessageBox:
:
Yes);
//弹出对话框
this->score=0;//清空分数
this->gameArea->init_Game();//重新开始游戏
this->gameArea->gameStart();
this->timer->start(500);
}
else//如果是移动到底了
{
this->gameArea->nextItem();//出现下一个图形
intnum=this->gameArea->getFullRowNum();//获得已满的行数
this->doScore(num);//显示分数
this->gameArea->gameStart();//继续游戏
}
}
else//如果没有到底
{
this->gameArea->do_MoveNext();//显示方块下移一步后的界面
}
}
voidWidget:
:
doScore(intnum)//显示分数
{
score+=num*100;
this->ui->label_2->setText(tr("%1").arg(score));
}
(4)在设计器中向主窗口上添加两个标签label和label_2,其中label写上“你的分数是:
”,
label_2写上“0”;然后再添加一个开始按钮。
(5)然后右击“开始游戏”按钮,选择其单击事件的槽函数。
更改如下。
voidWidget:
:
on_pushButton_clicked()//开始按钮
{
this->gameArea->init_Game();//第一次进入游戏时进行的初始化
this->gameArea->gameStart();//开始游戏
this->timer->start(500);//开启定时器
this->gameArea->setFocus();//让游戏区域获得焦点,这样才能响应键盘
}
5.3添加暂停和重新开始按钮,完成基本的控制功能
(1)在主窗口上添加“暂停游戏”和“重新开始”两个按钮。
在“暂停游戏”按钮的属中
将checkable选中。
(2)分别进入两个按钮的单击事件槽函数。
voidWidget:
:
on_pushButton_2_clicked()//暂停按钮
{
if(this->ui->pushButton_2->isChecked())
{
this->timer->stop();
this->ui->pushButton_2->setText(tr("取消暂停"));
}
else
{
this->timer->start(500);
this->ui->pushButton_2->setText(tr("暂停游戏"));
this->gameArea->setFocus();
}
}
voidWidget:
:
on_pushButton_3_clicked()//重新开始
{
this->timer->stop();
this->on_pushButton_clicked();
}
(3)在main.cpp中添加语句,让程序中可以使用中文。
添加#include的头文件包含。
在main()函数里添加QTextCodec:
:
setCodecForTr(QTextCodec:
:
codecForLocale());语
句。
5.4改变颜色和给方块添加图片
(1)添加“更改颜色”按钮和“方块贴图”按钮。
(2)更改其单击事件槽函数。
如下。
voidWidget:
:
on_pushButton_4_clicked()//改变颜色
{
this->gameArea->setGameAreaColor(QColor(255,255,0,qrand()%255));
//更改游戏区域背景颜色
this->gameArea->setBoxBrushColor(QColor(0,255,0,qrand()%255));
//更改小方块背景颜色
this->gameArea->setBoxPenColor(QColor(0,0,0,qrand()%255));
//更改小方块边框颜色
this->gameArea->draw_gameArea();
//更新游戏区域
this->gameArea->setFocus();
}
voidWidget:
:
on_pushButton_5_clicked()//方块贴图
{
this->gameArea->set_draw_box_picture(true);
//确认使用方块背景图片
this->gameArea->setBoxPicture("box.gif");
//添加方块背景图片
this->gameArea->draw_gameArea();
//更新显示区域
this->gameArea->setFocus();
}
(3)运行效果如下。
点击“改变背景”按钮后,游戏区域背景,方块的填充颜色和边框颜色都改变了。
5.5是否显示背景网格和下一个要出现的方块
(1)添加“网格显示”按钮和“方块提示”按钮。
并将它们属性中的checkable选中
(2)修改它们的单击事件槽函数。
voidWidget:
:
on_pushButton_6_clicked()//网格显示
{
if(this->ui->pushButton_6->isChecked())
{
this->gameArea->setDrawGrid(false);
}
else
{
this->gameArea->setDrawGrid(true);
}
this->gameArea->draw_gameArea();
this->gameArea->setFocus();
}
voidWidget:
:
on_pushButton_7_clicked()//方块提示
{
if(this->ui->pushButton_7->isChecked())
{
this->gameArea->setDrawNextItem(false);
}
else
{
this->gameArea->setDrawNextItem(true);
}
this->gameArea->draw_gameArea();
this->gameArea->setFocus();
}
5.6添加向下按钮步数设置
(1)添加“是否坠落”按钮,并将其属性中的checkable选中。
(2)更改其单击事件槽函数。
voidWidget:
:
on_pushButton_9_clicked()//是否坠落
{
if(this->ui->pushButton_9->isChecked())
{
this->gameArea->setKey_Down_Move_oneStep(true);
//按一下向下方向键,下移一步
}
else
{
this->gameArea->setKey_Down_Move_oneStep(false);
//按一下向下方向键,移动到底
}
this->gameArea->setFocus();
}
5.7添加方块
(1)添加“添加方块”按钮。
(2)修改其单击事件槽函数。
voidWidget:
:
on_pushButton_10_clicked()//添加方块
{
this->gameArea->init_Game();
//清空游戏区域
this->gameArea->setbox(10,4);
this->gam