俄罗斯方块游戏系统设计(含完整程序)大学毕设论文.doc
《俄罗斯方块游戏系统设计(含完整程序)大学毕设论文.doc》由会员分享,可在线阅读,更多相关《俄罗斯方块游戏系统设计(含完整程序)大学毕设论文.doc(40页珍藏版)》请在冰豆网上搜索。
![俄罗斯方块游戏系统设计(含完整程序)大学毕设论文.doc](https://file1.bdocx.com/fileroot1/2023-2/17/7f586e0b-9742-4127-a2fd-e74ebe3ac4b7/7f586e0b-9742-4127-a2fd-e74ebe3ac4b71.gif)
毕业设计(论文)正文
题目
俄罗斯方块游戏
专业
班级
姓名
学号
指导教师
职称
俄罗斯方块游戏
摘要:
在现代信息高速发展的时代,电子游戏已经深入了人们的日常生活,成为了老少咸宜的娱乐方式,但是游戏设计结合了日新月异的技术,在一个产品中整合了复杂的艺术,设计,声音和软件,所以并不是人人皆知,直到今天,在中国从事游戏设计的人仍然很少,但是游戏行业的发展之快,远超如汽车,家电等传统行业,也正因为如此,游戏人才的教育培养远落后于行业的发展。
俄罗斯方块是一个老少咸宜的小游戏,它实现有四个正方形的色块组成,然后存储于一个数组的四个元素中,计算机随机产生七种不同类型的方块,根据计算机时钟控制它在一定的时间不停的产生,用户根据键盘的四个方向键进行向左,向右,向下,翻转操作。
然后程序根据这七种方块折叠成各种不同的类型。
论文描述了游戏开发的背景,意义,算法分析,功能实现,功能测试。
以C++为开发语言进行设计与实现。
关键词:
电子游戏,算法,C++,测试
TheRussiansquarepiece
Abstract:
Intheeraofhigh-speeddevelopmentofelectronicofinformation,computergamehasenterpeople’sdailylife,becomeanamusementadapttooldandyoung.Butgamedesignisacombinationoffast-movingtechnology,thecomplexityofintegratingdesign,art,audioandsoftwareintoasingleproduction,sothisthechnologyisn’tknownbyeveryone.up-to-date,therearefewpeopleworkatgamedesignallthesame,whereas,thedevelopmentofgameindustrymorefasterthantraditionalindustryashomeappliancesandautomobile,bythereasonofthissituation,theeducationandtrainingofpersonwithablityofgamedesigndropbehindthedevelopmentofgameindustry.
TheRussiansquarepieceisaget-awaydramawithallproperoldyoung,itcarryouttobeconstitutebyfourpiecesofcoloursofexactsquarepiece,thensaveinonefourchemicalelementsofthepieceset,randomcreationdissimilarityofcalculatorseventhesquarepieceofthecategorytype,controlitaccordingtothecalculatorclockincertaintimecontinuouslycreation,thecustomerisinsideoutaccordingtofourdirectionskeycontrolofthekeyboard,toleft,rightwardsandgetdown,(therealizationofthecontrolkeyistobecarryoutbytheeventhandingofthedirectionkeyofthekeyboard)Thentheprocedurepiledsaccordingtothesesevenkindsofsquarepiecesvariousdifferentmodel.
Thethesishasdescribedthegamehistory,hasdevelopedthisgamehistory,hasdevelopedthisgameenvironment,developmentsignificanceofgame.Knowledgeabidingbyasoftwareengineering,definitionbeginsfromsoftwareproblem,proceedtocarryoutfeasibilitystudy,needanalysis,essentialsdesign,theatlasthascarriedoutatestingonthesoftwareengineeringknowledgehierarchy.
ThecomputergamesdesignandpracticearedesignedoeclipsedevelopingplatformwithC++developinginstrument,underMicrosoftWindowsXPsystemthistime.
KeyWords:
electronicgamecalculatewayC++test
目录
1引言 1
1.1课题背景 1
1.2毕设意义 2
2需求与算法分析 3
2.1需求分析 3
2.1.1游戏需求 3
2.1.2游戏界面需求 4
2.1.3游戏形状(方块)需求 4
2.2算法分析 5
2.2.1定义方块的数据结构 5
2.2.2俄罗斯方块流程 5
3系统功能实现 7
3.1产生主窗口 7
3.2定义俄罗斯方块数据结构 8
3.3游戏的主逻辑 9
3.4销行功能实现 11
3.5中断操作流程的实现 13
3.6变形的实现 15
3.7游戏区域绘图的实现 16
3.8游戏方块绘制 20
3.9烟花燃放功能 22
4功能测试 24
4.1测试环境 24
4.2图像功能测试 24
4.3销行和计分功能测试 27
4.4速度功能测试 28
5总结 29
[参考文献] 30
致谢 31
┊
┊
┊
┊
┊
┊
┊
┊
┊
┊
┊
┊
┊
装
┊
┊
┊
┊
┊
订
┊
┊
┊
┊
┊
线
┊
┊
┊
┊
┊
┊
┊
┊
┊
┊
┊
┊
┊
毕业设计
俄罗斯方块的程序设计
1引言
计算机游戏产业在随着网络的发展有了长足的发展。
游戏最早起源于纯文字的交互游戏MUD,MUD是英文Multi-userDungeons的缩写。
纯文字交互,顾名思义,是一纯文字的形式来进行游戏。
即,所有的场景描述、物品的样子、所有人的行动、时间的描述都是用文字的方式表达的。
总之,文字MUD是一个很需要想象力的游戏形式,需要从文字转化成玩家自己脑海中的现实场景。
随着电子元器件的发展,电子产品迅速发展。
掌上游戏机和电视游戏机在80年代和90年代风靡一时,此时由苏联人AlexPajitnov制作的游戏俄罗斯方块在掌上游戏机和电视游戏机上流行,其造成的轰动和经济价值成为游戏史上的大事。
所以本文通过用C++实现俄罗斯方块学习游戏的整个设计和测试过程,学习用基于Windows的游戏程序设计。
1.1课题背景
俄罗斯方块是个老幼皆宜的小游戏,它实现由四块正方形的色块组成,然后存储在一个数组的四个元素中,计算机随机产生不同七种类型的方块,根据计算机时钟控制它在一定的时间不停的产生,用户根据键盘的四个方向键控制翻转、向左、向右和向下操作,(控制键的实现是由键盘的方向键的消息函数实现)。
然后程序根据这七种方块堆叠成各种不同的模型。
基于Windows的游戏设计有很多方式,如基于java跨平台的设计,基于.net平台的设计和基于MFC的设计,三种设计各有优缺。
基于java的设计能够充分运用java跨平台的特性,便于移植,可以做到一次代码在不同环境下的运行,从而大大提高可移植性,便于在移动设备上运行,但是基于java的设计由于运行在虚拟机上,效率比较低。
基于.net平台的设计可以利用.net平台提高的接口大大简化设计过程,然而其通用性不好,需要.net平台支持,在执行效率上也不如MFC程序。
基于MFC的程序设计具有执行高效的特点,跟windows的契合比较好,但不具有跨平台能力。
相比三种设计方案,为了能够在Windows平台上以更好的性能运行,本文采用VC++基于MFC的设计,来完成俄罗斯方块的游戏。
1.2毕设意义
此次毕设通过用C++设计与实现俄罗斯方块游戏。
包括系统的需求分析;系统总框图及每个模块的设计分析;MFC应用程序架构;框架的扩展;算法的设计与实现;游戏的内部实现;游戏区域绘图的实现;系统存在的问题及错误处理;以及游戏的测试和改进。
通过此次毕业设计,我对软件设计的过程有了清晰的认识,通过编写游戏的各个方面工作学习了设计思想,程序架构,数据结构和算法,同时也对windows程序设计特别是基于MFC的程序设计有了直观的认识。
通过游戏的测试学习到了常用的测试过程,测试方法。
2需求与算法分析
2.1需求分析
2.1.1游戏需求
功能性需求如下:
随机给出不同的形状(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型)下落填充给定的区域,若填满一条便消掉,记分,若同时消去两行以上则会放烟花来庆祝,游戏可以设置难度,难度主要由方块的下降速度决定,下降速度越大难度越大,若在游戏中各形状填满了给定区域,为输者。
如下表(表2.1)为游戏功能性需求表。
功能
简介
顺时针旋转
顺时针旋转转块
逆时针旋转
逆时针旋转转块
绘制转块
指定画板上绘制转块
擦除矩形
指定画板上擦除矩形
右移动
右移动转块
左移动
左移动转块
下移动
下移动转块
丢下转块
在画板上丢下转块
燃放烟花
在面板内根据一次得分多少燃放烟花
计分
根据用户消去的行数计分
表2.1示例
作为玩家,玩家可以控制难度,查看帮助等,对于操作性的需求如下:
◆ 玩家可以自己来控制方块下落的速度。
◆ 玩家可以自己来控制游戏的难度。
◆ 玩家可以看到游戏的积分。
◆ 对本游戏有帮助说明和作者介绍等
2.1.2游戏界面需求
良好的用户界面,有提示显示和分数显示。
让方块在一定的区域内运动和变形,该区域用一种颜色表明,即用一种颜色作为背景,最好设为黑色。
还需用另一种颜色把黑色围起来,宽度适中,要实现美感。
将整体界面分为三部分:
左侧半部分用来存放俄罗斯方块,是游戏的活动区,用户操作的图形变化在这个主界面区完成。
右上侧部分显示下一次要产生的俄罗斯方块形状,以便用户预先知道,增加游戏的可玩性。
右侧下半部分用来显示用户的分数和当前等级,以便让用户有成就感增加可玩性。
如图为整体的界面设计需求效果,将整个界面分成了三部分,显得简易清爽,作为用户界面让玩家感觉比较舒服得体。
如图2.1所示:
图2.1示例
2.1.3游戏形状(方块)需求
良好的方块形状设计,绘制七种常见的基本图形(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型),各个方块要能实现它的变形,可设为顺时针或逆时针变形,一般为逆时针。
为了使游戏更加美观更具可玩性,在绘制方块的过程中不采用默认的绘制方式,而是用经过处理的图片效果,这样让组成的方块更加美观,同时彩色的方块也让人赏心悦目,增加了游戏的可玩性。
下图(图2.2)就是用来拼接方块颜色的样板色。
图2.2示例
由图可见这种带有实体效果的方块比一般的二维方块更具立体效果,更美观,会更吸引玩家。
2.2算法分析
2.2.1定义方块的数据结构
对于方块在某一瞬间的位置标识,我们采用一个4×2的小数组标识出来,即用4个存储单位空间存储当前下坠物的每一子块的位置,也就是说,用4个存储单位空间存储当前下坠物的每一子块的位置来对整个下坠物件的位置进行标识,而每个存储空间的大小就是一个典的坐标值(x,y),而每个方块按照从左到右的方式进行编号,并且在编号过程中对于同一列的方块实行从上到下进行编号。
如图2.3所示:
(x0,y0)
(x1,y1)
(x2,y2)
(x3,y3)
2
3
0
1
(x0,y0)
(x1,y1)
(x2,y2)
(x3,y3)
0
1
2
3
方块编号
图2.3示例
方块表示方法,即四个小方块的坐标设定:
其中一个方块是原点,坐标为(0,0);右侧方块坐标(1,0),下面的方块坐标(0,1),以此类推。
如下为程序中定义的各种方块的数据结构定义。
2.2.2俄罗斯方块流程
俄罗斯方块流程(图2.4):
到达底部
游戏结束
到达底部
结束
销行操作
生成下一个下坠物
将新生的下坠物代替旧的“下一
个下坠物“
将旧的“下一个下坠物”用作当前
下坠物
销行操作
游戏结束处理
下降一个单位
开始
图2.4示例
如图中所示是俄罗斯方块的处理流程,从开始判断是否到底底部,到达则做销行操作,然后生成下一个下坠物,将新的下坠物代替旧的下一个下坠物,将旧的下坠物当做当前的下坠物,下到底部判断是否做销行操作,然后判断游戏是否结束,未结束则继续新一轮的生产方块,若方块达到了顶部,占满了空间则游戏结束。
3系统功能实现
3.1产生主窗口
通过InitInstance函数来初始化窗口的各个信息,包括窗口的位置,位图信息按钮和时钟初始化等。
InitInstance函数的实现如下,程序首先调用CreatWindow函数创建初始窗口句柄,然后设置窗口显示坐标,将窗口居中,用空的位图来初始化使界面内都是是空的。
定义好窗口和时钟最后讲窗口显示出来。
BOOLInitInstance(HINSTANCEhInstance,intnCmdShow)
{
HWNDhWnd;
intx,y;
hInst=hInstance;//Storeinstancehandleinourglobalvariable
hWnd=CreateWindow(szWindowClass,szTitle,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);
if(!
hWnd)
{
returnFALSE;
}
//窗口居中,高度包含标题栏的30
x=GetSystemMetrics(SM_CXSCREEN);
y=GetSystemMetrics(SM_CYSCREEN);
MoveWindow(hWnd,(x-GAMEWIDTH)/2,(y-GAMEHEIGHT-30)/2,GAMEWIDTH,GAMEHEIGHT+30,false);
//设置dc
hdcwindow=GetDC(hWnd);
hdcmem=CreateCompatibleDC(hdcwindow);
hdccanvas=CreateCompatibleDC(hdcwindow);
//用空位图初始化DC
hmapnull=CreateCompatibleBitmap(hdcwindow,GAMEWIDTH,GAMEHEIGHT);
SelectObject(hdccanvas,hmapnull);
SelectObject(hdcmem,hmapnull);
//位图初始化
bmStart.Init(hInstance,IDB_BITMAP_START);
bmStart.SetDevice(hdccanvas,hdcmem);
bmStart.InitSizeList(1,PICW,PICH);
bmBack.Init(hInstance,IDB_BITMAP_BACK);
bmBack.SetDevice(hdccanvas,hdcmem);
bmBack.InitSizeList(1,200,200);
bmSquare.Init(hInstance,IDB_BITMAP_SQUARE);
bmSquare.SetDevice(hdccanvas,hdcmem);
bmSquare.InitSizeList(5,22,22);
bmBomb.Init(hInstance,IDB_BITMAP_BOMB);
bmBomb.SetDevice(hdccanvas,hdcmem);
bmBomb.InitSizeList(5,22,22,1);
//按钮
mybutton.Init(hInstance,IDB_BITMAP_BUTTON);
mybutton.SetDevice(hdccanvas,hdcmem);
mybutton.InitButton(6,BtRect);//按钮
myclock.Init(hWnd,TIME_INFO);//时钟
srand((unsigned)time(NULL));//初始化随机函数
////////////显示窗口
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
returnTRUE;
}
3.2定义俄罗斯方块数据结构
俄罗斯方块通过坐标来实现,其数据结构如下:
//每四个点,表示一种方块
//(一维,二维都可以做)
POINTgl_square[28]={
//方形
{0,0},{1,0},{0,1},{1,1},
//长条
{0,-1},{0,0},{0,1},{0,2},
//Z
{-1,-1},{0,-1},{0,0},{1,0},
//Z
{-1,1},{0,1},{0,0},{1,0},
//L
{-1,-1},{-1,0},{0,0},{1,0},
//L
{-1,0},{0,0},{1,0},{1,-1},
//
{-1,0},{0,0},{1,0},{0,-1},
};
3.3游戏的主逻辑
将新的下坠物放置到游戏区域中去,这时可能出现马上到达底部的情况,因此需要对它进行判断,如果是到达底部,则进行销行处理,并且修改相应的数据状态。
而判断是否已经到达了底部,可以通过当前下坠物件所对应的接触面的方块位置为被占用状态来确定,利用数组记录1~7种下坠物的1~4种形态的接触面信息。
统计分数:
在消行处理里面有一个专门用来统计消行数的变量,然后根据变量的值决定分数的多少,程序统计分数是:
消一行得10分,同时消2行得30分,消得3行得60分,消得4行得100分。
如果总分数达到过关条件就过关,改变游戏速度。
没有达到过关分数或者没有满行,则加载下一个方块继续游戏。
如图3.1所示:
是
否
堆积方块,判断接触面状态及是否得分
2.统计分数
判断是否过关
关数增加,游戏速度将变快。
调用游戏速度模块增加游戏速度
视图重绘(InvalidateView())
1.判断行满、处理销行、堆积方块向下移动
图3.1示例
以下为实际代码中游戏的主要逻辑检测函数Checkgame的代码部分,根据系统的状态确定是否生产新的方块还是移动当前方块直到其落到底部判断是否该销行,进行下次的循环。
if(INVALID==squareNow.id)
{
//如果没有当前移动的方块
//生成当前方块
memcpy(&squareNow,&squareNext,sizeof(squareNext));
squareNow.pos.x=4;
squareNow.pos.y=0;
iTime=0;
if(!
CanMove())
{
//如果新生成的方块无法移动,失败
iState=GAME_FAIL;
myclock.ReStart(TIME_FAIL);
}
//生成下一个
CreateNext();
}
else
{
//移动当前方块
iTime++;
if(iTime>=12-iSpeed)
{
iTime=0;
if(!
CanMove())
{
//清除当前方块
squareNow.id=INVALID;
//写入数组
PutSpare();
}
else
{
squareNow.pos.y++;
}
}
}
3.4销行功能实现
当俄罗斯方块占满了空间内的一块或者多行时,系统就该消去一行,同时给用户相应的得分,当用户得分达到20分以上时则根据分数等级给予用户烟花表演以示鼓励。
用户游戏空间有19行,10列,每次判断销行时从最低行开始判断是否十列都被俄罗斯方块填满,填满则清楚该行然后循环判断。
其代码如下。
voidGAMEBOX:
:
ClearRow()
{
inti;
intm,n;//行列
intiNum;
intiScoreRow[]={0,10,30,60,100};//分值,1行10分,2行30,3行60,4行100
intiRow;//消去多少行
iRow=0;
//第19行,是最底一行
for(m=19;m>0;m--)
{
iNum=0;
for(n=0;n<10;n++)
{
iNum+=gamemap[m][n];
}
//消去一行
if(iNum==10)
{
iRow++;//统计消去多少行
for(i=m;i>0;i--)
{
//移动
memcpy(gamemap[i],gamemap[i-1],10*siz