俄罗斯方块游戏毕业论文_第1页
俄罗斯方块游戏毕业论文_第2页
俄罗斯方块游戏毕业论文_第3页
俄罗斯方块游戏毕业论文_第4页
俄罗斯方块游戏毕业论文_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、毕业论文声明本人郑重声明:1此毕业论文是本人在指导教师指导下独立进行研究取得的成果。除了特别加以标注地方外,本文不包含他人或其它机构已经发表或撰写过的研究成果。 对本文研究做出重要贡献的个人与集体均已在文中作了明确标明。本人完全意识到本声明的法律结果由本人承担。2本人完全了解学校、学院有关保留、使用学位论文的规定,同意学校与学院保留并向国家有关部门或机构送交此论文的复印件和电子版,允许此文被查阅和借阅。本人授权大学学院可以将此文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本文。3若在大学学院毕业论文审查小组复审中,发现本文有抄袭,一切后果均由本人承担,与

2、毕业论文指导老师无关。4. 本人所呈交的毕业论文,是在指导老师的指导下独立进行研究所取得的成果。论文中凡引用他人已经发布或未发表的成果、数据、观点等,均已明确注明出处。论文中已经注明引用的内容外,不包含任何其他个人或集体已经发表或撰写过的研究成果。对本文的研究成果做出重要贡献的个人和集体,均已在论文中已明确的方式标明。学位论文作者(签名):年月关于毕业论文使用授权的声明本人在指导老师的指导下所完成的论文及相关的资料(包括图纸、实验记 录、原始数据、实物照片、图片、录音带、设计手稿等),知识产权归属华北 电力大学。本人完全了解大学有关保存,使用毕业论文的规定。同意学校保存 或向国家有关部门或机构

3、送交论文的纸质版或电子版,允许论文被查阅或借 阅。本人授权大学可以将本毕业论文的全部或部分内容编入有关数据库进行检 索,可以采用任何复制手段保存或编汇本毕业论文。 如果发表相关成果,一定 征得指导教师同意,且第一署名单位为大学。本人毕业后使用毕业论文或与该 论文直接相关的学术论文或成果时,第一署名单位仍然为大学。本人完全了解 大学关于收集、保存、使用学位论文的规定,同意如下各项内容:按照学校要求提交学位论文的印刷本和电子版本; 学校有权保存学位论文 的印刷本和电子版,并采用影印、缩印、扫描、数字化或其它手段保存或汇编 本学位论文;学校有权提供目录检索以及提供本学位论文全文或者部分的阅览 服务;

4、学校有权按有关规定向国家有关部门或者机构送交论文的复印件和电子 版,允许论文被查阅和借阅。本人授权大学可以将本学位论文的全部或部分内 容编入学校有关数据库和收录到中国学位论文全文数据库进行信息服务。 在不以赢利为目的的前提下,学校可以适当复制论文的部分或全部内容用于学 术活动。论文作者签名:日期:指导教师签名:日期:中国石油大学(北京)现代远程教育毕业设计(论文)3俄罗斯方块游戏毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导 下进行的研究工作及取得的成果。 尽我所知,除文中特别加以标注和致谢的地 方外,不包含其他人或组织已经发

5、表或公布过的研究成果, 也不包含我为获得 及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过 贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。作者签名: 日期:指导教师签名: 日期:使用授权说明本人完全了解 大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权 保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校 可以采用影印、缩印、数字化或其它复制手段保存论文; 在不以赢利为目的前 提下,学校可以公布论文的部分或全部内容。作者签名: 日 期:1中国石油大学(北京)现代远程教育毕业论文(论文)

6、俄罗斯方块游戏摘要俄罗斯方块是一款风靡全球的掌上游戏机和 PC机游戏,它造成的轰动与 创造的经济价值可以说是游戏史上的一件大事。它由俄罗斯人阿列克谢帕基特诺夫发明,故得此名。俄罗斯方块的基本规则是移动、 旋转和摆放游戏自动 输出的各种方块,使之排列成完整的一行或多行并且消除得分。它看似简单却 变化无穷,俄罗斯方块上手极其简单,但是要熟练地掌握其中的操作与摆放技 巧,难度却不低。作为家喻户晓老少皆宜的大众游戏, 其普及程度可以说是史 上任何一款游戏都无法相比的。相信大多数人都还记得为它痴迷得茶不思饭不 想的那个俄罗斯方块时代。由于俄罗斯方块具有的数学性、动态性与知名度, 也经常拿来作为游戏程序设

