基于c程序的俄罗斯方块游戏设计毕业设计.docx
《基于c程序的俄罗斯方块游戏设计毕业设计.docx》由会员分享,可在线阅读,更多相关《基于c程序的俄罗斯方块游戏设计毕业设计.docx(24页珍藏版)》请在冰点文库上搜索。
![基于c程序的俄罗斯方块游戏设计毕业设计.docx](https://file1.bingdoc.com/fileroot1/2023-5/11/c33694de-f901-4531-8175-fbe1cbb65359/c33694de-f901-4531-8175-fbe1cbb653591.gif)
基于c程序的俄罗斯方块游戏设计毕业设计
本科毕业论文(设计)
题目:
基于C程序的俄罗斯方块游戏设计
学院:
物理与电子科学学院
基于C程序的俄罗斯方块游戏设计
摘要:
俄罗斯方块是上世纪70年代设计出,是一个风靡全球的小简易液晶小游戏,虽然已经老旧,但是作为学习c语言还是可以作为一个很好的范例。
俄罗斯方块中使用的方块是有四个小正方形小黑色块组成,建立一个结构体将方块存放在这个机构体中。
如今技术的发展,可以为色块提供其他色彩,也可以增加色块的立体感,加大了游戏的美观性。
游戏的使用着可以通过上下左右等键对方块移动进行控制。
俄罗斯方块通常有七种类型的方块,需要使用c程编写函数控制它的生成移动已经消除。
玩游戏的人可以通过点击电脑键盘的控制键来控制方块的的移动已经变形,经过一定的摆放,程序判断是否消除以及执行消除。
俄罗斯方块要做出简单的图形,使用vc++与easyx软件进行编译。
文中将说明软件的使用。
文中使用的c语言需要在Windows7旗舰版下实现。
关键词:
俄罗斯方块;easyx;C语言
目录
1前言1
2初步设想1
2.1概述1
2.2俄罗斯方块的历史与前景1
2.2系统设计流程图3
3游戏的运行环境3
3.1硬件环境3
3.2软件环境3
3.3关于easyx的介绍4
4游戏的具体设计4
4.1方块的设计4
4.2游戏界面的初始化6
4.3游戏界面加入背景图片7
4.4游戏加入背景音乐7
4.5方块的初始化8
4.6对方块的移动动态设计控制9
4.7满行处理10
5测试运行11
5.1游戏代码输入到vc中11
5.2游戏结束时弹出来的对话框12
5.3绘图框中的游戏界面12
图513
结束语14
参考文献15
致谢15
1前言
在这个科技发展迅猛的时代,电子类产品已经深入到我们每个人的生活当中,成为我们日常生活中不可缺少的一部分。
俄罗斯方块游戏的出现可以说是游戏历史上的一件大事情,曾经创造的经济价值是不可估量的。
该游戏曾经被全世界人们所追捧,我们中国人也不另外。
小时候黑白机中游戏俄罗斯方块可以说是必不可少的。
如今,俄罗斯方块仍然没有离开我们的实现,qq游戏等诸多游戏平台以及网站都提供了俄罗斯方块的改良版,譬如双人游戏,积分游戏等。
每每看到俄罗斯方块游戏都会勾起我们童年的一些回忆,可以说,俄罗斯方块已不再单单是一款游戏,它已经是我们回忆的一部分,深深的烙在我们心中。
俄罗斯方块游戏方块随着计算机技术已经电子技术的发展而不断进步,而且在俄罗斯方块游戏基础上也推出了各种游戏,比如说玛丽医生,相信这款小游戏也得到很多人的青睐。
俄罗斯方块游戏操作简单,它的原理其实就是运动的方块自上而下下落,在底部堆叠组合,并按规则消除。
对于很多人而言,游戏的设计是高深莫测的,具有很高的专业技术难度。
俄罗斯方块作为一个比较老但是很具有代表性的游戏,对于一些新手如我这样的人来说,不失为一个学习的好游戏,而且,如今信息交流发达,可提供借鉴的材料也很多。
本论文使用vc++6.0以及easyx对俄罗斯方块游戏代码进行编写,提供了一个学习c的机会,以便以后学习并开放更好的游戏或者应用软件。
该简易俄罗斯方块游戏是在当下用户最多的windows操作系统下运行,拥有常见俄罗斯方块的基本功能,游戏玩家可通过键盘控制游戏区域中的活动方块进行操作。
设计的方块是随机出现的,并且拥有一定的色彩,提高了游戏的观赏性和可玩性。
游戏方块在下落到底板后堆叠,满一行就消去这一行。
值得注意的是本论文中加入了背景图片跟音乐,使这个游戏更具有趣味性。
2初步设想
2.1概述
综合自己在大学四年期间学习过的c语言知识,并通过自己查阅各种资料,设计俄罗斯方块游戏。
通过设计游戏的过程,让自己明白游戏开发的过程,为将来走向社会打好基础。
从游戏的设计到完成,提高自己的c语言编译能力。
2.2俄罗斯方块的历史与前景
俄罗斯方块顾名思义,这个小游戏一定跟俄罗斯有关。
在1984年的时候,一个俄罗斯的小程序员受到了拼图游戏的启发,经过一段不为人知的研究,编写了俄罗斯方块游戏,他的名字叫阿列克谢·帕吉特诺夫。
这个游戏在发明以后到现在,一直有很多人热爱。
据说,俄罗斯方块游戏至少有10亿人玩过,这个数据是不完全统计。
我认为,单单就中国这个拥有13亿劳苦大众的市场来说,这个游戏影响的不止一代人,而是好几代人。
我相信俄罗斯方块游戏是有史以来,迄今为止使用人数最多的游戏,也是最火的游戏,30多年来,俄罗斯方块游戏一直都存在在我们的事业中,你在qq游戏平台,以及别的平台,还有各个网页平台都能搜索到俄罗斯方块游戏,现代人给了俄罗斯方块更多的定义,可以有双人游戏,甚至还有了积分游戏,玩家可以通过游戏累加积分得到不同的更好的道具以增加游戏的趣味性。
在俄罗斯方块刚刚被作者创造出来的时候,因为俄罗斯还是一个社会主义国家,而且还处在冷战时期,游戏的开发已经都有一定的局限性,在当时的俄罗斯并没有推广开来,更没有形成一个产业。
人们只是使用电脑复制游戏来玩,仅仅作为一个娱乐的小程序,并没有想到将来造成的经济影响。
直到后来几年一个英国的软件公司的制造商到匈牙利拜访时看到有人玩彩色的俄罗斯方块游戏,这个商人以敏锐的经济眼光看到了这个游戏的发展前景,于是,他便到俄罗斯找到游戏的创始人商谈游戏的开发问题。
再后来的几年,各大软件制造商开始了疯抢游戏的分销权。
也是因为这种竞争,俄罗斯方块传到世界各地,当然也有中国这个大市场。
从此,俄罗斯方块游戏影响了中国几代人。
虽然俄罗斯方块的发展经历了30年,但是,依然没有减退她的光辉。
在现代电子技术的发展下,俄罗斯方块出现了3D模式,据说2013年还出现了《决战俄罗斯》。
2.2系统设计流程图
图1
3游戏的运行环境
3.1硬件环境
本论文中的代码实在windows7旗舰版下运行的,内存为2G,配置有键盘鼠标显示器,程序运行的最低硬件要求有待考究。
3.2软件环境
本论文中的编写使用了visualC+++6.0,eaysx2013最新版。
easyx为vc++6.0提供了图形库graphics.h,为游戏的设计提供了便利条件。
在游戏设计不再单单的创建file文件这么简单,步骤如下:
1.点击file,点击projects,创建win32consoleapplication,定义工程名。
注意不能加后缀。
确定以后工程创建完毕。
2.点击左侧界面内的工作区,点击已经创建好的工程,打开sourcefiles。
3.点击file,创建c++sourcefile,填写文件名,注意文件名不能加.c后缀。
图2
3.3关于easyx的介绍
在大一期间学习c语言是用到了vc,vc有较好的编辑和调试能力,但是却没有turboc的绘图能力,而且turboc这个软件没有更新,过于老旧,连最基本的复制粘贴这种功能都没有。
基于这种这种原因,还是用vc设计俄罗斯方块游戏,利用easyx提供的图形库设计俄罗斯方块游戏。
在easyx官网下载最新版压缩包,通过解压找到setup.hta文件,点击这个文件,再点安装库。
安装过程中会自动检测到电脑已装的vc,将库文件和头文件分别放入到vc对应的include和lib文件夹中。
也可以手动操作,将文件复制到对应文件夹中,这样就可以删掉easyx。
安装完毕后,输入范例程序运行,检查软件必要的环境是不是正确。
4游戏的具体设计
4.1方块的设计
首先是要设计游戏的方块,方块是有4*4即16个小色快构成的,0就是没有色块,1就是有色块。
按照既定的规律,方块有7钟,分别有z型,反z型,t型,7型,反7型,1型,口型,以下代码为定义结构体boxs,boxs结构体中7个元素就是上述提到到7个类型。
boxs[7]={
/*口
*口
*口口口口口
*口
*/
{0x0F00,0x4444,0x0F00,0x4444,blue},
/*
*口口
*口口
*/
{0x0660,0x0660,0x0660,0x0660,red},
/*
*口口口口口口口
*口口口口口口
*口口口
*/
{0x4460,0x02E0,0x0622,0x0740,YELLOW},
/*
*口口口口口口
*口口口口
*口口口口口口
*/
{0x2260,0x0E20,0x0644,0x0470,MAGENTA},
/*
*口口口
*口口口口
*口
*/
{0x0C60,0x2640,0x0C60,0x2640,GREEN},
/*
*口
*口口口口
*口口口
*/
{0x0360,0x4620,0x0360,0x4620,CYAN},
/
*口口口
*口口口口口口口口口口
*口口口
*/
{0x4E00,0x4C40,0x0E40,0x4640,BROWN}};
4.2游戏界面的初始化
initgraph(640,480)绘图的坐标体系范围是x640像素,y480像素。
坐标体默认x轴右为正方向,y轴是以下为正方向,这个是值得注意的,度量单位是象素。
坐标原点可以通过setorigin()函数修改游戏左下侧设置了游戏的操作说明,使用wasd操作方向。
//设置坐标原点
setorigin(220,20);
//绘制游戏区边界
rectangle(0,0,WID*SIZE,HEI*SIZE);
rectangle((WID+1)*SIZE,0,(WID+5)*SIZE,5*SIZE);
//显示操作说明
setfont(14,0,_T("宋体"));
outtextxy(20,330,_T("操作说明"));
outtextxy(20,350,_T("上:
旋转"));
outtextxy(20,370,_T("左:
左移"));
outtextxy(20,390,_T("右:
右移"));
outtextxy(20,410,_T("下:
下移"));
outtextxy(20,430,_T("空格:
沉底"));
outtextxy(20,450,_T("ESC:
退出"));
4.3游戏界面加入背景图片
为了增加游戏的美观度,我为游戏背景增加了图片,图标路径用双斜杠。
//主函数
voidmain()
{
//使用640*480色素的绘图框初始化
initgraph(640,480);
//找到图片,将图片引用到绘图框
loadimage(NULL,"D:
\\MSDev98\\MyProjects\\pictur\\514ff62248d5b962df15471a.jpg");
//按任意键退出
getch();
closegraph();
}
4.4游戏加入背景音乐
为了增加游戏的娱乐性,我为游戏添加了背景音乐,音乐使用童年经典的叮当猫。
加音乐的部分多使用了一个库文件,导入winmm.lib库,告诉编译器要用到得winmm.lib库,这样就可以使用windows的多媒体,并找到音乐开始播放。
此处的音乐文件要放到程序新建的工程文件夹中,即project中,pragma可以搜索工程文件夹找到音乐文件,并利用windows多媒体的播放器将找到的音乐播放。
#include
#include
#pragmacomment(lib,"Winmm.lib")
voidmain()
{
initgraph(640,480);
//找到工程文件夹中的音乐
mciSendString(_T("open叮当猫.mp3aliasmymusic"),NULL,0,NULL);
outtextxy(0,0,_T("俄罗斯方块游戏"));
_getch();
//使用windows的播放器播放音乐
mciSendString(_T("playmymusic"),NULL,0,NULL);
_getch();
closegraph();
}
4.5方块的初始化
初始化俄罗斯方块,编写代码将方块表示在游戏中。
用到了bar跟bar3d这两个函数,这两个函数同属于图形库。
这两个函数是easyx新增的函数,是具有三围立体效果,大大的提高了游戏的可观赏性。
一下仅介绍bar3d()的用法,该函数用于画有边框填充矩形。
函数中有depth这个参数,矩形深度,使方块具有立体感。
voidbar3d(
intleft,矩形左坐标x
inttop,矩形上坐标y
intright,矩形右坐标x
intbottom,矩形下坐标y
intdepth,矩形的深度
booltopflag当该值为false时,不画顶部
);
具体代码如下
voidDrawboxs(boxsINFO_boxs,DRAW_draw)
{
WORDb=g_boxs[_boxs.id].dir[_boxs.dir];
intx,y;
intcolor=BLACK;
switch(_draw)
{
caseSHOW:
color=g_boxs[_boxs.id].color;break;
caseHIDE:
color=BLACK;break;
caseFIX:
BYTEr=GetRValue(g_boxs[_boxs.id].color)*3/4;
BYTEg=GetGValue(g_boxs[_boxs.id].color)*3/4;
BYTEb=GetBValue(g_boxs[_boxs.id].color)*3/4;
color=RGB(r,g,b);
break;
}
setfillcolor(color);
for(inti=0;i<16;i++)
{
if(b&0x8000)
{
x=_block.x+i%4;
y=_block.y-i/4;
if(y{
if(_draw!
=HIDE)
bar3d(x*SIZE+2,(HEI-y-1)*SIZE+2,(x+1)*SIZE-4,(HEI-y)*SIZE-4,3,true);
else
bar(x*SIZE,(HEI-y-1)*SIZE,(x+1)*SIZE-1,(HEI-y)*SIZE-1);
}
}
b<<=1;
}
}
4.6对方块的移动动态设计控制
俄罗斯方块有左移,右移,下移,旋转等操作,以下以旋转和左移方块为例解释程序中对方块动态控制的操作。
旋转操作中,规定顺时针旋转方向是正方向,由一个操作键控制,没有反方向。
voidOnRotate()
{
//获取可以旋转的x偏移量
intdx;
BLOCKINFOtmp=g_CurBoxs;
tmp.dir++;if(Checkboxs(tmp)){dx=0;gotorotate;}
tmp.x=g_Curboxs.x-1;if(Checkboxs(tmp)){dx=-1;gotorotate;}
tmp.x=g_Curboxs.x+1;if(Checkboxs(tmp)){dx=1;gotorotate;}
tmp.x=g_Curboxs.x-2;if(Checkboxs(tmp)){dx=-2;gotorotate;}
tmp.x=g_Curboxs.x+2;if(Checkboxs(tmp)){dx=2;gotorotate;}
return;
rotate:
//旋转
Drawboxs(g_boxs,HIDE);
g_Curboxs.dir++;
g_Curboxs.x+=dx;
Drawboxs(g_CurBlock);
}
左移操作,只要把将方块的横坐标加一减一即可。
左减右加。
//左移方块
voidOnLeft()
{
boxsINFOtmp=g_Curboxs;
tmp.x--;
if(Checkboxs(tmp))
{
Drawboxs(g_Curboxs,HIDE);
g_Curboxs.x--;
Drawboxs(g_Curboxs);
}
}
4.7满行处理
对正在运动着的方块从下到上的顺序判断,如果该行方块代码显示为1的个数等于这一行的方块总数时,判断这一行满。
这个时候删除该行,就是删除满行,并且使用函数对游戏的界面进行重新绘图。
而且操作得到了这个时候游戏界面中不是满行的最高点,如果不是,那么就要对刚才判断的上一行进行再进行判断,直到游戏的最上行。
当消除满的一行行后,将上一行的方块移到下一行。
编写具体的实现代码如下。
for(y=g_Curboxs.y;y>=max(g_Curboxs.y-3,0);y--)
{
i=0;
for(x=0;xif(g_World[x][y]==1)
i++;
if(i==WID)
{
bRow=true;
row[g_Curboxs.y-y]=1;
setfillcolor(WHITE);
setfillstyle(DIAGCROSS2_FILL);
bar(0,(HEI-y-1)*SIZE+SIZE/2-2,WID*SIZE-1,(HEI-y-1)*SIZE+SIZE/2+2);
setfillstyle(SOLID_FILL);
}
}
5测试运行
5.1游戏代码输入到vc中
将代码按照先建立工程再建立文件的顺序,输入代码。
编译正确后运行。
图3
编译运行正确后0错误,0警告。
5.2游戏结束时弹出来的对话框
图4
5.3绘图框中的游戏界面
图5
图6
结束语
本文介绍了俄罗斯方块这款风靡世界的游戏的设计思路及其编程实现。
重点介绍各功能模块的设计原理和数据结构的实现。
通过本论文程序的编写和开发,进一步的提高了我的基本编程能力和游戏开发技巧,使我熟悉了C语言图形模式下的编程。
深入的理解了程序中有关结构体、数组及绘图等方面的知识。
通过本程序的训练,使我对C语言有了一个更深刻的了解。
本文的程序设计借鉴了参考书籍和互联网上相关程序的设计思想,在此对相关网站的源代码提供者表示衷心的感谢。
由于时间、经验及水平的原因,论文中难免有不足之处。
许多问题往往都不是只有一种解决方法,本游戏的开发也是如此,可以对此程序进行优化和功能完善或者使用不同方法来实现某些功能,以达到学以致用的目的
参考文献
[1]苏小红.C语言大学实用教程[M].北京:
电子工业出版社,1988
[2]荣软科.VisualC++游戏设计[M].北京:
北京科海电子出版社,1993
[3]严蔚敏,吴伟民.数据结构(C语言版)[M].北京:
清华大学出版社,1990
[4]仇芒仙,张丽华.C语言程序设计案例教程[M].北京:
清华大学出版社,1997
[5]姜灵芝,余健.C语言课程设计案例精编[M].北京:
清华大学出版社,2006
[6]StanleyB.Lippman.BarbaraC++Primer中文版[M].(美)北京:
人民邮电出版社,2009
[7]谭浩强.C++程序设计[M].北京:
清华大学出版社,2007
[8]黄维通.VisualC++面向对象与可视化程序设计[M].北京:
清华大学出版社,1989
[9]张敏.C程序与算法思想[M].北京:
高等教育出版社,2010
[10]周纯杰,刘正林.标准C语言程序设计及应用[M].北京:
华中科技大学,2005
致谢
在大学的四年转眼就要结束了,经过了一段时间的努力,我的《俄罗斯方块游戏(C语言)》这篇论文终于完成了。
对这次论文的编写使我受益非浅,我深刻的认识到理论和实践相结合的重要性,除了自身的努力之外,与各位老师、同学和朋友的关心、帮助和鼓励是分不开的,尤其是我的指导老师梁国栋,从游戏的设计、编写到程序的修改再到毕业论文定稿,梁老师一直悉心地指导我,使我受益非浅。
TheDesignofTetrisBasedonCLanguage
TetrisisapopulararoundtheworldtodesignasmallsimpleLCDgame,althoughalreadyold,butasalearningclanguageorcanbeusedasagoodexample.Tetrisboxiscomposedoffoursmallsquareblackpatches,theestablishmentofastructureboxstoredinthebodyofthisinstitution.Today,thedevelopmentoftechnology,canprovideblocksofcolorothercolorscanalsoincreasethesenseofthree-dimensionalcolorblocks,increasetheaestheticsofthegame.Gameboxmoveupanddownkeystocontrol.
Tetrisisusuallyseventypesofthebox,youneedtousethecdrivetowritefunctionstocontrolitsgenerationmobilehasbeeneliminated.Thepeoplewhoplaygamescanclickonthecontrolkeysofthecomputerkeyboardtocontrolboxmobilehasbeendeformed,placedafteracertainprogramtodeterminewhetherthecancellation,andimplem