c语言俄罗斯方块实验报告_第1页
c语言俄罗斯方块实验报告_第2页
c语言俄罗斯方块实验报告_第3页
c语言俄罗斯方块实验报告_第4页
c语言俄罗斯方块实验报告_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

1、-PAGE . z. C语言之游戏俄罗斯方块课程设计报告 专业: 学生*: 指导教师: 完成时间: -. z.目录 TOC o 1-3 h z u HYPERLINK l _Toc271612941一、需求分析 PAGEREF _Toc271612941 h 2HYPERLINK l _Toc271612942二、概要设计 PAGEREF _Toc271612942 h 2HYPERLINK l _Toc271612943三、详细设计 PAGEREF _Toc271612943 h 4HYPERLINK l _Toc271612944四、调试分析 PAGEREF _Toc271612944 h

2、 8HYPERLINK l _Toc271612945五、用户手册 PAGEREF _Toc271612945 h 9HYPERLINK l _Toc271612946六、测试数据 PAGEREF _Toc271612946 h 9HYPERLINK l _Toc271612947七、附录 PAGEREF _Toc271612947 h 10一、需求分析格式:黑体,四号字,英文用times new roman,以下的标题格式均采用该格式。行距为多倍行距,设置值为1.73该程序是完成一个简易的俄罗斯方块的任务,其要完成几个重要的功能:界面,方块下落,旋转,判断是否还能下落,左右移动,分数,速度设

3、置,清楚满的每行,下个方块的预览等;可用#include 的头文件来实用几个函数来控制并完成游戏的界面;可用7个二维5*5数组去实现下落方块的全部类型,再用随机函数使其随机下落;用#include 的头文件去使用按键的控制,以保证用户能够合理操作;并用#include 的头文件来使用rand函数来随机出示七种方块;完成正常的显示和下个方块的预览;用 #include 来运用时针去控制时间;程序执行过程:然后加上几个根本的头文件来执行函数,首先设置按键操作,用:w,a,d,s控制,然后进展界面的初始化设置,启动,时针参数设置,开场新游戏,开场随机下落方块,显示下一个方块,再行旋转,移动,去除,加

4、分,速度参数,最后判断是否已满,停顿游戏,打出分数,完毕的画面设置,游戏终止.二、概要设计格式:黑体、四号字,同标题一该程序中的函数设置总体主要功能大致如下1.找到适宜的方块盒子7种使其一一下落 bo*MA*_C55 = /*MA*_C(7)种预定义的盒子*/ 这样用类似的7个5*5二维数组来实现每个盒子方块的形状,自此就引荐两个作为介绍, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0,0, 0,1,1,1,0, 0,0,0,0,0, 0,0,0,0,0 , 0,0,0,0,0, 1,1,1,1,0, 0,0,0,0,0, 0,0,0,0,0 ,如此中用1代表显示的格子,0代表空

5、。设置时间指针,实现旋转,移动,消去,显示加分,改变速度分别用下面函数表示 int setTimer(Timer *t, unsigned int intv, BOOL en); /*设置时钟t,参数分别为时钟指针,时间间隔,是否活动*/ void rotateBo*(int bo*155, int bo*255) /*旋转bo*1输出到bo*2*/int move(int dir) /*实现移动,返回成功与否*/ void clear() /*去除掉满行*/ void prscore() /*打印现在的分数*/void spe()/*显示速度的改变*/ 益智游戏 俄罗斯方块3.外部函数功能如

6、下列图判断最后,游戏完毕的操作;用prscore和界面设置完成界面设置void initMap函数和void render绘图函数分数的改变与速度设置;用prscore与spe来完成判断是否能继续下落;用int test函数来完成;方块的旋转和移动下落;用roratemove与drop来实现随机显示方块,并建立下一个;用rand 与void rebuidNe*t 开场界面4.建立整个函数的流程图如下: 时间指针设定 随机出示方块, 并显示下个方块实现方块的旋转,移动判断是否到底NY 加分,速度设置 Y判断是否已满N 打印分数,完毕处理 游戏完毕流程简介:玩家定义游戏开场,游戏显示开场界面,时针

7、已经设定好,然后随机出示方块,玩家进展方块的旋转,左右移动,和下落控制,然后在旁边的表格中出示另一个表格显示下一个即将下落的方块,然后判断是否到达底部,假设到,继续出示方块,假设没,则可继续变换,下落到低端后在进展判断,是否可以消除该行,再进展分数的变换,速度的调整,然后判断是否已经满,假设未满,则继续出示下一个方块,假设满,则完毕游戏,打印分数,出示完毕界面,游戏终止。三、详细设计格式同标题二1.设置七种方块:这个用int bo*MA*_C55 = /*MA*_C(7)种预定义的盒子*/ 来实现;即七个5*5的盒子数组,方块实体用1表示,0表示空;七种如下所示,细心就会发现 0,0,0,0,