7、计的练习题材。关键词:俄罗斯方块开发;游戏编程;程序开发-3 -目录1 . 前言 52 .功能描述 63 .总体设计 83.1 功能模块设计 83.1.1 游戏执行主流程 83.1.2 游戏方块预览 83.1.3 游戏方块控制 93.1.4 游戏显示更新 113.1.5 游戏速度分数更新 123.1.6 游戏帮助 123.2 数据结构设计 123.2.1 游戏底板BOAR匿构体 123.2.2 游戏方块SHAPE吉构体 133.2.3 SHAPE 结构数组 143.3 函数功能描述 164 .程序实现 194.1 源码分析 194.1.1 程序预处理1 94.1.2 主函数 main()244

8、.1.3 初始化界面304.1.4 时钟中断处理 3 14.1.5 成绩、速度及帮助的显示 334.1.6 满行处理 344.1.7 游戏方块的显示和清除 394.1.8 游戏方块操作判断处理 454.2 运行结果 524.2.1 游戏初始状态 524.2.2 游戏进行状态 535 .结论 54致谢 55参考文献 56中国石油大学(北京)现代远程教育毕业论文(论文)1 .前言俄罗斯方块(Tetris )原本是前苏联科学家阿列克谢帕吉特洛夫在1984年6月利用空闲时间所编写的游戏程序,据说游戏的作者最喜欢网球(Tennis ) 运动,于是,它把来源于希腊语的tetra (意为“四”)与其结合,造

9、了 “tetris ” 一词,之后开始提供授权给各个游戏公司, 造成各平台上俄罗斯游戏软件大量 发行的现象。俄罗斯方块由于上手简单、老少皆宜,从而成为了家喻户晓款风靡全球的 一款电视游戏机和掌上游戏机游戏。C语言则是目前国际上比较流行的计算机高级编程语言之一,因其简洁、 使用方便且具备强大的功能而受到编程人员的普遍青睐。它既适合作为系统描 述语言,也可以用来编写系统软件,还可以来编写应用软件。用C语言来编写俄罗斯方块这个游戏有较大优势: C语言具有各种各样的 数据类型,并引入了指针概念,使得程序效率更高; C语言还包含很广泛的运 算符;另外C语言具有强大的图形功能,支持多种显示器和驱动器,而且

10、计算 功能、逻辑判断能力也比较强大。选择此论文题是旨在训练基本编程能力和游戏开发技巧,熟悉C语言图形模式下的编程。本程序中涉及结构体、数组、时钟中断及绘图等方面的知识。 通过本程序的训练,能对C语言有一个更深刻的了解,掌握俄罗斯方块游戏开 发的基本原理,为将来开发出高质量的游戏软件打下坚实的基础。-7 -2 .功能描述如图2.1所示,本游戏主要实现一下几种功能:俄罗斯方块游戏游戏方块预览功能图2.1俄罗斯方块游戏功能描述图(1)游戏方块预览功能。在游戏过程中,当在游戏底板中出现一个游戏方 块时,必须在游戏方块预览区域中出现下一个游戏方块,这样有利于游戏玩家控制游戏的策略。由于在此游戏中存在 1

11、9种不同的游戏方块,所以在游戏方 块预览区域中需要显示随机生成的游戏方块。(2)游戏方块控制功能。通过各种条件的判断,实现对游戏方块的左移、 右移、快速下移、自由下落、旋转功能,以及行满消除行的功能。(3)游戏显示更新功能。当游戏方块左右移动、下落、旋转时,要清除先 前的游戏方块,用新坐标重绘游戏方块。当消除满行时,要重绘游戏底板的当 前状态。(4)游戏速度分数更新功能。在游戏玩家进行游戏过程中,需要按照一定的游戏规则给玩家计算游戏分数。比如,消除一行加 10分。当游戏分数达到 一定数量之后,需要给游戏者进行等级的上升,每上升一个等级,游戏方块的 下落速度将加快,游戏的难度将增加。(5)游戏帮

