首页 俄罗斯方块C语言程序设计报告

俄罗斯方块C语言程序设计报告

举报
开通vip

俄罗斯方块C语言程序设计报告----word.zl-C语言课程设计报告俄罗斯方块程序设计报告问题描述俄罗斯方块〔Tetris,俄文:Тетрис〕是一款电视游戏机和掌上游戏机游戏,它由俄罗斯人HYPERLINK"baike.baidu./view/2154504.htm"\t"_blank"阿列克·帕基特诺夫创造,故得此名。俄罗斯方块的根本规那么是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。在本次设计中,要求支持键盘操作和假设干种不同类型方块的旋转变换,并且界面上显示下一个方块的提示以及当前的玩家的得...

俄罗斯方块C语言程序设计报告
----word.zl-C语言课程设计报告俄罗斯方块程序设计报告问题描述俄罗斯方块〔Tetris,俄文:Тетрис〕是一款电视游戏机和掌上游戏机游戏,它由俄罗斯人HYPERLINK"baike.baidu./view/2154504.htm"\t"_blank"阿列克·帕基特诺夫创造,故得此名。俄罗斯方块的根本规那么是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。在本次设计中,要求支持键盘操作和假设干种不同类型方块的旋转变换,并且界面上显示下一个方块的提示以及当前的玩家的得分,随着游戏的进展,等级越高,游戏难度越大,即方块的下落速度越快,相应的等级,等级越高,为玩家提供了不同的选择。二、功能分析=1\*ROMANI、俄罗斯方块游戏需要解决的问题包括:=1\*GB2⑴、随机产生方块并自动下移=2\*GB2⑵、用Esc键退出游戏=3\*GB2⑶、用 键变体=4\*GB2⑷、用  键和 键左右移动方块=5\*GB2⑸、用空格键使游戏暂停=6\*GB2⑹、能正确判断满行并消行、计分、定级别=7\*GB2⑺、设定游戏为不同级别,级别越高难度越大=2\*ROMANII、俄罗斯方块游戏需要设计的功能函数包括:=1\*GB2⑴、声明俄罗斯方块的构造体=2\*GB2⑵、函数原型声明=3\*GB2⑶、制作游戏窗口=4\*GB2⑷、制作俄罗斯方块=5\*GB2⑸、判断是否可动=6\*GB2⑹、随机产生俄罗斯方块类型的序号=7\*GB2⑺、打印俄罗斯方块=8\*GB2⑻、去除俄罗斯方块的痕迹=9\*GB2⑼、判断是否满行并删除满行的俄罗斯方块三、程序设计1、程序总体构造设计〔1〕、游戏方块预览功能。在游戏过程中,游戏界面右侧会有预览区。由于在此游戏中存在多种不同的游戏方块,所以在游戏方块预览区域中显示随机生成的游戏方块有利于游戏玩家控制游戏的策略。〔2〕、游戏方块控制功能。通过各种条件的判断,实现对游戏方块的左移、右移、自由下落、旋转功能,以及行满消除行的功能。〔3〕、游戏数据显示功能。在游戏玩家进展游戏过程中,需要按照一定的游戏规那么给玩家计算游戏分数。例如,消除一行加100分,游戏分数到达一定数量之后,需要给游戏者进展等级的上升,每上升一个等级,游戏方块的下落速度将加快,游戏的难度将增加。以上游戏数据均会在游戏界面右侧显示以提示玩家。〔4〕、游戏信息提示功能。玩家进入游戏后,将有对本游戏如何操作的友情提示。〔5〕、游戏完毕退出功能。判断游戏完毕条件,通过Esc键进展退出。翻开程序,运行,进入界面开场游戏游戏数据显示功能游戏信息提示功能游戏完毕退出功能游戏方块预览功能游戏方块控制功能否游戏是否完毕是关闭游戏界面返回程序游戏执行主 流程 快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计 图2、界面设计分为左右两个局部:*左边为游戏面板*右边有三局部:游戏数据提示框、下一个方块提示框和功能提示框3、重要功能函数设计1〕、声明俄罗斯方块的构造体structTetris{intx;//中心方块的x轴坐标inty;//中心方块的y轴坐标intflag;//标记方块类型的序号intnext;//下一个俄罗斯方块类型的序号intspeed;//俄罗斯方块移动的速度intcount;//产生俄罗斯方块的个数intscore;//游戏的分数intlevel;//游戏的等级};2〕、函数原型声明//光标移到指定位置voidgotoxy(HANDLEhOut,intx,inty);//制作游戏窗口voidmake_frame();//随机产生方块类型的序号voidget_flag(structTetris*);//制作俄罗斯方块voidmake_tetris(structTetris*);//打印俄罗斯方块voidprint_tetris(HANDLEhOut,structTetris*);//去除俄罗斯方块的痕迹voidclear_tetris(HANDLEhOut,structTetris*);//判断是否能移动,返回值为1,能移动,否那么,不动intif_moveable(structTetris*);//判断是否满行,并删除满行的俄罗斯方块voiddel_full(HANDLEhOut,structTetris*);//开场游戏voidstart_game();3〕、制作游戏窗口voidmake_frame(){HANDLEhOut=GetStdHandle(STD_OUTPUT_HANDLE);//定义显示器句柄变量gotoxy(hOut,FrameX+Frame_width-5,FrameY-2);//打印游戏名称printf("俄罗斯方块");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+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(hOut,FrameX+2*Frame_width-2,FrameY+Frame_height);printf("╝");a[FrameX][FrameY+Frame_height]=2;a[FrameX+2*Frame_width-2][FrameY+Frame_height]=2;for(i=2;i<2*Frame_width-2;i+=2){gotoxy(hOut,FrameX+i,FrameY);printf("═");//打印上横框}for(i=2;i<2*Frame_width-2;i+=2){gotoxy(hOut,FrameX+i,FrameY+Frame_height);printf("═");//打印下横框a[FrameX+i][FrameY+Frame_height]=2;//记住下横框有图案}for(i=1;ix][tetris->y]=b[0];//中心方块位置的图形状态:1-有,0-无switch(tetris->flag)//共6大类,19种类型{case1://田字方块{a[tetris->x][tetris->y-1]=b[1];a[tetris->x+2][tetris->y-1]=b[2];a[tetris->x+2][tetris->y]=b[3];break;}case2://直线方块:----{a[tetris->x-2][tetris->y]=b[1];a[tetris->x+2][tetris->y]=b[2];a[tetris->x+4][tetris->y]=b[3];break;}case3://直线方块:|{a[tetris->x][tetris->y-1]=b[1];a[tetris->x][tetris->y-2]=b[2];a[tetris->x][tetris->y+1]=b[3];break;}case4://T字方块{a[tetris->x-2][tetris->y]=b[1];a[tetris->x+2][tetris->y]=b[2];a[tetris->x][tetris->y+1]=b[3];break;}case5://T字顺时针转90度方块{a[tetris->x][tetris->y-1]=b[1];a[tetris->x][tetris->y+1]=b[2];a[tetris->x-2][tetris->y]=b[3];break;}case6://T字顺时针转180度方块{a[tetris->x][tetris->y-1]=b[1];a[tetris->x-2][tetris->y]=b[2];a[tetris->x+2][tetris->y]=b[3];break;}case7://T字顺时针转270度方块{a[tetris->x][tetris->y-1]=b[1];a[tetris->x][tetris->y+1]=b[2];a[tetris->x+2][tetris->y]=b[3];break;}case8://Z字方块{a[tetris->x][tetris->y+1]=b[1];a[tetris->x-2][tetris->y]=b[2];a[tetris->x+2][tetris->y+1]=b[3];break;}case9://Z字顺时针转90度方块{a[tetris->x][tetris->y-1]=b[1];a[tetris->x-2][tetris->y]=b[2];a[tetris->x-2][tetris->y+1]=b[3];break;}case10://Z字顺时针转180度方块{a[tetris->x][tetris->y-1]=b[1];a[tetris->x-2][tetris->y-1]=b[2];a[tetris->x+2][tetris->y]=b[3];break;}case11://Z字顺时针转270度方块{a[tetris->x][tetris->y+1]=b[1];a[tetris->x+2][tetris->y-1]=b[2];a[tetris->x+2][tetris->y]=b[3];break;}case12://7字方块{a[tetris->x][tetris->y-1]=b[1];a[tetris->x][tetris->y+1]=b[2];a[tetris->x-2][tetris->y-1]=b[3];break;}case13://7字顺时针转90度方块{a[tetris->x-2][tetris->y]=b[1];a[tetris->x-2][tetris->y+1]=b[2];a[tetris->x+2][tetris->y]=b[3];break;}case14://7字顺时针转180度方块{a[tetris->x][tetris->y-1]=b[1];a[tetris->x][tetris->y+1]=b[2];a[tetris->x+2][tetris->y+1]=b[3];break;}case15://7字顺时针转270度方块{a[tetris->x-2][tetris->y]=b[1];a[tetris->x+2][tetris->y-1]=b[2];a[tetris->x+2][tetris->y]=b[3];break;}case16://倒7字方块{a[tetris->x][tetris->y+1]=b[1];a[tetris->x][tetris->y-1]=b[2];a[tetris->x+2][tetris->y-1]=b[3];break;}case17://倒7字顺指针转90度方块{a[tetris->x-2][tetris->y]=b[1];a[tetris->x-2][tetris->y-1]=b[2];a[tetris->x+2][tetris->y]=b[3];break;}case18://倒7字顺时针转180度方块{a[tetris->x][tetris->y-1]=b[1];a[tetris->x][tetris->y+1]=b[2];a[tetris->x-2][tetris->y+1]=b[3];break;}case19://倒7字顺时针转270度方块{a[tetris->x-2][tetris->y]=b[1];a[tetris->x+2][tetris->y+1]=b[2];a[tetris->x+2][tetris->y]=b[3];break;}}5〕、判断是否可动intif_moveable(structTetris*tetris){if(a[tetris->x][tetris->y]!=0)//当中心方块位置上有图案时,返回值为0,即不可移动{return0;}else{if(//当为田字方块且除中心方块位置外,其他"口"字方块位置上无图案时,返回值为1,即可移动(tetris->flag==1&&(a[tetris->x][tetris->y-1]==0&&a[tetris->x+2][tetris->y-1]==0&&a[tetris->x+2][tetris->y]==0))||//或为直线方块且除中心方块位置外,其他"口"字方块位置上无图案时,返回值为1,即可移动(tetris->flag==2&&(a[tetris->x-2][tetris->y]==0&&a[tetris->x+2][tetris->y]==0&&a[tetris->x+4][tetris->y]==0))||(tetris->flag==3&&(a[tetris->x][tetris->y-1]==0&&a[tetris->x][tetris->y-2]==0&&a[tetris->x][tetris->y+1]==0))||(tetris->flag==4&&(a[tetris->x-2][tetris->y]==0&&a[tetris->x+2][tetris->y]==0&&a[tetris->x][tetris->y+1]==0))||(tetris->flag==5&&(a[tetris->x][tetris->y-1]==0&&a[tetris->x][tetris->y+1]==0&&a[tetris->x-2][tetris->y]==0))||(tetris->flag==6&&(a[tetris->x][tetris->y-1]==0&&a[tetris->x-2][tetris->y]==0&&a[tetris->x+2][tetris->y]==0))||(tetris->flag==7&&(a[tetris->x][tetris->y-1]==0&&a[tetris->x][tetris->y+1]==0&&a[tetris->x+2][tetris->y]==0))||(tetris->flag==8&&(a[tetris->x][tetris->y+1]==0&&a[tetris->x-2][tetris->y]==0&&a[tetris->x+2][tetris->y+1]==0))||(tetris->flag==9&&(a[tetris->x][tetris->y-1]==0&&a[tetris->x-2][tetris->y]==0&&a[tetris->x-2][tetris->y+1]==0))||(tetris->flag==10&&(a[tetris->x][tetris->y-1]==0&&a[tetris->x-2][tetris->y-1]==0&&a[tetris->x+2][tetris->y]==0))||(tetris->flag==11&&(a[tetris->x][tetris->y+1]==0&&a[tetris->x+2][tetris->y-1]==0&&a[tetris->x+2][tetris->y]==0))||(tetris->flag==12&&(a[tetris->x][tetris->y-1]==0&&a[tetris->x][tetris->y+1]==0&&a[tetris->x-2][tetris->y-1]==0))||(tetris->flag==13&&(a[tetris->x-2][tetris->y]==0&&a[tetris->x-2][tetris->y+1]==0&&a[tetris->x+2][tetris->y]==0))||(tetris->flag==14&&(a[tetris->x][tetris->y-1]==0&&a[tetris->x][tetris->y+1]==0&&a[tetris->x+2][tetris->y+1]==0))||(tetris->flag==15&&(a[tetris->x-2][tetris->y]==0&&a[tetris->x+2][tetris->y-1]==0&&a[tetris->x+2][tetris->y]==0))||(tetris->flag==16&&(a[tetris->x][tetris->y+1]==0&&a[tetris->x][tetris->y-1]==0&&a[tetris->x+2][tetris->y-1]==0))||(tetris->flag==17&&(a[tetris->x-2][tetris->y]==0&&a[tetris->x-2][tetris->y-1]==0&&a[tetris->x+2][tetris->y]==0))||(tetris->flag==18&&(a[tetris->x][tetris->y-1]==0&&a[tetris->x][tetris->y+1]==0&&a[tetris->x-2][tetris->y+1]==0))||(tetris->flag==19&&(a[tetris->x-2][tetris->y]==0&&a[tetris->x+2][tetris->y+1]==0&&a[tetris->x+2][tetris->y]==0))){return1;}}return0;}6〕、随机产生俄罗斯方块类型的序号voidget_flag(structTetris*tetris){tetris->count++;//记住产生方块的个数srand((unsigned)time(NULL));//初始化随机数if(tetris->count==1){tetris->flag=rand()%19+1;//记住第一个方块的序号}tetris->next=rand()%19+1;//记住下一个方块的序号}7〕、打印俄罗斯方块voidprint_tetris(HANDLEhOut,structTetris*tetris){for(i=0;i<4;i++){b[i]=1;//数组b[4]的每个元素的值都为1}make_tetris(tetris);//制作俄罗斯方块for(i=tetris->x-2;i<=tetris->x+4;i+=2){for(j=tetris->y-2;j<=tetris->y+1;j++){if(a[i][j]==1&&j>FrameY){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",tetris->speed);}8〕、去除俄罗斯方块的痕迹voidclear_tetris(HANDLEhOut,structTetris*tetris){for(i=0;i<4;i++){b[i]=0;//数组b[4]的每个元素的值都为0}make_tetris(tetris);//制作俄罗斯方块for(i=tetris->x-2;i<=tetris->x+4;i+=2){for(j=tetris->y-2;j<=tetris->y+1;j++){if(a[i][j]==0&&j>FrameY){gotoxy(hOut,i,j);printf("");//去除方块}}}}9〕、判断是否满行并删除满行的俄罗斯方块voiddel_full(HANDLEhOut,structTetris*tetris){//当某行有Frame_width-2个方块时,那么满行intk,del_count=0;//分别用于 记录 混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载 某行方块的个数和删除方块的行数的变量for(j=FrameY+Frame_height-1;j>=FrameY+1;j--){k=0;for(i=FrameX+2;iFrameY;k--){//如果删除行以上的位置有方块,那么先去除,再将方块下移一个位置for(i=FrameX+2;iscore+=100*del_count;//每删除一行,得100分if(del_count>0&&(tetris->score%1000==0||tetris->score/1000>tetris->level-1)){//如果得1000分即累计删除10行,速度加快20ms并升一级tetris->speed-=20;tetris->level++;}}10〕、开场游戏voidstart_game(){HANDLEhOut=GetStdHandle(STD_OUTPUT_HANDLE);//定义显示器句柄变量structTetrist,*tetris=&t;//定义构造体的指针并指向构造体变量unsignedcharch;//定义接收键盘输入的变量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;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;//记住当前俄罗斯方块序号if(kbhit()){//判断是否有键盘输入,有那么用ch↓接收ch=getch();if(ch==75)//按←键那么向左动,中心横坐标减2{tetris->x-=2;}if(ch==77)//按→键那么向右动,中心横坐标加2{tetris->x+=2;}if(ch==72)//按↑键那么变体即当前方块顺时针转90度{if(tetris->flag>=2&&tetris->flag<=3){tetris->flag++;tetris->flag%=2;tetris->flag+=2;}if(tetris->flag>=4&&tetris->flag<=7){tetris->flag++;tetris->flag%=4;tetris->flag+=4;}if(tetris->flag>=8&&tetris->flag<=11){tetris->flag++;tetris->flag%=4;tetris->flag+=8;}if(tetris->flag>=12&&tetris->flag<=15){tetris->flag++;tetris->flag%=4;tetris->flag+=12;}if(tetris->flag>=16&&tetris->flag<=19){tetris->flag++;tetris->flag%=4;tetris->flag+=16;}}if(ch==32)//按空格键,暂停{print_tetris(hOut,tetris);while(1){if(kbhit())//再按空格键,继续游戏{ch=getch();if(ch==32){gotolabel;}}}}if(if_moveable(tetris)==0)//如果不可动,上面操作无效{tetris->x=temp1;tetris->flag=temp2;}else//如果可动,执行操作{gotolabel;}}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=0}}if(j==0){system("cls");getch();break;}//去除下一个俄罗斯方块的图形(右边窗口)tetris->flag=tetris->next;tetris->x=FrameX+2*Frame_width+6;tetris->y=FrameY+10;clear_tetris(hOut,tetris);}}4、函数设计流程进入俄罗斯方块程序、声明俄罗斯方块的构造体structTetris定义全局变量函数原型声明//制作游戏窗口make_frame();//开场游戏start_game();定义主函数voidmain()制作俄罗斯方块判断是否可动开场游戏具体设计运行游戏所需要的各种功能随机产生俄罗斯方块类型的序号打印俄罗斯方块去除俄罗斯方块的痕迹判断是否满行并删除满行的俄罗斯方块
本文档为【俄罗斯方块C语言程序设计报告】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: ¥18.4 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
pyaiw
擅长施工管理及辅助设计,并对施工技术、质量与安全的深入研究
格式:doc
大小:101KB
软件:Word
页数:0
分类:教育学
上传时间:2021-10-11
浏览量:49