8、0, 0,0,0,0,0, 1,1,1,1,0, 0,0,0,0,0, 0,0,0,0,0 , 0,0,0,0,0, 0,0,1,0,0, 0,1,1,1,0, 0,0,0,0,0, 0,0,0,0,0 , 0,0,0,0,0, 0,1,1,0,0, 0,0,1,1,0, 0,0,0,0,0, 0,0,0,0,0 , 0,0,0,0,0, 0,0,1,1,0, 0,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0 , 0,0,0,0,0, 0,1,1,0,0, 0,0,1,0,0, 0,0,1,0,0, 0,0,0,0,0 , 0,0,0,0,0, 0,0,1,1,0, 0,0,1,

9、0,0, 0,0,1,0,0, 0,0,0,0,0 , 0,0,0,0,0, 0,0,1,1,0, 0,0,1,1,0, 0,0,0,0,0, 0,0,0,0,0 ; 这样七种盒子的方块就被清楚的展现在你们面前。用来保证方块不会出来我们要进展按键的设置#define KEY_UP w /*定义上下左右按按键*/ #define KEY_DOWN s #define KEY_LEFT a #define KEY_RIGHT d #define KEY_ESC 27 /*退出*/时钟的控制 ,用来控制方块的下落间隔时间及速度/*时钟构造控制*/ typedef struct /*时钟构造*/ BO

10、OL enabled; /*时钟是否开启*/ unsigned int intervel; /*定时间隔*/ unsigned int lasttime; /*这个属于部使用变量*/ Timer; int GetTickCount() /*读取BIOS时钟*/ int ret; ret = peek(0*0,0*46e); /*实际上读取了存0:046e处的容*/ ret enabled = en; /*设置一个时钟罗*/ t - intervel = intv; t - lasttime = GetTickCount(); /*lasttime记录的是上一个*/ /*tickcount返回的

11、东西*/ /*这样当再一次测试时间时新的tickcount产生了 它来减去上一次的tickcount就得出了一个时间 间隔,这个就可以和intervel比拟从而得出是否 激活了 */ return 0; 实现了以上的操作后,接下来要实现界面的设置一方便盒子在界面上的显示和操作;5.void initMap(void) /*初始化地图*/ /*我们须要一圈卫兵呵呵,全是1.用来保证方块不会出来*/ int *, y; for(y = 0; y MA*_Y; y+) for(* = 0; * MA*_*; *+) if(* MA*_* - 3 | y MA*_Y - 3) mapy* = 1; e

12、lse mapy* = 0; /*这里初始化出这个形状*/ /*当然是无盖的.*/ void render(void) /*这里唯一的绘图函数*/ int *, y; static int cPage = 0; /*当前页,换页用*/ #define START* 50 /*定义几个常量*/ #define STARTY 0 /*数值根据自己的需要可以自己设置*/ #define LEN 18 setactivepage(cPage=(cPage = 01:0); /*选择页*/ cleardevice(); /*清屏*/ setcolor(12);/*前景颜色*/ prscore(); se

13、tcolor(15); rectangle( START* + LEN * 2 - 2, STARTY + LEN * 3 - 2, START* + LEN * (MA*_* - 2) + 2, STARTY + LEN * (MA*_Y - 2) + 2); /*用白色画一个外框*/ setfillstyle(SOLID_FILL, 5); for(y = 3; y MA*_Y - 2; y+) /*画地图 */ for(* = 2; * MA*_* - 2; *+) if(mapy*) rectangle( * * LEN + START*, y * LEN + STARTY, * *

14、LEN + START* + LEN, y * LEN + STARTY + LEN); bar( * * LEN + START* + 1, y * LEN + STARTY + 1, * * LEN + START* + LEN - 2, y * LEN + STARTY + LEN - 2); /*绘图操作就不要作太复杂的介绍了,这只写作用*/ /*以上段,根据地图上的点阵情况将地图反映到屏幕上*/ for(y = 0; y 5; y+) /*画下落物*/ for(* = 0; * 2) rectangle( (* + cur*) * LEN + START*, (y + cury) *

15、 LEN + STARTY, (* + cur*) * LEN + START* + LEN, (y + cury) * LEN + STARTY + LEN); bar( (* + cur*) * LEN + START* +1, (y + cury) * LEN + STARTY + 1, (* + cur*) * LEN + START* + LEN - 2, (y + cury) * LEN + STARTY + LEN - 2); /*以上将下落的盒子按昭它在地图上的坐标,画到对应的区域里*/ for(y = 0; y 5; y+) /*画下一个*/ for(* = 0; * 5;

16、*+) if(ne*tbo*y*) rectangle( * * LEN + 320, y * LEN + 10, * * LEN + 338, y * LEN + 28); bar( * * LEN + 321, y * LEN + 11, * * LEN + 336, y * LEN + 26); /*这个画出下一个盒子的预览*/ setvisualpage(cPage); /*确认在cPage页里画好了*/ /*将它显示出来*/ 这样我们的初始化界面和盒子在图上的意义显示已经完成;接下里我们要对即将出现的方块的形状进展预览即建立一个新的函数用来显示下一个下落的盒子; void rebui

