俄罗斯方块的设计与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
俄罗斯⽅块的设计与实现
1 需求分析
1.实验题⽬:俄罗斯⽅块⼩游戏
俄罗斯⽅块是在⼀个m*n 的矩形框内进⾏的,矩形框的顶部会随机的出现⼀个有四个⼩⽅块组成的砖块,每过⼀段时间,就会下落⼀格,知道他碰到底部,然后再过⼀个时间下落另⼀个砖块,依次进⾏,砖块是随机出现的。
当发现底部砖块是满的话,则消去它从⽽得到相应设置的分数,当砖块到达顶部的时候,游戏结束。
选择俄罗斯⽅块进⾏C++⾯向对象程序设计课程设计主要是在学习C++这门⾯向对象语⾔的基础上,并通过实践加深对 C++⾯向对象程序设计语⾔特点的认识与理解。
同时,可以提⾼运⽤C++编程语⾔解决实际问题的能⼒;锻炼实际的编程能⼒;还能提⾼调查研究、查阅技术⽂献、资料以及编写软件设计⽂档的能⼒。
2.功能要求
(1)实现⽅块的变形、下落、左移、右移消⾏等基本的功能。
(2)实现⽅块暂停、判断分数以及等级设置功能。
(3)界⾯窗⼝、以及⼩⽅块图形设计功能。
(4)要求利⽤⾯向对象程序设计⽅法以及C的编程思想来完成系统的设计。
(5)要求有菜单、⽂件操作,数据使⽤数组、结构体等均可,键盘操作或⿏标操作均可。
(6)所编写的程序必须上机通过,并获得满意的结果。
2 系统设计
2.1数据结构的设计
struct Tetris
{
int x; //中⼼⽅块的x轴坐标
int y; //中⼼⽅块的y轴坐标
int flag; //标记⽅块类型的序号
int next; //下⼀个俄罗斯⽅块类型的序号
int speed; //俄罗斯⽅块移动的速度
int count; //产⽣俄罗斯⽅块的个数
int score; //游戏的分数
int level; //游戏的等级
};
2.2数据存储的设计
a)程序中⽅法void make_tetris(struct Tetris *tetris)穷举出19中⽅块形状类型。
b)⽅法int if_moveable(struct Tetris *tetris)判断⽅块是否可以移动。
c)⽅法void get_flag(struct Tetris *tetris)随机产⽣19中⽅块形状类型的序号⽤于区分不同的形状。
d)⽅法void print_tetris(HANDLE hOut,struct Tetris *tetris)打印随机⽣成的俄罗斯⽅块。
e)⽅法void clear_tetris(HANDLE hOut,struct Tetris *)⽤于清除俄罗斯⽅块的痕迹。
f)⽅法void del_full(HANDLE hOut,struct Tetris *);判断⽅块是否满⾏。
2.3功能设计
2.3.1 插⼊功能
(1)俄罗斯⽅块功能设计图
2.3.2删除功能
2.3.3 查找功能
2.3.4 功能
a)⽅块操作功能:在⽅块下落时,可以通过键盘左⽅向键←和右⽅向键→控制⽅块在下降的过程中向左移动、向右移动。
⽅向键↑控制⽅块的变形。
b)得分功能:每消除⼀⾏得100分。
以此累加。
c)等级提升功能:当得分为1000分时(即消除10⾏),等级提升⼀级。
d)⽅块速度控制:默认速度是400ms,每当等级提升⼀级时,下降时间减少20ms。
e)游戏控制:空格键游戏暂停,再次点击空格键,游戏继续。
当点击Esc按键时退出游戏。
3 系统实现与测试
3.1 系统实现
3.2 系统测试
四总结与展望
运⾏程序,⽅块可以产⽣,并通过左右⽅向键可以控制⽅块的左右移动,通过⽅向键↑,可以改变当前⽅块的旋转⾓度,并通过⽅向键可以将改变后的⽅块堆放在适合的位置,。
当⽅块堆满⼀⾏时,将满⾏⽅块消除,得分加100,当得分满1000分时,等级提升1,同时下降速度提升20ms。
当⽅块堆到顶时提⽰游戏结束,使⽤空格键可以控制游戏暂停,使⽤Esc键可以退出游戏。
五个⼈体会
通过本次综合设计,掌握了C++⾯向对象的开发思想,对于复杂的问题学会从全局思考,分解问题并将模块化、画出结构图、设置好变量、留⾜修改与增添的空间、设计好测试的平台。
其次写⼀个函数就测试⼀个函数可很好的解决程序改错的问题、联系⾃⼰已解决的问题可减少在去写类似函数的⼯作量。
巩固了C++的基础知识,并熟练的应⽤,为以后从事c++编程开发,打下了良好的基础。
六程序附录
#include<iostream>
#include <windows.h>
#include <conio.h>
#include <time.h>
using namespace std;
//游戏窗⼝
#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表⽰⽆⽅块
//声明俄罗斯⽅块的结构体
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 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); //打印游戏名称
cout<<"俄罗斯⽅块"<<endl;
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+7); //打印选择菜单
cout<<"**********下⼀个⽅块:"<<endl;
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+13);
cout<<"**********"<<endl;
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+17);
cout<<"↑键:变体"<<endl;
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+19);
cout<<"空格:暂停游戏"<<endl;
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+15);
cout<<"Esc :退出游戏"<<endl;
gotoxy(hOut,FrameX,FrameY); //打印框⾓并记住该处已有图案
cout<<"╔"<<endl;
gotoxy(hOut,FrameX+2*Frame_width-2,FrameY);
cout<<"╗"<<endl;
gotoxy(hOut,FrameX,FrameY+Frame_height);
cout<<"╚"<<endl;
gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+Frame_height);
cout<<"╝"<<endl;
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);
cout<<"═"<<endl; //打印上横框
}
for(i=2;i<2*Frame_width-2;i+=2)
{
gotoxy(hOut,FrameX+i,FrameY+Frame_height);
cout<<"═"<<endl; //打印下横框
a[FrameX+i][FrameY+Frame_height]=2; //记住下横框有图案
}
for(i=1;i<Frame_height;i++)
{
gotoxy(hOut,FrameX,FrameY+i);
cout<<"║"<<endl; //打印左竖框
a[FrameX][FrameY+i]=2; //记住左竖框有图案
}
for(i=1;i<Frame_height;i++)
{
gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+i);
cout<<"║"<<endl; //打印右竖框
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种类型
{
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-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][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;
}
}
}
//******判断是否可动*************************************************************************/
int if_moveable(struct Tetris *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 &&
}
}
return0;
}
/******随机产⽣俄罗斯⽅块类型的序号**********************************************************/ 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);
cout<<"□"<<endl; //打印边框内的⽅块
}
}
}
//打印菜单信息
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+1);
cout<<"level : "<<tetris->level<<endl;
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+3);
cout<<"score :"<<tetris->score<<endl;
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+5);
cout<<"speed :"<<tetris->speed<<"ms"<<endl;
}
/******清除俄罗斯⽅块的痕迹****************************************************************/ 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);
cout<<""<<endl; //清除⽅块
}
}
}
}
/******判断是否满⾏并删除满⾏的俄罗斯⽅块****************************************************/ 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);
cout<<""<<endl;
{ //如果删除⾏以上的位置有⽅块,则先清除,再将⽅块下移⼀个位置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);
cout<<""<<endl;
a[i][k+1]=1;
gotoxy(hOut,i,k+1);
cout<<"□"<<endl;
}
}
}
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=400; //初始移动速度为400ms
tetris->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;
}
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==27){
system("cls");
cout<<"退出游戏成功!"<<endl;
getch();
exit(0); //退出游戏
break;
}
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");
cout<<"Game Over!"<<endl;
getch();
break;
}
//清除下⼀个俄罗斯⽅块的图形(右边窗⼝)
tetris->flag = tetris->next;
tetris->x=FrameX+2*Frame_width+6;
tetris->y=FrameY+10;
clear_tetris(hOut,tetris);
}
}
int main()
{
start_game(); return0;
}。