C语言课程设计报告俄罗斯方块改进版

  • 格式:doc
  • 大小:227.00 KB
  • 文档页数:34

课程设计俄罗斯方块改进2016年4月20日设计题目 学号 专业班级 学生姓名 指导教师目录1. 课程设计目的 (1)2. 功能分析 (1)3. 程序设计实现过程 (2)3.1 程序总体设计结构 (2)3.2 界面设计 (6)3.3 重要数据的数据结构设计 (6)3.4 函数设计 (10)4. 运行效果 (15)5. 源代码详解 (16)6. 参考文献 (29)俄罗斯方块改进1. 课程设计问题据百度百科,俄罗斯方块(Tetris)是一款由俄罗斯人阿列克谢·帕基特诺夫于1984年6月发明的休闲游戏。

游戏的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。

要求支持键盘操作和7种不同类型方块的旋转变换,并且界面上显示下一个方块的提示以及当前的玩家的得分,随着游戏的进行,等级越高,游戏难度越大,即方块的下落速度越快,相应的等级,等级越高,消去一行所得到的分数越高,为玩家提供了不同的选择。

2. 功能分析俄罗斯方块游戏需要解决的问题包括:⑴按任意键开始游戏,随机产生方块并自动下移⑵用Esc键退出游戏。

⑶用键变换方块⑷用键和键左右移动方块⑸用键使方块加速下移⑹用空格键使方块暂停⑺能正确判断满行并消行、计分、定级别⑻设定游戏方块为不同形状重点:*游戏面包的数据结构:二维数组*7种形状方块的数据结构:结构体保存每种形状方块的坐标3. 程序设计实现过程3.1 程序总体设计结构首先初始化进入图形模式,进入欢迎界面,玩家按任意进入主菜单界面,按键进入游戏界面,键然后设置新的时钟中断。

开始游戏后,进入该程序最核心的部分——处理和实现进行过程中的各种事件和函数。

在处理中判断游戏是否结束,如果没有结束,则重新开始游戏,否则结束游戏。

详解如下:(1)游戏方块预览功能。

在游戏过程中,当在游戏底板中出现一个游戏方块时,必须在游戏方块预览区域中出现下一个游戏方块,这样有利于游戏玩家控制游戏的策略。

由于在此游戏中存在19种不同的游戏方块,所以在游戏方块预览区域中需要显示随机生成的游戏方块。

(2)游戏方块控制功能。

通过各种条件的判断,实现对游戏方块的左移、右移、快速下移、自由下落、旋转功能,以及行满消除行的功能。

是游戏执行主流程图(3)游戏显示更新功能。

在判断键值时,有左移VK_LEFT、右移VK_RIGHT、下移VK_DOWN、变形旋转VK_UP、退出VK_ESC键值的判断。

当游戏方块左右移动、下落、旋转时,要清除先前的游戏方块,用新坐标重绘游戏方块。

当消除满行时,要重绘游戏底板的当前状态。

(4)游戏速度分数更新功能。

在游戏玩家进行游戏过程中,需要按照一定的游戏规则给玩家计算游戏分数。

比如,消除一行加10分。

当游戏分数达到一定数量之后,需要给游戏者进行等级的上升,每上升一个等级,游戏方块的下落速度将加快,游戏的难度将增加。

(5)游戏帮助功能。

玩家进入游戏后,将有对本游戏如何操作的友情提示。

