俄罗斯方块C语言程序设计报告.docx
- 文档编号:27004585
- 上传时间:2023-06-25
- 格式:DOCX
- 页数:28
- 大小:134.71KB
俄罗斯方块C语言程序设计报告.docx
《俄罗斯方块C语言程序设计报告.docx》由会员分享,可在线阅读,更多相关《俄罗斯方块C语言程序设计报告.docx(28页珍藏版)》请在冰豆网上搜索。
俄罗斯方块C语言程序设计报告
C语言课程设计报告
俄罗斯方块程序设计报告
一、问题描述
俄罗斯方块(Tetris,俄文:
Тетрис)是一款电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克谢·帕基特诺夫发明,故得此名。
俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。
在本次设计中,要求支持键盘操作和若干种不同类型方块的旋转变换,并且界面上显示下一个方块的提示以及当前的玩家的得分,随着游戏的进行,等级越高,游戏难度越大,即方块的下落速度越快,相应的等级,等级越高,为玩家提供了不同的选择。
二、功能分析
、俄罗斯方块游戏需要解决的问题包括:
、随机产生方块并自动下移
、用Esc键退出游戏
、用 键变体
、用 键和 键左右移动方块
、用空格键使游戏暂停
、能正确判断满行并消行、计分、定级别
、设定游戏为不同级别,级别越高难度越大
、俄罗斯方块游戏需要设计的功能函数包括:
、声明俄罗斯方块的结构体
、函数原型声明
、制作游戏窗口
、制作俄罗斯方块
、判断是否可动
、随机产生俄罗斯方块类型的序号
、打印俄罗斯方块
、清除俄罗斯方块的痕迹
、判断是否满行并删除满行的俄罗斯方块
三、程序设计
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 { gotoxy(hOut,FrameX,FrameY+i); printf("║");//打印左竖框 a[FrameX][FrameY+i]=2;//记住左竖框有图案 } for(i=1;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++)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 俄罗斯方块 语言程序设计 报告