俄罗斯方块C语言程序的设计报告文档格式.docx
《俄罗斯方块C语言程序的设计报告文档格式.docx》由会员分享,可在线阅读,更多相关《俄罗斯方块C语言程序的设计报告文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
在游戏过程中,游戏界面右侧会有预览区。
由于在此游戏中存在多种不同的游戏方块,所以在游戏方块预览区域中显示随机生成的游戏方块有利于游戏玩家控制游戏的策略。
(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);
//打印选择菜单
**********下一个方块:
"
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+13);
**********"
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+17);
↑键:
变体"
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+19);
空格:
暂停游戏"
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+15);
Esc:
退出游戏"
gotoxy(hOut,FrameX,FrameY);
//打印框角并记住该处已有图案
╔"
gotoxy(hOut,FrameX+2*Frame_width-2,FrameY);
╗"
gotoxy(hOut,FrameX,FrameY+Frame_height);
╚"
gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+Frame_height);
╝"
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);
═"
//打印上横框
}
gotoxy(hOut,FrameX+i,FrameY+Frame_height);
//打印下横框
a[FrameX+i][FrameY+Frame_height]=2;
//记住下横框有图案
for(i=1;
Frame_height;
i++)
gotoxy(hOut,FrameX,FrameY+i);
║"
//打印左竖框
a[FrameX][FrameY+i]=2;
//记住左竖框有图案
gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+i);
//打印右竖框
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:
//田字方块
{
y-1]=b[1];
x+2][tetris->
y-1]=b[2];
y]=b[3];
break;
case2:
//直线方块:
----
x-2][tetris->
y]=b[1];
y]=b[2];
x+4][tetris->
case3:
|
y-2]=b[2];
y+1]=b[3];
case4:
//T字方块
case5:
//T字顺时针转90度方块
y+1]=b[2];
case6:
//T字顺时针转180度方块
case7:
//T字顺时针转270度方块
case8:
//Z字方块
y+1]=b[1];
case9:
//Z字顺时针转90度方块
case10:
//Z字顺时针转180度方块
case11:
//Z字顺时针转270度方块
case12:
//7字方块
y-1]=b[3];
case13:
//7字顺时针转90度方块
case14:
//7字顺时针转180度方块
case15:
//7字顺时针转270度方块
case16:
//倒7字方块
case17:
//倒7字顺指针转90度方块
case18:
//倒7字顺时针转180度方块
case19:
//倒7字顺时针转270度方块
}
5)、判断是否可动
intif_moveable(structTetris*tetris)
if(a[tetris->
y]!
=0)//当中心方块位置上有图案时,返回值为0,即不可移动
return0;
else
if(//当为田字方块且除中心方块位置外,其他"
口"
字方块位置上无图案时,返回值为1,即可移动
(tetris->
flag==1&
&
(a[tetris->
y-1]==0&
y]==0))||
//或为直线方块且除中心方块位置外,其他"
flag==2&
y]==0&
flag==3&
y-2]==0&
y+1]==0))||
flag==4&
flag==5&
y+1]==0&
flag==6&
flag==7&
flag==8&
flag==9&
flag==10&
flag==11&
flag==12&
y-1]==0))||
flag==13&
flag==14&
flag==15&
flag==16&
flag==17&
flag==18&
flag==19&
y]==0)))
return1;
6)、随机产生俄罗斯方块类型的序号
voidget_flag(structTetris*tetris)
tetris->
count++;
//记住产生方块的个数
srand((unsigned)time(NULL));
//初始化随机数
if(tetris->
count==1)
flag=rand()%19+1;
//记住第一个方块的序号
next=rand()%19+1;
//记住下一个方块的序号
7)、打印俄罗斯方块
voidprint_tetris(HANDLEhOut,structTetris*tetris)
for(i=0;
4;
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<
y+1;
j++)
if(a[i][j]==1&
j>
FrameY)
gotoxy(hOut,i,j);
□"
//打印边框内的方块
//打印菜单信息
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+1);
level:
%d"
tetris->
level);
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+3);
score:
score);
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+5);
speed:
%dms"
speed);
8)、清除俄罗斯方块的痕迹
voidclear_tetris(HANDLEhOut,structTetris*tetris)
b[i]=0;
//数组b[4]的每个元素的值都为0
=tetris-