版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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->fla
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 儿童康复治疗各个阶段
- 2024带小孩保姆的合同范本
- 2023年单、双长链烷基甲基叔胺项目评价分析报告
- 2024年聚苯硫醚(PPS)及合金项目评价分析报告
- 2024至2030年中国钓鱼长裤数据监测研究报告
- 2024年结构化布线系统的检测设备项目评价分析报告
- 2024至2030年中国磷化铝熏蒸杀虫剂数据监测研究报告
- 2024至2030年中国灯具制品行业投资前景及策略咨询研究报告
- 2024至2030年中国气动拉铆栓数据监测研究报告
- 2024至2030年中国手持式温度检测仪数据监测研究报告
- 幼儿园小朋友认识医生和护士(课堂PPT)
- 汽车总线测试方案概要
- 商铺装修工程施工方案.
- 形式发票样本(Proforma Invoice)
- 草坪铺设施工方案
- 临床路径实施情况、存在问题及整改措施
- (完整word版)上海博物馆文物术语中英文对照
- 学、练、评一体化课堂模式下赛的两个问题与对策
- 陕西省尾矿资源综合利用
- 扣件式钢管脚手架施工方案(课程设计,含计算书)
- 常见药品配伍表
评论
0/150
提交评论