12、助功能。玩家进入游戏后,将有对本游戏如何操作的友情提示。中国石油大学(北京)现代远程教育毕业论文(论文)3 .总体设计3.1 功能模块设计3.1.1 游戏执行主流程本俄罗斯方块游戏执行主流程图3.1所示。在判断键值时,有左移VK_LEFT 右移VK_RIGHT下移VK_DOW酸形旋转VK_UP退出VK_ESCt值的判断。3.1.2 游戏方块预览新游戏方块将在如图3.2所示的4X4的正方形小方块中预览。使用随机函 数rand()来产生119之间的游戏方块编号,并作为预览的方块编号。其中的 正方形小方块的大小为BSIZEX BSIZE BSIZE为设定的像素大小。 匚图3.2游戏方块预览图-9 -

13、3.1图3.1游戏执行主流程图.3游戏方块控制这是此游戏开发的重点和难点部分。下面分别较少左移、右移、下移、旋中国石油大学(北京)现代远程教育毕业论文(论文)转及满行判断的实现。左移的实现过程如下:(1)判断在当前的游戏底板中能否左移。 这一判断必须满足如下两条件:游 戏方块整体左移一位后,游戏方块不能超越游戏底板的左边线, 否则越界;并 且在游戏方块有值(值为1)的位置,游戏底板必须是没有被占用的(占用时, 值为1)。若满足这两个条件,则执行下面的左移动作。否则不执行左移动作。(2) 清除左移前的游戏方块。(3) 在左移一位的位置,重新显示此游戏方块。右移的实现过程如下:(1)判断在当前游戏

14、底板中能否右移。这一判断必须满足如下两个条件:游 戏方块整体右移一位后,游戏方块不能超越游戏底板的右边线, 否则越界;并 且在游戏方块有值(值为1)的位置,游戏底板必须是没有被占用的(占用时, 值为1)。若满足这两个条件,则执行下面的右移动作。否则不只执行右移动 作。(2) 清除右移前的游戏方块。(3) 在右移一位的位置,重新显示此游戏方块。下移的实现过程如下:(1)判断在当前游戏底板中能否下移。这一判断必须满足如下两个条件:游 戏方块整体下移一位后,游戏方块不能超越游戏底板的底边线, 否则越界;并 且在游戏方块有值(值为1)的位置,游戏底板必须是没有被占用的(占用时, 值为1)。若满足这两个

15、条件,则执行下面的下移动作。否则,将 flag_newbox 标志置1,主循环中会判断此标志,若为 1,则会生成下一个游戏方块,并更新预览游戏方块。(2) 清除下移前的游戏方块。(3) 在下移一位的位置,重新显示此游戏方块。旋转的实现过程如下:(1)判断在当前游戏底板中能否旋转。这一判断必须满足如下条件:游戏方 块整旋转后,游戏方块不能超越游戏底板的左边线、 右边线和底边线,否则越 界;并且在游戏方块有值(值为1)的位置,游戏底板必须是没有被占用的(占 用时,值为1)。若满足这些条件,则执行下面的旋转动作。否则不只执行旋 转动作。(2) 清除旋转前的游戏方块。(3) 在游戏方块显示区域(4X4

16、)不变的位置,利用保存当前游戏方块的数据 结构中的next值作为旋转后形成的新游戏方块的编号,并重新显示这个编号 的游戏方块。当生成新的游戏方块前,执行行满的检查,判断行满的过程为:一次从下到上扫描游戏底板中的各行,若某行中1的个数等于游戏底板水平 方向上的小方块的个数,则表示此行是满的。找到满行后,立即将游戏底板中 的数据往下顺移一行,直到游戏底板逐行扫描完毕。3.1.4 游戏显示更新当游戏方块左右移动、下落、旋转时,要清除先前的游戏方块,用新坐标重 绘游戏方块。当消除满行时,要重绘游戏底板的当前状态。清除方块的过程为:用先画轮廓再填充的方式,使用背景色填充小方块,然 后使用前景色画一个游戏

