俄罗斯方块程序设计报告
问题描述
俄罗斯方块(Tetris 俄文:Тетрис)款电视游戏机掌游戏机游戏俄罗斯阿列克谢·帕基特诺夫发明名俄罗斯方块基规移动旋转摆放游戏动输出种方块排列成完整行行消分
次设计中求支持键盘操作干种类型方块旋转变换界面显示方块提示前玩家分着游戏进行等级越高游戏难度越方块落速度越快相应等级等级越高玩家提供选择
二功分析
I俄罗斯方块游戏需解决问题包括:
⑴机产生方块动移
⑵Esc键退出游戏
⑶ 键变体
⑷ 键 键左右移动方块
⑸空格键游戏暂停
⑹正确判断满行消行计分定级
⑺设定游戏级级越高难度越
II俄罗斯方块游戏需设计功函数包括:
⑴声明俄罗斯方块结构体
⑵函数原型声明
⑶制作游戏窗口
⑷制作俄罗斯方块
⑸判断否动
⑹机产生俄罗斯方块类型序号
⑺印俄罗斯方块
⑻清俄罗斯方块痕迹
⑼判断否满行删满行俄罗斯方块
三程序设计
1程序总体结构设计
(1)游戏方块预览功游戏程中游戏界面右侧会预览区游戏中存种游戏方块游戏方块预览区域中显示机生成游戏方块利游戏玩家控制游戏策略
(2)游戏方块控制功通种条件判断实现游戏方块左移右移落旋转功行满消行功
(3)游戏数显示功游戏玩家进行游戏程中需定游戏规玩家计算游戏分数例消行加100分游戏分数达定数量需游戏者进行等级升升等级游戏方块落速度加快游戏难度增加游戏数均会游戏界面右侧显示提示玩家
(4)游戏信息提示功玩家进入游戏游戏操作友情提示
(5)游戏结束退出功判断游戏结束条件通Esc键进行退出
开程序运行进入界面
开始游戏
游戏数显示功
游戏信息提示功
游戏结束退出功
游戏方块预览功
游戏方块控制功
否
游戏否结束
关闭游戏界面返回程序
游戏执行流程图
2界面设计
分左右两部分:
*左边游戏面板
*右边三部分:游戏数提示框方块提示框功提示框
3重功函数设计
1)声明俄罗斯方块结构体
struct Tetris
{
int x 中心方块x轴坐标
int y 中心方块y轴坐标
int flag 标记方块类型序号
int next 俄罗斯方块类型序号
int speed 俄罗斯方块移动速度
int count 产生俄罗斯方块数
int score 游戏分数
int level 游戏等级
}
2)函数原型声明
光标移指定位置
void gotoxy(HANDLE hOut int x int y)
制作游戏窗口
void make_frame()
机产生方块类型序号
void get_flag(struct Tetris *)
制作俄罗斯方块
void make_tetris(struct Tetris *)
印俄罗斯方块
void print_tetris(HANDLE hOutstruct Tetris *)
清俄罗斯方块痕迹
void clear_tetris(HANDLE hOutstruct Tetris *)
判断否移动返回值1移动否动
int if_moveable(struct Tetris *)
判断否满行删满行俄罗斯方块
void del_full(HANDLE hOutstruct Tetris *)
开始游戏
void start_game()
3)制作游戏窗口
void make_frame()
{
HANDLE hOut GetStdHandle(STD_OUTPUT_HANDLE) 定义显示器句柄变量
gotoxy(hOutFrameX+Frame_width5FrameY2) 印游戏名称
printf(俄罗斯方块)
gotoxy(hOutFrameX+2*Frame_width+3FrameY+7) 印选择菜单
printf(**********方块:)
gotoxy(hOutFrameX+2*Frame_width+3FrameY+13)
printf(**********)
gotoxy(hOutFrameX+2*Frame_width+3FrameY+17)
printf(↑键:变体)
gotoxy(hOutFrameX+2*Frame_width+3FrameY+19)
printf(空格:暂停游戏)
gotoxy(hOutFrameX+2*Frame_width+3FrameY+15)
printf(Esc :退出游戏)
gotoxy(hOutFrameXFrameY) 印框角记住该处已图案
printf(╔)
gotoxy(hOutFrameX+2*Frame_width2FrameY)
printf(╗)
gotoxy(hOutFrameXFrameY+Frame_height)
printf(╚)
gotoxy(hOutFrameX+2*Frame_width2FrameY+Frame_height)
printf(╝)
a[FrameX][FrameY+Frame_height]2
a[FrameX+2*Frame_width2][FrameY+Frame_height]2
for(i2i<2*Frame_width2i+2)
{
gotoxy(hOutFrameX+iFrameY)
printf(═) 印横框
}
for(i2i<2*Frame_width2i+2)
{
gotoxy(hOutFrameX+iFrameY+Frame_height)
printf(═) 印横框
a[FrameX+i][FrameY+Frame_height]2 记住横框图案
}
for(i1i
gotoxy(hOutFrameXFrameY+i)
printf(║) 印左竖框
a[FrameX][FrameY+i]2 记住左竖框图案
}
for(i1i
gotoxy(hOutFrameX+2*Frame_width2FrameY+i)
printf(║) 印右竖框
a[FrameX+2*Frame_width2][FrameY+i]2 记住右竖框图案
}
}
4)制作俄罗斯方块
void make_tetris(struct Tetris *tetris)
{
a[tetris>x][tetris>y]b[0] 中心方块位置图形状态10
switch(tetris>flag) 6类19种类型
{
case 1 田字方块
{
a[tetris>x][tetris>y1]b[1]
a[tetris>x+2][tetris>y1]b[2]
a[tetris>x+2][tetris>y]b[3]
break
}
case 2 直线方块
{
a[tetris>x2][tetris>y]b[1]
a[tetris>x+2][tetris>y]b[2]
a[tetris>x+4][tetris>y]b[3]
break
}
case 3 直线方块 |
{
a[tetris>x][tetris>y1]b[1]
a[tetris>x][tetris>y2]b[2]
a[tetris>x][tetris>y+1]b[3]
break
}
case 4 T字方块
{
a[tetris>x2][tetris>y]b[1]
a[tetris>x+2][tetris>y]b[2]
a[tetris>x][tetris>y+1]b[3]
break
}
case 5 T字时针转90度方块
{
a[tetris>x][tetris>y1]b[1]
a[tetris>x][tetris>y+1]b[2]
a[tetris>x2][tetris>y]b[3]
break
}
case 6 T字时针转180度方块
{
a[tetris>x][tetris>y1]b[1]
a[tetris>x2][tetris>y]b[2]
a[tetris>x+2][tetris>y]b[3]
break
}
case 7 T字时针转270度方块
{
a[tetris>x][tetris>y1]b[1]
a[tetris>x][tetris>y+1]b[2]
a[tetris>x+2][tetris>y]b[3]
break
}
case 8 Z字方块
{
a[tetris>x][tetris>y+1]b[1]
a[tetris>x2][tetris>y]b[2]
a[tetris>x+2][tetris>y+1]b[3]
break
}
case 9 Z字时针转90度方块
{
a[tetris>x][tetris>y1]b[1]
a[tetris>x2][tetris>y]b[2]
a[tetris>x2][tetris>y+1]b[3]
break
}
case 10 Z字时针转180度方块
{
a[tetris>x][tetris>y1]b[1]
a[tetris>x2][tetris>y1]b[2]
a[tetris>x+2][tetris>y]b[3]
break
}
case 11 Z字时针转270度方块
{
a[tetris>x][tetris>y+1]b[1]
a[tetris>x+2][tetris>y1]b[2]
a[tetris>x+2][tetris>y]b[3]
break
}
case 12 7字方块
{
a[tetris>x][tetris>y1]b[1]
a[tetris>x][tetris>y+1]b[2]
a[tetris>x2][tetris>y1]b[3]
break
}
case 13 7字时针转90度方块
{
a[tetris>x2][tetris>y]b[1]
a[tetris>x2][tetris>y+1]b[2]
a[tetris>x+2][tetris>y]b[3]
break
}
case 14 7字时针转180度方块
{
a[tetris>x][tetris>y1]b[1]
a[tetris>x][tetris>y+1]b[2]
a[tetris>x+2][tetris>y+1]b[3]
break
}
case 15 7字时针转270度方块
{
a[tetris>x2][tetris>y]b[1]
a[tetris>x+2][tetris>y1]b[2]
a[tetris>x+2][tetris>y]b[3]
break
}
case 16 倒7字方块
{
a[tetris>x][tetris>y+1]b[1]
a[tetris>x][tetris>y1]b[2]
a[tetris>x+2][tetris>y1]b[3]
break
}
case 17 倒7字指针转90度方块
{
a[tetris>x2][tetris>y]b[1]
a[tetris>x2][tetris>y1]b[2]
a[tetris>x+2][tetris>y]b[3]
break
}
case 18 倒7字时针转180度方块
{
a[tetris>x][tetris>y1]b[1]
a[tetris>x][tetris>y+1]b[2]
a[tetris>x2][tetris>y+1]b[3]
break
}
case 19 倒7字时针转270度方块
{
a[tetris>x2][tetris>y]b[1]
a[tetris>x+2][tetris>y+1]b[2]
a[tetris>x+2][tetris>y]b[3]
break
}
}
5)判断否动
int if_moveable(struct Tetris *tetris)
{
if(a[tetris>x][tetris>y]0)中心方块位置图案时返回值0移动
{
return 0
}
else
{
if( 田字方块中心方块位置外口字方块位置图案时返回值1移动
( tetris>flag1 && ( a[tetris>x][tetris>y1]0 &&
a[tetris>x+2][tetris>y1]0 && a[tetris>x+2][tetris>y]0 ) ) ||
直线方块中心方块位置外口字方块位置图案时返回值1移动
( tetris>flag2 && ( a[tetris>x2][tetris>y]0 &&
a[tetris>x+2][tetris>y]0 && a[tetris>x+4][tetris>y]0 ) ) ||
( tetris>flag3 && ( a[tetris>x][tetris>y1]0 &&
a[tetris>x][tetris>y2]0 && a[tetris>x][tetris>y+1]0 ) ) ||
( tetris>flag4 && ( a[tetris>x2][tetris>y]0 &&
a[tetris>x+2][tetris>y]0 && a[tetris>x][tetris>y+1]0 ) ) ||
( tetris>flag5 && ( a[tetris>x][tetris>y1]0 &&
a[tetris>x][tetris>y+1]0 && a[tetris>x2][tetris>y]0 ) ) ||
( tetris>flag6 && ( a[tetris>x][tetris>y1]0 &&
a[tetris>x2][tetris>y]0 && a[tetris>x+2][tetris>y]0 ) ) ||
( tetris>flag7 && ( a[tetris>x][tetris>y1]0 &&
a[tetris>x][tetris>y+1]0 && a[tetris>x+2][tetris>y]0 ) ) ||
( tetris>flag8 && ( a[tetris>x][tetris>y+1]0 &&
a[tetris>x2][tetris>y]0 && a[tetris>x+2][tetris>y+1]0 ) ) ||
( tetris>flag9 && ( a[tetris>x][tetris>y1]0 &&
a[tetris>x2][tetris>y]0 && a[tetris>x2][tetris>y+1]0 ) ) ||
( tetris>flag10 && ( a[tetris>x][tetris>y1]0 &&
a[tetris>x2][tetris>y1]0 && a[tetris>x+2][tetris>y]0 ) ) ||
( tetris>flag11 && ( a[tetris>x][tetris>y+1]0 &&
a[tetris>x+2][tetris>y1]0 && a[tetris>x+2][tetris>y]0 ) ) ||
( tetris>flag12 && ( a[tetris>x][tetris>y1]0 &&
a[tetris>x][tetris>y+1]0 && a[tetris>x2][tetris>y1]0 ) ) ||
( tetris>flag13 && ( a[tetris>x2][tetris>y]0 &&
a[tetris>x2][tetris>y+1]0 && a[tetris>x+2][tetris>y]0 ) ) ||
( tetris>flag14 && ( a[tetris>x][tetris>y1]0 &&
a[tetris>x][tetris>y+1]0 && a[tetris>x+2][tetris>y+1]0 ) ) ||
( tetris>flag15 && ( a[tetris>x2][tetris>y]0 &&
a[tetris>x+2][tetris>y1]0 && a[tetris>x+2][tetris>y]0 ) ) ||
( tetris>flag16 && ( a[tetris>x][tetris>y+1]0 &&
a[tetris>x][tetris>y1]0 && a[tetris>x+2][tetris>y1]0 ) ) ||
( tetris>flag17 && ( a[tetris>x2][tetris>y]0 &&
a[tetris>x2][tetris>y1]0 && a[tetris>x+2][tetris>y]0 ) ) ||
( tetris>flag18 && ( a[tetris>x][tetris>y1]0 &&
a[tetris>x][tetris>y+1]0 && a[tetris>x2][tetris>y+1]0 ) ) ||
( tetris>flag19 && ( a[tetris>x2][tetris>y]0 &&
a[tetris>x+2][tetris>y+1]0 && a[tetris>x+2][tetris>y]0 ) ) )
{
return 1
}
}
return 0
}
6)机产生俄罗斯方块类型序号
void get_flag(struct Tetris *tetris)
{
tetris>count++ 记住产生方块数
srand((unsigned)time(NULL)) 初始化机数
if(tetris>count1)
{
tetris>flag rand()19+1 记住第方块序号
}
tetris>next rand()19+1 记住方块序号
}
7)印俄罗斯方块
void print_tetris(HANDLE hOutstruct Tetris *tetris)
{
for(i0i<4i++)
{
b[i]1 数组b[4]元素值1
}
make_tetris(tetris) 制作俄罗斯方块
for( itetris>x2 i
{
for(jtetris>y2j
{
if( a[i][j]1 && j>FrameY )
{
gotoxy(hOutij)
printf(□) 印边框方块
}
}
}
印菜单信息
gotoxy(hOutFrameX+2*Frame_width+3FrameY+1)
printf(level dtetris>level)
gotoxy(hOutFrameX+2*Frame_width+3FrameY+3)
printf(score dtetris>score)
gotoxy(hOutFrameX+2*Frame_width+3FrameY+5)
printf(speed dmstetris>speed)
}
8)清俄罗斯方块痕迹
void clear_tetris(HANDLE hOutstruct Tetris *tetris)
{
for(i0i<4i++)
{
b[i]0 数组b[4]元素值0
}
make_tetris(tetris) 制作俄罗斯方块
for( itetris>x2 i
{
for(jtetris>y2j
{
if( a[i][j]0 && j>FrameY )
{
gotoxy(hOutij)
printf( ) 清方块
}
}
}
}
9)判断否满行删满行俄罗斯方块
void del_full(HANDLE hOutstruct Tetris *tetris)
{ 某行Frame_width2方块时满行
int kdel_count0 分记录某行方块数删方块行数变量
for(jFrameY+Frame_height1j>FrameY+1j)
{
k0
for(iFrameX+2i
if(a[i][j]1) 竖坐标次横坐标次左右判断否满行
{
k++ 记录行方块数
if(kFrame_width2)
{
for(kFrameX+2k
a[k][j]0
gotoxy(hOutkj)
printf( )
Sleep(1)
}
for(kj1k>FrameYk)
{ 果删行位置方块先清方块移位置
for(iFrameX+2i
{
a[i][k]0
gotoxy(hOutik)
printf( )
a[i][k+1]1
gotoxy(hOutik+1)
printf(□)
}
}
}
j++ 方块移重新判断删行否满行
del_count++ 记录删方块行数
}
}
}
}
tetris>score+100*del_count 删行100分
if( del_count>0 && ( tetris>score10000 || tetris>score1000>tetris>level1 ) )
{ 果1000分累计删10行速度加快20ms升级
tetris>speed20
tetris>level++
}
}
10)开始游戏
void start_game()
{
HANDLE hOut GetStdHandle(STD_OUTPUT_HANDLE) 定义显示器句柄变量
struct Tetris t*tetris&t 定义结构体指针指结构体变量
unsigned char ch 定义接收键盘输入变量
tetris>count0 初始化俄罗斯方块数0
tetris>speed300 初始移动速度300ms
tetris>score0 初始游戏分数0分
tetris>level1 初始游戏第1关
while(1)
{循环产生方块直游戏结束
get_flag(tetris) 产生俄罗斯方块类型序号
temptetris>flag 记住前俄罗斯方块序号
印俄罗斯方块图形(右边窗口)
tetris>xFrameX+2*Frame_width+6
tetris>yFrameY+10
tetris>flag tetris>next
print_tetris(hOuttetris)
tetris>xFrameX+Frame_width 初始中心方块x坐标
tetris>yFrameY1 初始中心方块y坐标
tetris>flagtemp 取出前俄罗斯方块序号
while(1)
{控制方块方直方块移
labelprint_tetris(hOuttetris)印俄罗斯方块
Sleep(tetris>speed) 延缓时间
clear_tetris(hOuttetris) 清痕迹
temp1tetris>x 记住中心方块横坐标值
temp2tetris>flag 记住前俄罗斯方块序号
if(kbhit())
{ 判断否键盘输入ch↓接收
chgetch()
if(ch75) ←键左动中心横坐标减2
{
tetris>x2
}
if(ch77) →键右动中心横坐标加2
{
tetris>x+2
}
if(ch72) ↑键变体前方块时针转90度
{
if( tetris>flag>2 && tetris>flag<3 )
{
tetris>flag++
tetris>flag2
tetris>flag+2
}
if( tetris>flag>4 && tetris>flag<7 )
{
tetris>flag++
tetris>flag4
tetris>flag+4
}
if( tetris>flag>8 && tetris>flag<11 )
{
tetris>flag++
tetris>flag4
tetris>flag+8
}
if( tetris>flag>12 && tetris>flag<15 )
{
tetris>flag++
tetris>flag4
tetris>flag+12
}
if( tetris>flag>16 && tetris>flag<19 )
{
tetris>flag++
tetris>flag4
tetris>flag+16
}
}
if(ch32) 空格键暂停
{
print_tetris(hOuttetris)
while(1)
{
if(kbhit()) 空格键继续游戏
{
chgetch()
if(ch32)
{
goto label
}
}
}
}
if(if_moveable(tetris)0) 果动面操作效
{
tetris>xtemp1
tetris>flagtemp2
}
else 果动执行操作
{
goto label
}
}
tetris>y++ 果没操作指令方块移动
if(if_moveable(tetris)0) 果移动动方块放处
{
tetris>y
print_tetris(hOuttetris)
del_full(hOuttetris)
break
}
}
for(itetris>y2i
{游戏结束条件:方块触框顶位置
if(iFrameY)
{
j0 果游戏结束j0 }
}
if(j0)
{
system(cls)
getch()
break
}
清俄罗斯方块图形(右边窗口)
tetris>flag tetris>next
tetris>xFrameX+2*Frame_width+6
tetris>yFrameY+10
clear_tetris(hOuttetris)
} }
4函数设计流程
进入俄罗斯方块程序
声明俄罗斯方块结构体
struct Tetris
定义全局变量
函数原型声明
制作游戏窗口make_frame()
开始游戏start_game()
定义函数
void main()
制作俄罗斯方块
判断否动
开始游戏
具体设计运行游戏需种功
机产生俄罗斯
方块类型序号
印俄罗斯方块
清俄罗斯方块痕迹
判断否满行删满行俄罗斯方块
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档