主函数:void main(){InitializeGraph();SetTimer(newtimer); /*设置新的时钟中断*/while(1){StartGame();ProcessInGame();if(GameOver())break;bOver = FALSE;}KillTimer();closegraph();}3.2界面设计分为左右两个部分:*左边为游戏面板*右边有三部分:下一个形状提示框、速度框和计分框3.3 重要数据的数据结构设计1)定义方块形状:定义如下的结构体来表示每一个形状:struct block{int arrXY[8];int nColor;int nNext;}; /*保存某一形状信息的结构体*/Struct SHAPE shapes[MAX_BOX]={口口口口口口口口口口口口口口口口{0x88, 0xc0, CYAN, 1},{0xe8, 0x0, CYAN, 2},{0xc4, 0x40, CYAN, 3},{0x2e, 0x0, CYAN, 0},口口口口口口口口口口口口口口口口{0x44, 0xc0, MAGENTA, 5},{0x8e, 0x0, MAGENTA, 6},{0xc8, 0x80, MAGENTA, 7},{0xe2, 0x0, MAGENTA, 4},口口口口口口口口{0x8c, 0x40, YELLOW, 9},{0x6c, 0x0, YELLOW, 8},口口口口口口口口{0x4c, 0x80, BROWN, 11},{0xc6, 0x0, BROWN, 10},口口口口口口口口口口口口口口口口{0x4e, 0x0, WHITE, 13},{0x8c, 0x80, WHITE, 14},{0xe4, 0x0, WHITE, 15},{0x4c, 0x40, WHITE, 12},口口口口口口口口{0x88, 0x88, RED, 17},{0xf0, 0x0, RED, 16},口口口口{0xcc, 0x0, BLUE, 18),}2)定义游戏的主界面:宽10、高20的游戏板(1)数据结构:全局数组Gameboard[12][22],1表示已有的方块,0表示这个位置空着。

在10*20基础上各自加2行、2列为了便于判断形状在移动时是否到边、到底。

整个屏幕的坐标系原先为640*480。

在此游戏中,将16个像素定义为一个方格的边长,所以坐标系转变成为了40*30(640/16=40,480/10=30)。

(2)玩家进行游戏时,需要对游戏界面进行初始化工作。

此代码被main()函数调用。

主要进行的工作如下:①循环调用line()函数绘制当前游戏板。

②调用nScore()函数显示初始的成绩,初始成绩为0。

③调用npeed()函数显示初始的速度(等级),初始速度1。

***************************************************** 注:x,y为左上角坐标* * m,n对应于Vertical_boxs,Horizontal_boxs* * 分别表示纵横方向上方块的个数(以方块为单位)** BOARD_LEFT_X ,BOARD_LEFT_Y*****************************************************3.4 函数设计1、本程序有主函数和个函数组成:本程序总共由24个函数组成。