17、底板中的小方块。 循环此过程,变化当前坐标,填充 及画出共16个这样的小方块。这样在游戏底板中,清除了此游戏方块。3.1.5 游戏速度分数更新当判断出一行满时,score变量一固定值(如10),可以吧等级level看作是 速度speed,因为速度speed是根据计分score值不断上升的,所以我们定义 level=speed=score/speed_step , 其中 speed_step 是每升级所需要的分 数。方块下落速度加快,这是不断修改了定时计数器变量TimerCounter判断条件的结果。速度越快,时间中断的间隔就越短。3.1.6 游戏帮助实现比较简单,使用outtextxy()函数

18、实现。3.2数据结构设计3.2.1 游戏底板BOARD吉构体Struct BOARDInt var;Int color;Table_boardVertical_boxsHorizontal_boxs;BOARD结构体表示游戏底板中每个小方块所具有的属性。其中var表示小方块当前状态,只有。与1两个值,表示此小方块已被占用,。表示未被占用。 Color表示小方块的颜色,游戏底板的每个小方块可以拥有不同的颜色,以增 强美观。Vertical_boxs 为游戏底板上垂直的方向上小方块的个数, Horizontal_boxs为游戏底板上水平的方向上小方块的个数。11中国石油大学(北京)现代远程教育毕业

19、论文(论文)3.2.2 游戏方块SHAPE吉构体struct SHAPEchar box2;int color;/*每个方块的颜色*/int next;/*下个方块的编号*/;SHAPE结构体表示某个游戏方块具有的属性。其中,char box2表示用2个字节来表示这个游戏方块的形状。每4位来表示一个游戏方块的一行。Color 表示每个游戏方块的颜色,颜色可设为BLACK BLUE GREENCYAN RE MAGENT A BROW LIGHTGRAY5ARKGRAYGHTBLUSLIGHTCYANLIGHTREDLIGHTMAGENTA YELLOWR WHITEnext表示下个游戏方块的编

20、号,在旋转时需要用到此编号。如box0="0x88",box1="0xc0", 其中0x88和0xc0为十六进制表示形式, 具体表现的含义如图3.3所示。1000100011000000图3.3 SHAPE结构示意图3.2.3 SHAPE结构数组初始化游戏方块内容,即定义MAX_BO淤SHAP或型的结构数组,并初始化 MAX_BOX19。应为一共有19种不同形状的俄罗斯方块。struct SHAPE shapesMAX_BOX= /*口口口口口口口口口口*/0x88, 0xc0, CYAN, 1,0xe8, 0x0, CYAN, 2,0xc4, 0x40

21、, CYAN, 3,0x2e, 0x0, CYAN, 0,/*口口 口口口口口* 口口 口口口 口*/0x44, 0xc0, MAGENTA, 5,0x8e, 0x0, MAGENTA, 6,0xc8, 0x80, MAGENTA, 7,0xe2, 0x0, MAGENTA, 4, /*15口口口口口口*/0x8c,0x40,YELLOW, 9,0x6c,0x0,YELLOW, 8,/*口口口口口口*/0x4c,0x80,BROWN, 11,0xc6,0x0,BROWN, 10,/* 口口口口口口口口口口*/0x4e, 0x0,WHITE,13,0x8c, 0x80,WHITE,14,0xe4

