《俄罗斯方块C语言程序的设计报告.doc》由会员分享,可在线阅读,更多相关《俄罗斯方块C语言程序的设计报告.doc(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1/18C C 语言课程设计报告语言课程设计报告俄罗斯方块程序设计报告俄罗斯方块程序设计报告一、一、问题描述问题描述俄罗斯方块(Tetris,俄文:)是一款电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克帕基特诺夫发明,故得此名。俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。在本次设计中,要求支持键盘操作和若干种不同类型方块的旋转变换,并且界面上显示下一个方块的提示以与当前的玩家的得分,随着游戏的进行,等级越高,游戏难度越大,即方块的下落速度越快,相应的等级,等级越高,为玩家提供了不同的选择。二、功能分析二、功能分析I、俄罗斯方块游戏需要解
2、决的问题包括:、随机产生方块并自动下移、用 Esc 键退出游戏、用键变体、用键和键左右移动方块、用空格键使游戏暂停2/18、能正确判断满行并消行、计分、定级别、设定游戏为不同级别,级别越高难度越大II、俄罗斯方块游戏需要设计的功能函数包括:、声明俄罗斯方块的结构体、函数原型声明、制作游戏窗口、制作俄罗斯方块、判断是否可动、随机产生俄罗斯方块类型的序号、打印俄罗斯方块、清除俄罗斯方块的痕迹、判断是否满行并删除满行的俄罗斯方块三、程序设计程序设计1 1、程序总体结构设计、程序总体结构设计(1)、游戏方块预览功能。在游戏过程中,游戏界面右侧会有预览区。由于在此游戏中存在多种不同的游戏方块,所以在游戏
3、方块预览区域中显示随机生成的游戏方块有利于游戏玩家控制游戏的策略。(2)、游戏方块控制功能。通过各种条件的判断,实现对游戏方块的左移、右移、自由下落、旋转功能,以与行满消除行的功能。(3)、游戏数据显示功能。在游戏玩家进行游戏过程中,需要按照一定的游戏规则给玩家计算游戏分数。例如,消除一行加 100 分,游戏分数达到一定数量3/18之后,需要给游戏者进行等级的上升,每上升一个等级,游戏方块的下落速度将加快,游戏的难度将增加。以上游戏数据均会在游戏界面右侧显示以提示玩家。(4)、游戏信息提示功能。玩家进入游戏后,将有对本游戏如何操作的友情提示。(5)、游戏结束退出功能。判断游戏结束条件,通过 E
4、sc 键进行退出。否否开始游戏开始游戏游游戏戏方方块块预预览览功功能能游游戏戏方方块块控控制制功功能能游游戏戏数数据据显显示示功功能能游游戏戏信信息息提提示示功功能能游游戏戏结结束束退退出出功功能能打开程序打开程序,运行运行,进入界面进入界面4/18是是游戏执行主流程图游戏执行主流程图2 2、界面设计、界面设计分为左右两个部分:*左边为游戏面板*右边有三部分:游戏数据提示框、下一个方块提示框和功能提示框游戏是否结束游戏是否结束关闭游戏界面返回程序关闭游戏界面返回程序5/183 3、重要功能函数设计、重要功能函数设计1 1)、声明俄罗斯方块的结构体、声明俄罗斯方块的结构体struct Tetri
5、sint x;/中心方块的 x 轴坐标int y;/中心方块的 y 轴坐标int flag;/标记方块类型的序号int next;/下一个俄罗斯方块类型的序号int speed;/俄罗斯方块移动的速度int count;/产生俄罗斯方块的个数int score;/游戏的分数int level;/游戏的等级;2 2)、函数原型声明、函数原型声明/光标移到指定位置void gotoxy(HANDLE hOut,int x,int y);/制作游戏窗口void make_frame();/随机产生方块类型的序号void get_flag(struct Tetris*);/制作俄罗斯方块void ma
6、ke_tetris(struct Tetris*);/打印俄罗斯方块void print_tetris(HANDLE hOut,struct Tetris*);/清除俄罗斯方块的痕迹void clear_tetris(HANDLE hOut,struct Tetris*);/判断是否能移动,返回值为 1,能移动,否则,不动int if_moveable(struct Tetris*);/判断是否满行,并删除满行的俄罗斯方块void del_full(HANDLE hOut,struct Tetris*);/开始游戏void start_game();3 3)、制作游戏窗口、制作游戏窗口void
7、 make_frame()HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);/定义显示器句柄变量gotoxy(hOut,FrameX+Frame_width-5,FrameY-2);/打印游戏名称6/18printf(俄罗斯方块);gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+7);/打印选择菜单printf(*下一个方块:);gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+13);printf(*);gotoxy(hOut,FrameX+2*Frame_width+3,FrameY
8、+17);printf(键:变体);gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+19);printf(空格:暂停游戏);gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+15);printf(Esc:退出游戏);gotoxy(hOut,FrameX,FrameY);/打印框角并记住该处已有图案printf();gotoxy(hOut,FrameX+2*Frame_width-2,FrameY);printf();gotoxy(hOut,FrameX,FrameY+Frame_height);printf();gotoxy
9、(hOut,FrameX+2*Frame_width-2,FrameY+Frame_height);printf();aFrameXFrameY+Frame_height=2;aFrameX+2*Frame_width-2FrameY+Frame_height=2;for(i=2;i2*Frame_width-2;i+=2)gotoxy(hOut,FrameX+i,FrameY);printf();/打印上横框for(i=2;i2*Frame_width-2;i+=2)gotoxy(hOut,FrameX+i,FrameY+Frame_height);printf();/打印下横框aFrame
10、X+iFrameY+Frame_height=2;/记住下横框有图案for(i=1;iFrame_height;i+)gotoxy(hOut,FrameX,FrameY+i);printf();/打印左竖框aFrameXFrameY+i=2;/记住左竖框有图案for(i=1;ixtetris-y=b0;/中心方块位置的图形状态:1-有,0-无switch(tetris-flag)/共 6 大类,19 种类型case 1:/田字方块atetris-xtetris-y-1=b1;atetris-x+2tetris-y-1=b2;atetris-x+2tetris-y=b3;break;case 2
11、:/直线方块:-atetris-x-2tetris-y=b1;atetris-x+2tetris-y=b2;atetris-x+4tetris-y=b3;break;case 3:/直线方块:|atetris-xtetris-y-1=b1;atetris-xtetris-y-2=b2;atetris-xtetris-y+1=b3;break;case 4:/T 字方块atetris-x-2tetris-y=b1;atetris-x+2tetris-y=b2;atetris-xtetris-y+1=b3;break;case 5:/T 字顺时针转 90 度方块atetris-xtetris-y-
12、1=b1;atetris-xtetris-y+1=b2;atetris-x-2tetris-y=b3;break;8/18case 6:/T 字顺时针转 180 度方块atetris-xtetris-y-1=b1;atetris-x-2tetris-y=b2;atetris-x+2tetris-y=b3;break;case 7:/T 字顺时针转 270 度方块atetris-xtetris-y-1=b1;atetris-xtetris-y+1=b2;atetris-x+2tetris-y=b3;break;case 8:/Z 字方块atetris-xtetris-y+1=b1;atetris
13、-x-2tetris-y=b2;atetris-x+2tetris-y+1=b3;break;case 9:/Z 字顺时针转 90 度方块atetris-xtetris-y-1=b1;atetris-x-2tetris-y=b2;atetris-x-2tetris-y+1=b3;break;case 10:/Z 字顺时针转 180 度方块atetris-xtetris-y-1=b1;atetris-x-2tetris-y-1=b2;atetris-x+2tetris-y=b3;break;case 11:/Z 字顺时针转 270 度方块atetris-xtetris-y+1=b1;atetri
14、s-x+2tetris-y-1=b2;atetris-x+2tetris-y=b3;break;case 12:/7 字方块9/18atetris-xtetris-y-1=b1;atetris-xtetris-y+1=b2;atetris-x-2tetris-y-1=b3;break;case 13:/7 字顺时针转 90 度方块atetris-x-2tetris-y=b1;atetris-x-2tetris-y+1=b2;atetris-x+2tetris-y=b3;break;case 14:/7 字顺时针转 180 度方块atetris-xtetris-y-1=b1;atetris-xt
15、etris-y+1=b2;atetris-x+2tetris-y+1=b3;break;case 15:/7 字顺时针转 270 度方块atetris-x-2tetris-y=b1;atetris-x+2tetris-y-1=b2;atetris-x+2tetris-y=b3;break;case 16:/倒 7 字方块atetris-xtetris-y+1=b1;atetris-xtetris-y-1=b2;atetris-x+2tetris-y-1=b3;break;case 17:/倒 7 字顺指针转 90 度方块atetris-x-2tetris-y=b1;atetris-x-2tet
16、ris-y-1=b2;atetris-x+2tetris-y=b3;break;case 18:/倒 7 字顺时针转 180 度方块atetris-xtetris-y-1=b1;atetris-xtetris-y+1=b2;10/18atetris-x-2tetris-y+1=b3;break;case 19:/倒 7 字顺时针转 270 度方块atetris-x-2tetris-y=b1;atetris-x+2tetris-y+1=b2;atetris-x+2tetris-y=b3;break;5 5)、判断是否可动、判断是否可动int if_moveable(struct Tetris*t
17、etris)if(atetris-xtetris-y!=0)/当中心方块位置上有图案时,返回值为 0,即不可移动return 0;elseif(/当为田字方块且除中心方块位置外,其他口字方块位置上无图案时,返回值为 1,即可移动(tetris-flag=1&(atetris-xtetris-y-1=0&atetris-x+2tetris-y-1=0&atetris-x+2tetris-y=0)|/或为直线方块且除中心方块位置外,其他口字方块位置上无图案时,返回值为 1,即可移动(tetris-flag=2&(atetris-x-2tetris-y=0&atetris-x+2tetris-y=0
18、&atetris-x+4tetris-y=0)|(tetris-flag=3&(atetris-xtetris-y-1=0&atetris-xtetris-y-2=0&atetris-xtetris-y+1=0)|(tetris-flag=4&(atetris-x-2tetris-y=0&atetris-x+2tetris-y=0&atetris-xtetris-y+1=0)|(tetris-flag=5&(atetris-xtetris-y-1=0&atetris-xtetris-y+1=0&atetris-x-2tetris-y=0)|(tetris-flag=6&(atetris-xte
19、tris-y-1=0&atetris-x-2tetris-y=0&atetris-x+2tetris-y=0)|(tetris-flag=7&(atetris-xtetris-y-1=0&atetris-xtetris-y+1=0&atetris-x+2tetris-y=0)|(tetris-flag=8&(atetris-xtetris-y+1=0&atetris-x-2tetris-y=0&atetris-x+2tetris-y+1=0)|(tetris-flag=9&(atetris-xtetris-y-1=0&11/18atetris-x-2tetris-y=0&atetris-x-2
20、tetris-y+1=0)|(tetris-flag=10&(atetris-xtetris-y-1=0&atetris-x-2tetris-y-1=0&atetris-x+2tetris-y=0)|(tetris-flag=11&(atetris-xtetris-y+1=0&atetris-x+2tetris-y-1=0&atetris-x+2tetris-y=0)|(tetris-flag=12&(atetris-xtetris-y-1=0&atetris-xtetris-y+1=0&atetris-x-2tetris-y-1=0)|(tetris-flag=13&(atetris-x-2
21、tetris-y=0&atetris-x-2tetris-y+1=0&atetris-x+2tetris-y=0)|(tetris-flag=14&(atetris-xtetris-y-1=0&atetris-xtetris-y+1=0&atetris-x+2tetris-y+1=0)|(tetris-flag=15&(atetris-x-2tetris-y=0&atetris-x+2tetris-y-1=0&atetris-x+2tetris-y=0)|(tetris-flag=16&(atetris-xtetris-y+1=0&atetris-xtetris-y-1=0&atetris-x
22、+2tetris-y-1=0)|(tetris-flag=17&(atetris-x-2tetris-y=0&atetris-x-2tetris-y-1=0&atetris-x+2tetris-y=0)|(tetris-flag=18&(atetris-xtetris-y-1=0&atetris-xtetris-y+1=0&atetris-x-2tetris-y+1=0)|(tetris-flag=19&(atetris-x-2tetris-y=0&atetris-x+2tetris-y+1=0&atetris-x+2tetris-y=0)return 1;return 0;6 6)、随机产生
23、俄罗斯方块类型的序号、随机产生俄罗斯方块类型的序号void get_flag(struct Tetris*tetris)tetris-count+;/记住产生方块的个数srand(unsigned)time(NULL);/初始化随机数if(tetris-count=1)tetris-flag=rand()%19+1;/记住第一个方块的序号tetris-next=rand()%19+1;/记住下一个方块的序号12/187 7)、打印俄罗斯方块、打印俄罗斯方块void print_tetris(HANDLE hOut,struct Tetris*tetris)for(i=0;ix-2;ix+4;i
24、+=2)for(j=tetris-y-2;jy+1;j+)if(aij=1&jFrameY)gotoxy(hOut,i,j);printf();/打印边框的方块/打印菜单信息gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+1);printf(level:%d,tetris-level);gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+3);printf(score:%d,tetris-score);gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+5);printf(speed:%dms,
25、tetris-speed);8 8)、清除俄罗斯方块的痕迹、清除俄罗斯方块的痕迹void clear_tetris(HANDLE hOut,struct Tetris*tetris)for(i=0;ix-2;ix+4;i+=2)for(j=tetris-y-2;jy+1;j+)if(aij=0&jFrameY)13/18gotoxy(hOut,i,j);printf();/清除方块9 9)、判断是否满行并删除满行的俄罗斯方块、判断是否满行并删除满行的俄罗斯方块void del_full(HANDLE hOut,struct Tetris*tetris)/当某行有 Frame_width-2 个
26、方块时,则满行int k,del_count=0;/分别用于记录某行方块的个数和删除方块的行数的变量for(j=FrameY+Frame_height-1;j=FrameY+1;j-)k=0;for(i=FrameX+2;iFrameX+2*Frame_width-2;i+=2)if(aij=1)/竖坐标依次从下往上,横坐标依次由左至右判断是否满行k+;/记录此行方块的个数if(k=Frame_width-2)for(k=FrameX+2;kFrameY;k-)/如果删除行以上的位置有方块,则先清除,再将方块下移一个位置for(i=FrameX+2;iscore+=100*del_count;
27、/每删除一行,得 100 分if(del_count0&(tetris-score%1000=0|tetris-score/1000tetris-level-1)/如果得 1000 分即累计删除 10 行,速度加快 20ms 并升一级tetris-speed-=20;tetris-level+;1010)、开始游戏、开始游戏void start_game()HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);/定义显示器句柄变量struct Tetris t,*tetris=&t;/定义结构体的指针并指向结构体变量unsigned char ch;/定义接收
28、键盘输入的变量tetris-count=0;/初始化俄罗斯方块数为 0 个tetris-speed=300;/初始移动速度为 300mstetris-score=0;/初始游戏的分数为 0 分tetris-level=1;/初始游戏为第 1 关while(1)/循环产生方块,直至游戏结束get_flag(tetris);/得到产生俄罗斯方块类型的序号temp=tetris-flag;/记住当前俄罗斯方块序号/打印下一个俄罗斯方块的图形(右边窗口)tetris-x=FrameX+2*Frame_width+6;tetris-y=FrameY+10;tetris-flag=tetris-next;
29、print_tetris(hOut,tetris);tetris-x=FrameX+Frame_width;/初始中心方块 x 坐标tetris-y=FrameY-1;/初始中心方块 y 坐标tetris-flag=temp;/取出当前的俄罗斯方块序号while(1)/控制方块方向,直至方块不再下移label:print_tetris(hOut,tetris);/打印俄罗斯方块Sleep(tetris-speed);/延缓时间clear_tetris(hOut,tetris);/清除痕迹temp1=tetris-x;/记住中心方块横坐标的值temp2=tetris-flag;/记住当前俄罗斯方
30、块序号15/18if(kbhit()/判断是否有键盘输入,有则用 ch接收ch=getch();if(ch=75)/按键则向左动,中心横坐标减 2tetris-x-=2;if(ch=77)/按键则向右动,中心横坐标加 2tetris-x+=2;if(ch=72)/按键则变体即当前方块顺时针转 90 度if(tetris-flag=2&tetris-flagflag+;tetris-flag%=2;tetris-flag+=2;if(tetris-flag=4&tetris-flagflag+;tetris-flag%=4;tetris-flag+=4;if(tetris-flag=8&tetr
31、is-flagflag+;tetris-flag%=4;tetris-flag+=8;if(tetris-flag=12&tetris-flagflag+;tetris-flag%=4;tetris-flag+=12;if(tetris-flag=16&tetris-flagflag+;tetris-flag%=4;tetris-flag+=16;16/18if(ch=32)/按空格键,暂停print_tetris(hOut,tetris);while(1)if(kbhit()/再按空格键,继续游戏ch=getch();if(ch=32)goto label;if(if_moveable(te
32、tris)=0)/如果不可动,上面操作无效tetris-x=temp1;tetris-flag=temp2;else/如果可动,执行操作goto label;tetris-y+;/如果没有操作指令,方块向下移动if(if_moveable(tetris)=0)/如果向下移动且不可动,方块放在此处tetris-y-;print_tetris(hOut,tetris);del_full(hOut,tetris);break;for(i=tetris-y-2;iy+2;i+)/游戏结束条件:方块触到框顶位置if(i=FrameY)j=0;/如果游戏结束,j=0if(j=0)system(cls);g
33、etch();17/18break;/清除下一个俄罗斯方块的图形(右边窗口)tetris-flag=tetris-next;tetris-x=FrameX+2*Frame_width+6;tetris-y=FrameY+10;clear_tetris(hOut,tetris);4 4、函数设计流程、函数设计流程、进入俄罗斯方块程序定义全局变量定义主函数void main()声明俄罗斯方块的结构体struct Tetris函数原型声明/制作游戏窗口 make_frame();/开始游戏 start_game();制作俄罗斯方块18/18具体设计运行游戏所需要的各种功能判断是否可动随机产生俄罗斯方块类型的序号打印俄罗斯方块清除俄罗斯方块的痕迹判断是否满行并删除满行的俄罗斯方块开始游戏