2、函数相互作用关系见下图键)Void main() 主流程函数主函数入口,整个游戏的主控部分4. 运行效果5. 源代码详解#include <stdio.h>#include <windows.h>#include <conio.h>#include <time.h>//游戏窗口#define FrameX 4 //游戏窗口左上角的X轴坐标#define FrameY 4 //游戏窗口左上角的Y轴坐标#define Frame_height 20 //游戏窗口的高度#define Frame_width 18 //游戏窗口的宽度//定义全局变量int i,j,temp,temp1,temp2; //temp,temp1,temp2用于记住和转换方块变量的值int a[80][80]={0}; //标记游戏屏幕的图案:2,1,0分别表示该位置为游戏边框、方块、无图案;初始化为无图案int b[4]; //标记4个"口"方块:1表示有方块,0表示无方块char shape[10][4]={"□","■","○","●","☆","★","◇","◆","△","▲"}; int ss=0;//声明俄罗斯方块的结构体struct Tetris{int x; //中心方块的x轴坐标int y; //中心方块的y轴坐标int flag; //标记方块类型的序号int next; //下一个俄罗斯方块类型的序号int speed; //俄罗斯方块移动的速度int count; //产生俄罗斯方块的个数int score; //游戏的分数int level; //游戏的等级};//函数原型声明//光标移到指定位置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 hOut,struct Tetris *);//清除俄罗斯方块的痕迹void clear_tetris(HANDLE hOut,struct Tetris *);//判断是否能移动,返回值为1,能移动,否则,不动int if_moveable(struct Tetris *);//判断是否满行,并删除满行的俄罗斯方块void del_full(HANDLE hOut,struct Tetris *);//开始游戏void start_game();void main(){int t;for ( t=0; t<10; t++){printf("%s",shape[t]);}printf("\n0 1 2 3 4 5 6 7 8 9\n");printf("请输入形状编号");scanf("%d",&ss);//制作游戏窗口make_frame();//开始游戏start_game();}/******光标移到指定位置**************************************************************/ void gotoxy(HANDLE hOut, int x, int y){COORD pos;pos.X = x; //横坐标pos.Y = y; //纵坐标SetConsoleCursorPosition(hOut, pos);}/******制作游戏窗口******************************************************************/ void make_frame(){HANDLE hOut = 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; //记住右竖框有图案}}/******制作俄罗斯方块********************************************************************/ void make_tetris(struct Tetris *tetris){a[tetris->x][tetris->y]=b[0]; //中心方块位置的图形状态:1-有,0-无switch(tetris->flag) //共6大类,19种类型{case 1: //田字方块{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;}case 2: //直线方块:----{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;}case 3: //直线方块: |{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;}case 4: //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;}case 5: //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;}case 6: //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;}case 7: //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;}case 8: //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;}case 9: //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;}case 10: //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;}case 11: //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;}case 12: //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;}case 13: //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;}case 14: //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;}case 15: //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;}case 16: //倒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;}case 17: //倒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;}case 18: //倒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;}case 19: //倒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;}}}//******判断是否可动*************************************************************************/int if_moveable(struct Tetris *tetris){if(a[tetris->x][tetris->y]!=0)//当中心方块位置上有图案时,返回值为0,即不可移动{return 0;}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 ) ) ){return 1;}}return 0;}/******随机产生俄罗斯方块类型的序号**********************************************************/void get_flag(struct Tetris *tetris){tetris->count++; //记住产生方块的个数srand((unsigned)time(NULL)); //初始化随机数if(tetris->count==1){tetris->flag = rand()%19+1; //记住第一个方块的序号}tetris->next = rand()%19+1; //记住下一个方块的序号}/******打印俄罗斯方块**********************************************************************/ void print_tetris(HANDLE hOut,struct Tetris *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("%s",shape[ss]); //打印边框内的方块□}}}//打印菜单信息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);}/******清除俄罗斯方块的痕迹****************************************************************/ void clear_tetris(HANDLE hOut,struct Tetris *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(" "); //清除方块}}}}/******判断是否满行并删除满行的俄罗斯方块****************************************************/void del_full(HANDLE hOut,struct Tetris *tetris){ //当某行有Frame_width-2个方块时,则满行int k,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("%s",shape[ss]);}}}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++;}}/******开始游戏******************************************************************************/ void start_game(){HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //定义显示器句柄变量struct Tetris t,*tetris=&t; //定义结构体的指针并指向结构体变量unsigned char ch; //定义接收键盘输入的变量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->flag<=19 ){tetris->flag++;tetris->flag%=4;tetris->flag+=16;}}if(ch==32) //按空格键,暂停{print_tetris(hOut,tetris);while(1){if(kbhit()) //再按空格键,继续游戏{ch=getch();if(ch==32){goto label;}}}}if(if_moveable(tetris)==0) //如果不可动,上面操作无效{tetris->x=temp1;tetris->flag=temp2;}else //如果可动,执行操作{goto label;}}tetris->y++; //如果没有操作指令,方块向下移动if(if_moveable(tetris)==0) //如果向下移动且不可动,方块放在此处{tetris->y--;print_tetris(hOut,tetris);del_full(hOut,tetris);break;}}for(i=tetris->y-2;i<tetris->y+2;i++){//游戏结束条件:方块触到框顶位置if(i==FrameY){j=0; //如果游戏结束,j=0}}if(j==0){system("cls");getch();break;}//清除下一个俄罗斯方块的图形(右边窗口)tetris->flag = tetris->next;tetris->x=FrameX+2*Frame_width+6;tetris->y=FrameY+10;clear_tetris(hOut,tetris);}}6. 参考文献《C程序设计》第四版谭浩强著清华大学出版社出版《C语言程序设计》刘国成科学出版社《从问题到程序》裘宗燕北京大学出版社《计算机二级教程》刘瑞挺南开大学出版社《C语言程序设计基础教程》陈朔鹰,兵器工业出版社[5] C语言程序设计姜仲秋南京大学出版社。