22、, 0x0,WHITE,15,0x4c, 0x40,WHITE,12,/* 口中国石油大学(北京)现代远程教育毕业论文(论文)* 口口口口口* 口* /0x88, 0x88, RED, 17,0xf0, 0x0, RED, 16,/* 口口* 口口* /0xcc, 0x0, BLUE, 183.3函数功能描述(1) newtimer()函数原型:void interrupt newtimer(void)Newtimer()函数用于为新的时钟中断处理函数。(2) SetTimer()函数原型:void SetTimer(void interrupt(*IntProc)(void)SetTimer

23、()函数用于设置新的时钟中断处理过程。(3) KillTimer()函数原型:void KillTimer()KillTimer()函数用于恢复原有的时钟中断处理过程。(4) initialize。函数原型:void initialize( int x,int y,int m,int n)Initialize。函数用于初始化界面,具体为在传入参数x、y指明位置上画 m行n列小方块,并显示积分、等级、帮助及预览游戏方块等。(5) DelFullRow()函数原型:int DelFullRow(int y)DelFullRow()函数用于处理删除一满行的情况。Y指明具体哪一行为满行。(6) set

24、FullRow()函数原型:void setFullRow(int t_boardy)setFullRow()函数用于找到满行,并调用 DelFullRow()函数来处理满行。t_boardy为在游戏底板中的垂直方向的坐标值。(7) MkNextBox()函数原型:int MkNextBox(int box_numb)MkNextBox()函数用于生成下一个游戏方块,并返回方块号。Box_numbg示当前的游戏方块号。(8) EraseBox()函数原型: void EraseBox(int x,int y,int box_numb)EraseBox()函数用于清除(x,y)位置开始的编号为b

25、ox_numb的游戏方块。(9) show_box()函数原型: void show_box(int x,int y,int box_numb,int color)show_box()函数用于显示(x,y)位置开始的编号为 box_numb的、颜色值为 color的游戏方块。(10) MoveAble()函数原型:int MoveAble(int x,int y,int box_numb,int direction)MoveAble()函数判断是否可以移动。(x,y)为当前方块位置,box_numb为方 块号,direction为方向标志,返回true和false 。(11) 主函数 main

26、()17中国石油大学(北京)现代远程教育毕业论文(论文)整个游戏的主控部分194.程序实现4.1 源码分析4.1.1 程序预处理包括加载头文件,定义结构体、常量和变量,并对它们进行初始化工作/*加载头文件*/#include <stdio.h>#include <stdlib.h>#include <dos.h>#include <graphics.h> /*/*定义按键码*/#define VK_LEFT 0x4b00#define VK_RIGHT 0x4d00#define VK_DOWN 0x5000#define VK_UP 0x480

27、0#define VK_ESC 0x011b# define TIMER 0x1c /*/*定义常量*/# define MAX_BOX 19/*# define BSIZE 20/*# define Sys_x 160/*图形函数库*/设置中断号*/总共有19种各形态的方块*/方块的边长是20个象素*/显示方块界面的左上角x座标*/ 显示方块界面的左上角y座标*/# define Sys_y 25/*中国石油大学(北京)现代远程教育毕业论文(论文)# define Horizontal_boxs 10 /* 水平的方向以方块为单位的长度 */# define Vertical_boxs 15

28、 /* 垂直的方向以方块为单位的长度 */# define Begin_boxs_x Horizontal_boxs/2 /* 产生第一个方块时出现的起始 位置*/# define FgColor 3/*前景颜色,如文字.2-green*/# define BgColor 0/*背景颜色.0-blac*/# define LeftWin_x Sys_x+Horizontal_boxs*BSIZE+46 /*右边状态栏的 x座标*/# define false 0# define true 1/*移动的方向*/# define MoveLeft 1# define MoveRight 2# de

29、fine MoveDown 3# define MoveRoll 4/*以后坐标的每个方块可以看作是像素点是BSIZE*BSIZE的正方形*/*定义全局变量*/int current_box_numb; /*保存当前方块编号*/int Curbox_x=Sys_x+Begin_boxs_x*BSIZE,Curbox_y=Sys_y; /*x,y 是保存方块的当前坐标的*/int flag_newbox=false; /* 是否要产生新方块的标记 0*/int speed=0; /*下落速度 */int score=0; /*总分*/int speed_step=30; /*每等级所需要分数*/