17、dNe*t() /*新建下一个形状并放到ne*tbo*中*/ int i, *, y; i = random(MA*_C); /*从几种方块里面选一种*/ for(y = 0; y 5; y+) /*并复制过来*/ for(* = 0; * 5; *+) ne*tbo*y* = bo*iy*; /*复制*/ void putBo*() /*将curbo*填充到地图上*/ int *, y; for(y = 0; y 5; y+) /*这个也简单,主要是要根*/ for(* = 0; * 5; *+) /*据cur*,cury指出位置 */ if(curbo*y*) mapy + cury* +

18、 cur* = curbo*y*; int newfall() /*创立下落元素失败返回0*/ int *, y; cur* = MA*_* / 2 - 2; /*重新指定小盒位置*/ cury = 0; for(y = 0; y 5; y+) for(* = 0; * 5; *+) curbo*y* = ne*tbo*y*;/*将ne*tBo*复制过来*/ rebuidNe*t(); /*重建ne*tBo*/ return test(cur*, cury, curbo*); 这样一来,我们的预览盒子也就完成了。完成以后,我们要进展下落的控制,这个在开场的控制指针已经做好的下落间隔设置,然后开

19、场随机出示方块,玩家应开场进展旋转,移动的操作,下落的过程;void rotateBo*(int bo*155, int bo*255) /*旋转bo*1输出到bo*2*/ int *, y; for(* = 0; * = 0; y-) /*编写一下才能印像深刻*/ bo*2y* = bo*1*4 - y; int rotate() /*整个旋转的操作并将盒子打印到屏幕上*/ int *, y; int newbo*55; /*我们必须将当前盒子转动到新的盒子*/ /*再对这个新的盒子的冲突作测试*/ rotateBo*(curbo*, newbo*); /*转动到新的盒子*/ if(test

20、(cur*, cury, newbo*) /*并且新的盒子能放到地图上而不冲突*/ for(y = 0; y 5; y+) for(* = 0; * 5; *+) curbo*y* = newbo*y*; /*复制进来*/ return 1; else return 0; int move(int dir) /*返回成功与否*/ int new*; if(dir) new* = cur* + 1; /*与drop一样,准备移动后的坐标*/ else new* = cur* - 1; if(test(new*, cury, curbo*) /*测试是否冲突*/ cur* = new*; /*可以

21、的话切换cur*/ return 1; return 0; 这个就完成了左右移动的操作;int drop() /*下落,返回成功与否*/ int newy; /*盒子要下落的新位置*/ newy = cury + 1; /*为当前Y位置+1*/ if(test(cur*, newy, curbo*) cury = newy; /*测试下落盒在这个位置*/ return 1; /*上是否有冲突,没有的话*/ /*直接设置cury*/ return 0; int test(int m*, int my, int bo*55) /*测试bo*在map里m*,my位置上是否能着陆*/ /*这个是最关键

22、的一个函数,它判断是否产生非空冲突*/ /*但算法还是很简单的*/ int *, y; for(y = 0; y 5; y+) for(* = 0; * 5; *+) if(mapy + my* + m* & bo*y*) return 0; return 1; 这样就完成了旋转,移动,测试并下落的功能。6.接下来我们要完成下落后的分数的改变速度的重新设定; void clear() /*去除掉满行*/ /*具体的算法为: 从第0行开场到最后一行,测试地图点阵是否为满,如果是的话 从当前行算起,之上的地图向下掉一行*/ int *, y; int d*, dy; int fullflag; f

23、or(y = 0; y MA*_Y - 2; y+) /*最后两行保存行*/ fullflag = 1; /*假设为满*/ for(* = 2; * 0; dy-) for(d* = 2; d* MA*_* - 2; d*+) mapdyd* = mapdy - 1d*; for(d* = 2; d* MA*_* - 2; d*+) map0d* = 0; score+=10;/*输出新得分*/ /*并去除掉第一行*/ void prscore()/*输出分数*/ char str10;setfillstyle(SOLID_FILL,YELLOW); rectangle(90,15,260,3

24、5);setcolor(6); sette*tstyle(0,0,2);sprintf(str,score:%d,score); outte*t*y(115,20,str); void spe()/*显示速度的改变*/ if(score%50=0&score!=0) setTimer(&tDown, speed-, 1);7.然后在主函数之前中定义以下的操作,这个应该会很容易理解 int mapMA*_Y+4MA*_*+4; /*地图大盒子.MA*_*,Y是可见面积*/ /*我已说过需要在外面布两圈卫兵*/ int curbo*55; /*当前下落的盒子*/ int cur*, cury; /

25、*保存着当前活动盒子在地图上的位置*/ int ne*tbo*55; /*保存着下一个形状的盒子*/ 接下俩用newgame函数将其串联起来,实现函数的嵌; void newGame() /*新建游戏*/ int *, y; initMap(); /*初始化地图*/ srand(GetTickCount(); /*初始化随机发生器*/ rebuidNe*t(); /*建立下一个*/ setTimer(&tDown, speed, 1); /*启动时钟(快慢两个)*/ setTimer(&tFast, FAST_INTV, 1); newfall(); /*对下落的盒子操作一下*/ /*这样第一

26、个下落的方块 就在地图顶部准备好了*/ 接下来最为重要的主函数将要开场;int main() char key; /*记录当前按键*/ int i; int gd = VGA, gm = VGAMED; /*初始化的图形模式*/ Timer *ptDown; /*下落所指向的时钟(有快慢)*/ Timer trender; /*为了防止渲染给程序造成过大的负担*/ /*用一个时钟来控制渲染速度*/ /*把它设置interval = 1,*/ /*这样就是18 FPS了,当然无法到达标*/ /*准的60 FPS.毕竟这是DOS.*/ setTimer(&trender, 1, 1); initg

27、raph(&gd, &gm, ); /*初始化图形*/ newGame(); /*新游戏.*/ prscore();while(1) /*主游戏循环*/ if(kbhit() /*如果键盘有按下*/ key = getch(); /*读取一个按键值到key*/ else key = 0; switch(key) /*对读到的key进展判断*/ case KEY_UP: rotate(); /*上,旋转下落盒子*/ break; case KEY_DOWN: ptDown = &tFast; /*使用tFast时钟 */ break; case KEY_LEFT: move(0); /*左移*/

28、 break; case KEY_RIGHT: move(1); /*右移*/ break; case KEY_ESC: closegraph(); /*完毕游戏*/ e*it(0); default: ptDown = &tDown; /*使用原来速度 */ if(testTimer(ptDown) /*在上面已设置了下落要 使用的时钟在ptDown里*/ if(!drop() /*下落,失败返回0*/ putBo*(); /*写到地图里*/ clear();prscore();spe();setcolor(6) ;/*去除满行*/ if(!newfall() /*新建下落,失败则游戏完毕*

29、/ setcolor(14); sette*tstyle(0,0,2); outte*t*y(100,200,GAME OVER);/*游戏完毕,在屏幕上打印字符串*/ outte*t*y(100,240,THANK YOU); sleep(3); e*it(0); if(testTimer(&trender) /*最后.渲染.*/ render(); 最后main函数已经介绍完毕,只需在开场加上程序所需的头文件和值的宏定义后整个程序就全部完毕#include #include #include /*这里须要读取系统运行时间来作为定时器*/ #include /*很不幸,TC2的简单图形,让我放弃了用*/ #include /*win32+openGL来讲解.*/ #define MA*_* 14 /*可见最大*/ #define MA*_Y 21 /*可见最大Y*/ /*我们定义了最大的可见*和Y,则即还有不可见的局部,事实上地图(大盒子)里的左右两侧和底部各两行都被1填充,这样大大简化 出界的判断,事实上,在本例中没有这样的代码,因为旁边有一圈1阻止小盒子越出大盒子的按制围 */#define MA*_C 7 /*最大种类,这个无须解释*/ #define FALSE

温馨提示

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

评论

0/150

提交评论