俄罗斯方块C语言程序的设计报告样本_第1页
俄罗斯方块C语言程序的设计报告样本_第2页
俄罗斯方块C语言程序的设计报告样本_第3页
俄罗斯方块C语言程序的设计报告样本_第4页
俄罗斯方块C语言程序的设计报告样本_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

C语言课程设计报告俄罗斯方块程序设计报告问题描述俄罗斯方块(Tetris,俄文:Тетрис)是一款电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克谢·帕基特诺夫创造,故得此名。俄罗斯方块基本规则是移动、旋转和摆放游戏自动输出各种方块,使之排列成完整一行或多行并且消除得分。在本次设计中,规定支持键盘操作和若干种不同类型方块旋转变换,并且界面上显示下一种方块提示以及当前玩家得分,随着游戏进行,级别越高,游戏难度越大,即方块下落速度越快,相应级别,级别越高,为玩家提供了不同选取。二、功能分析=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;i<Frame_height;i++){gotoxy(hOut,FrameX,FrameY+i);printf("║");//打印左竖框a[FrameX][FrameY+i]=2;//记住左竖框有图案}for(i=1;i<Frame_height;i++){gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+i);printf("║");//打印右竖框a[FrameX+2*Frame_width-2][FrameY+i]=2;//记住右竖框有图案}}4)、制作俄罗斯方块voidmake_tetris(structTetris*tetris){a[tetris->x][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;i<FrameX+2*Frame_width-2;i+=2){if(a[i][j]==1)//竖坐标依次从下往上,横坐标依次由左至右判断与否满行{k++;//记录此行方块个数if(k==Frame_width-2){for(k=FrameX+2;k<FrameX+2*Frame_width-2;k+=2){//删除满行方块a[k][j]=0;gotoxy(hOut,k,j);printf("");Sleep(1);}for(k=j-1;k>FrameY;k--){//如果删除行以上位置有方块,则先清除,再将方块下移一种位置for(i=FrameX+2;i<FrameX+2*Frame_width-2;i+=2){if(a[i][k]==1){a[i][k]=0;gotoxy(hOut,i,k);printf("");a[i][k+1]=1;gotoxy(hOut,i,k+1);printf("□");}}}j++;//方块下移后,重新判断删除行与否满行del_count++;//记录删除方块行数}}}}tetris->score+=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->f

温馨提示

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

评论

0/150

提交评论