30、void interrupt (*oldtimer)(void); /*指向原来时钟中断处理过程入口的中断处理函数指针*/struct BOARD /*游戏底板结构,表示每个点所具有的属性*/int var;/*当前状态 只有。和1,1表示此点已被占用*/int color;/*颜色,游戏底板的每个点可以拥有不同的颜色.增强美观*/Table_boardVertical_boxsHorizontal_boxs;/*方块结构*/struct SHAPEchar box2;/*的一行是:1000100011000000*/int color;/*一个字节等于8位,每4位来表示一个方块如:box0=

31、"0x88",box1="0xc0" 表示的每个方块的颜色*/下个方块的编号*/int next;/* ;/*初始化方块内容.即定义MAX_BOX SHAPE1型的结构数组,并初始化*/struct SHAPE shapesMAX_BOX=-23/*口口口口口口口口口口*/0x88,0xc0,CYAN,1,0xe8,0x0,CYAN,2,0xc4,0x40,CYAN,3,0x2e,0x0,CYAN,0,/*口口口口口口口口口口*/0x44,0xc0,MAGENTA,5,0x8e,0x0,MAGENTA,6,0xc8,0x80,MAGENTA,7,0xe2

32、,0x0,MAGENTA,4,/*口口口口口口*/中国石油大学(北京)现代远程教育毕业论文(论文)-250x8c, 0x40, YELLOW, 9,0x6c, 0x0, YELLOW, 8,/* 口口口* 口口口口* 口* /0x4c, 0x80, BROWN, 11,0xc6, 0x0, BROWN, 10,/* 口口口* 口口口 口口口口口口口* 口口口*/0x4e, 0x0, WHITE, 13,0x8c, 0x80, WHITE, 14,0xe4, 0x0, WHITE, 15,0x4c, 0x40, WHITE, 12, /* 口* 口口口口口* 口* 口*/0x88, 0x88,

33、RED, 17,0xf0, 0x0, RED, 16,/* 口口* 口口* /0xcc, 0x0, BLUE, 18;unsigned int TimerCounter=0; /*定时计数器变量 */4.1.2 主函数 main()Main()函数主要是实现了对整个程序的运行控制,以及相关功能模块的调 用。void main()int GameOver=0;int key,nextbox;int Currentaction=0;/*标记当前动作状态*/int gd=VGA,gm=VGAHI,errorcode;initgraph(&gd,&gm,"");er

34、rorcode = graphresult();if (errorcode != grOk)printf("nNotice:Graphicserror:%sn",grapherrormsg(errorcode);printf("Press any key to quit!");getch();exit(1);setbkcolor(BgColor);setcolor(FgColor);randomize();SetTimer(newtimer);initialize(Sys_x,Sys_y,Horizontal_boxs,Vertical_boxs);/*

35、初始化*/nextbox=MkNextBox(-1);show_box(Curbox_x,Curbox_y,current_box_numb,shapescurrent_box_numb .color);show_box(LeftWin_x,Curbox_y+200,nextbox,shapesnextbox.color);show_intro(Sys_x,Curbox_y+320);getch();while(1)/* Currentaction=0;flag_newbox=false;检测是否有按键*/if (bioskey(1)key=bioskey(0); else key=0; sw

36、itch(key)中国石油大学(北京)现代远程教育毕业论文(论文)case VK_LEFT:if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveLeft)EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_x-=BSIZE;Curre ntaction=MoveLeft;break;case VK_RIGHT:if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveRight)EraseBox(Curbox_x,Curbox_y,current_b

37、ox_numb);Curbox_x+=BSIZE;Curre ntaction=MoveRight;break;case VK_DOWN:if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown)EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_y+=BSIZE;Curre ntaction=MoveDown;else flag_newbox=true;break;旋转方块*/case VK_UP:/*if(MoveAble(Curbox_x,Curbox_y,shapescurrent

38、_box_numb.next,MoveRol l)EraseBox(Curbox_x,Curbox_y,current_box_numb);current_box_numb=shap escurrent_box_numb.next;Currentaction=MoveRoll;break;case VK_ESC:GameOver=1;break;default:break;if(Currentaction) /*表示当前有动作,移动或转动*/show_box(Curbox_x,Curbox_y,current_box_numb,shapescurrent_box_numb .color);Cu

39、rrentaction=0;/*按了往下键,但不能下移,就产生新方块*/if(flag_newbox)/*这时相当于方块到底部了,把其中出现点满一行的清去,置0*/ErasePreBox(LeftWin_x,Sys_y+200,nextbox);nextbox=MkNextBox(nextbox);show_box(LeftWin_x,Curbox_y+200,nextbox,shapesnextbox.color);if(!MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown)/* 刚开 始,游戏结束*/show_box(Curbox_x,

40、Curbox_y,current_box_numb,shapescurrent_box_numb .color);GameOver=1; else flag_newbox=false;Currentaction=0;else /* 自由下落*/if(Currentaction=MoveDown | TimerCounter>(20-speed*2)if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown) EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_y+=BSIZE;show

41、_box(Curbox_x,Curbox_y,current_box_numb,shapescurrent_box_numb .color);TimerCounter=0;if(GameOver )/*| flag_newbox=-1*/printf("game over,thank you! your score is %d”,score);getch();break;-29中国石油大学(北京)现代远程教育毕业论文(论文)getch();KillTimer();closegraph();4.1.3初始化界面玩家进行游戏时,需要对游戏界面进行初始化工作。 此代码被main()函数调用

42、。主要进行的工作如下:循环调用line()函数绘制当前游戏板。调用ShowScore()函数显示初始的成绩,初始成绩为 0。调用ShowSpeed()函数显示初始的速度(等级),初始速度1。/*初始化界面 *参数说明:x,y 为左上角坐标m,n 对应于 Vertical_boxs,Horizontal_boxs分别表示纵横方向上方块的个数(以方块为单位)BSIZE Sys_x Sys_y*void initialize(int x,int y,int m,int n)int i,j,oldx;oldx=x;for(j=0;j<n;j+) for(i=0;i<m;i+)Table_b

43、oardji.var=0;Table_boardji.color=BgColor;line(x,y,x+BSIZE,y);line(x,y,x,y+BSIZE);line(x,y+BSIZE,x+BSIZE,y+BSIZE);line(x+BSIZE,y,x+BSIZE,y+BSIZE);x+=BSIZE;y+=BSIZE;x=oldx;Curbox_x=x;Curbox_y=y;/*x,y是保存方块的当前坐标的*/flag_newbox=false; /* 是否要产生新方块的标记 0*/speed=0; /*下落速度*/score=0; /*总分*/ShowScore(score);Show

44、Speed(speed);4.1.4 时钟中断处理随着用户等级的提高,需要加快方块的下落速度,以增加游戏难度。速度越快,时间中断的间隔就越短。主要进行的工作如下:(1) 定义新的时钟中断处理函数 void interrupt newtimer(void) 。(2) 使用SetTimer()设置新的时钟中断处理过程。(3) 定义中断恢复过程 KillTimer()。void interrupt newtimer(void)(*oldtimer)(); /* call the old routine */TimerCounter+;/* increase the global counter */

45、*设置新的时钟中断处理过程*/void SetTimer(void interrupt(*IntProc)(void)01dtimer=getvect(TIMER); /*获取中断号为TIMER的中断处理函数的入口地址*/disable。;/*设置新的时钟中断处理过程时,禁止所有中断*/setvect(TIMER,IntProc);/* 将中断号为TIMER勺中断处理函数的入口地址改为IntProc()函数的入 口地址即中断发生时,将调用IntProc()函数。*/enable。; /*开启中断*/*恢复原有的时钟中断处理过程*/-31中国石油大学(北京)现代远程教育毕业论文(论文)void

46、KillTimer()disable。;setvect(TIMER,oldtimer);enable();4.1.5 成绩、速度及帮助的显示成绩、速度及帮助的显示是此游戏开发的一部分。不要进行的工作如下:(1) 调用ShowScore()函数,显示当前用户的成绩,成绩是不断提高的。(2) 调用ShowSpeed()函数,显示当前游戏方块的下落速度,速度与等级是 成正比的。(3) 调用Show_help()函数,提示用户如何进行游戏的相关操作,此函数只 在初始部分调用。/*显示分数*/void ShowScore(int score)int x,y;char score_str5;/*保存游戏得

47、分 */setfillstyle(SOLID_FILL,BgColor);x=LeftWin_x;y=100;bar(x-BSIZE,y,x+BSIZE*3,y+BSIZE*3);sprintf(score_str,"%3d",score);outtextxy(x,y,"SCORE");-35中国石油大学(北京)现代远程教育毕业论文(论文) outtextxy(x,y+10,score_str);/*显示速度*/void ShowSpeed(int speed)int x,y;char speed_str5;/* 保存速度值 */setfillstyle

48、(SOLID_FILL,BgColor);x=LeftWin_x;y=150;bar(x-BSIZE,y,x+BSIZE*3,y+BSIZE*3);/*确定一个以(x1,y1)为左上角,(x2,y2)为右下角的矩形窗口,再按规定图模和颜色填充。*/sprintf(speed_str,"%3d”,speed+1);outtextxy(x,y,"Level");outtextxy(x,y+10,speed_str);/* 输出字符串指针speed_str所指的文本在规定的(x, y)位置*/ outtextxy(x,y+50,"Nextbox");

49、4.1.6 满行处理在左移、右移、旋转和下落动作不能进行时,即游戏方块不满足相关操作条 件时,需要对游戏主板进行是否有满行的判断,若有满行的情况,则必须进行消除满行的处理。如图4.1所示,当竖直的游戏方块下落在当前游戏板中,不能再下移时,出现了两个行事满的,则必须进行满行处理。满行处理包括两个 动作:第一,找到满行;第二,处理此满行。1) 调用 setFullRow()函数调用setFullRow()函数,找到一满行。具体过程如下:(1) 对当前游戏方块落在的位置,从下到上逐行判断,若该行的小方块的值 为1的个数等于游戏主板行的大小时,则该行为满行,立即调用DelFullRow() 函数进行满

50、行处理,并返回当前的游戏主板的非空行的最高点。 否则,继续进 行对上一行的判断,直到游戏方块的最上行。(2) 若有满行,则根据 DelFullRow()函数处理后的游戏主板 Table_board 数组中的值,进行游戏主板的重绘,即显示消除行后的游戏界面,并且对成绩 和速度进行更新。2) 调用 DelFullRow()函数调用DelFullRow()函数,处理此满行,主要执行的是将上行数据移至下移 的操作。图4.1满行示意图/*找到一行满的情况*/void setFullRow(int t_boardy)int n,full_numb=0,top=0; /*top保存的是当前方块的最高点*/中

51、国石油大学(北京)现代远程教育毕业论文(论文)register m;/*t_boardy 口5口6口口口口口口 7n 口口口口口口 8*/for(n=t_boardy+3;n>=t_boardy;n-)if(n<0 | n>=Vertical_boxs )continue; /*for(m=0;m<Horizontal_boxs;m+) /*if(!Table_boardn+full_numbm.var)break; /* 有一个是空就跳过该行*/if(m=Horizontal_boxs)/*if(n=t_boardy+3)/*高的*/top=DelFullRow(n+

52、full_numb); /*的该行,并下移数据*/elseDelFullRow(n+full_numb);超过低线了 */水平的方向*/发现找到满行了 */第一次献给了 n,最清除游戏板里统计找到的行数*/full_numb+;/*if(full_numb)int oldx,x=Sys_x,y=BSIZE*top+Sys_y;oldx=x;score=score+full_numb*10; /*力口分数 */*这里相当于重显调色板*/for(n=top;n<t_boardy+4;n+)if(n>=Vertical_boxs)continue; /*超过低线了 */for(m=0;m<Horizontal_boxs;m+) /*水平的方向 */ if(Table_boardnm.var)setfillstyle(SOLID_FILL,Table_boardnm.color);/*Table_boardnm .color*/elsesetfillstyle(SOLID_FILL,BgColor);bar(x,y,x+BSIZE,y+BSIZE);line(x,y,x+B

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论