|
|
|
@ -27,13 +27,13 @@ HANDLE hOut; //
|
|
|
|
|
/****函数声明****/
|
|
|
|
|
int color(int c); //控制文字颜色函数
|
|
|
|
|
void gotoxy(int x,int y); //获取屏幕光标位置
|
|
|
|
|
void welcome(); //首页
|
|
|
|
|
void Game(); //游戏界面
|
|
|
|
|
void play(); //开始游戏
|
|
|
|
|
void explation(); //操作说明
|
|
|
|
|
void rule(); //游戏规则
|
|
|
|
|
void MakeTetris(struct Tetris *); //制作方块
|
|
|
|
|
void PrintTetris(struct Tetris *); //打印方块
|
|
|
|
|
void Make(struct Tetris *); //制作方块
|
|
|
|
|
void Print(struct Tetris *); //打印方块
|
|
|
|
|
void Clean(struct Tetris *); //清除痕迹
|
|
|
|
|
/**
|
|
|
|
|
*控制文字颜色函数
|
|
|
|
|
*/
|
|
|
|
@ -54,18 +54,12 @@ void gotoxy(int x,int y)
|
|
|
|
|
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*主函数
|
|
|
|
|
*/
|
|
|
|
|
int main()
|
|
|
|
|
{
|
|
|
|
|
welcome();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*首页
|
|
|
|
|
*/
|
|
|
|
|
void welcome()
|
|
|
|
|
void main()
|
|
|
|
|
{
|
|
|
|
|
/*图案*/
|
|
|
|
|
color(11);
|
|
|
|
@ -313,7 +307,7 @@ void Game()
|
|
|
|
|
/**
|
|
|
|
|
* 制作方块
|
|
|
|
|
*/
|
|
|
|
|
void MakeTetris(struct Tetris *tetris)
|
|
|
|
|
void Make(struct Tetris *tetris)
|
|
|
|
|
{
|
|
|
|
|
a[tetris->x][tetris->y]=b[0]; //中心方块位置的图形状态
|
|
|
|
|
switch(tetris->flag) //共7大类,19种类型
|
|
|
|
@ -494,13 +488,13 @@ void MakeTetris(struct Tetris *tetris)
|
|
|
|
|
/**
|
|
|
|
|
*打印方块
|
|
|
|
|
*/
|
|
|
|
|
void PrintTetris(struct Tetris *tetris)
|
|
|
|
|
void Print(struct Tetris *tetris)
|
|
|
|
|
{
|
|
|
|
|
for(i=0;i<4;i++) //让数组b[4]中的每个数都为1
|
|
|
|
|
{
|
|
|
|
|
b[i]=1;
|
|
|
|
|
}
|
|
|
|
|
MakeTetris(tetris);
|
|
|
|
|
Make(tetris);
|
|
|
|
|
for(i=tetris->x-2;i<=tetris->x+4;i+=2)
|
|
|
|
|
{
|
|
|
|
|
for(j=tetris->y-2;j<=tetris->y+1;j++) //循环方块所以可能出现的位置
|
|
|
|
@ -536,30 +530,30 @@ void MakeTetris(struct Tetris *tetris)
|
|
|
|
|
void play()
|
|
|
|
|
{
|
|
|
|
|
int n;
|
|
|
|
|
struct Tetris t,*tetris=&t; //定义结构体的指针并指向结构体变量
|
|
|
|
|
char ch; //定义接收键盘输入的变量
|
|
|
|
|
tetris->number=0; //初始化俄罗斯方块数为0个
|
|
|
|
|
tetris->speed=300; //初始移动速度为300ms
|
|
|
|
|
tetris->score=0; //初始游戏的分数为0分
|
|
|
|
|
tetris->level=1; //初始游戏为第1关
|
|
|
|
|
while(1) //循环产生方块,直至游戏结束
|
|
|
|
|
struct Tetris t,*tetris=&t;
|
|
|
|
|
char ch;
|
|
|
|
|
tetris->number=0;
|
|
|
|
|
tetris->speed=300;
|
|
|
|
|
tetris->score=0;
|
|
|
|
|
tetris->level=1;
|
|
|
|
|
while(1)
|
|
|
|
|
{
|
|
|
|
|
Flag(tetris); //得到产生俄罗斯方块类型的序号
|
|
|
|
|
Temp=tetris->flag; //记住当前俄罗斯方块序号
|
|
|
|
|
tetris->x=FrameX+2*Frame_width+6; //获得预览界面方块的x坐标
|
|
|
|
|
tetris->y=FrameY+10; //获得预览界面方块的y坐标
|
|
|
|
|
tetris->flag = tetris->next; //获得下一个俄罗斯方块的序号
|
|
|
|
|
PrintTetris(tetris); //调用打印俄罗斯方块方法
|
|
|
|
|
tetris->x=FrameX+Frame_width; //获得游戏窗口中心方块x坐标
|
|
|
|
|
tetris->y=FrameY-1; //获得游戏窗口中心方块y坐标
|
|
|
|
|
Flag(tetris);
|
|
|
|
|
Temp=tetris->flag;
|
|
|
|
|
tetris->x=FrameX+2*Frame_width+6;
|
|
|
|
|
tetris->y=FrameY+10;
|
|
|
|
|
tetris->flag = tetris->next;
|
|
|
|
|
Print(tetris);
|
|
|
|
|
tetris->x=FrameX+Frame_width;
|
|
|
|
|
tetris->y=FrameY-1;
|
|
|
|
|
tetris->flag=Temp;
|
|
|
|
|
//按键操作
|
|
|
|
|
while(1) //控制方块方向,直至方块不再下移
|
|
|
|
|
while(1)
|
|
|
|
|
{
|
|
|
|
|
label:PrintTetris(tetris); //打印俄罗斯方块
|
|
|
|
|
Sleep(tetris->speed); //延缓时间
|
|
|
|
|
CleanTetris(tetris); //清除痕迹
|
|
|
|
|
Temp1=tetris->x; //记住中心方块横坐标的值
|
|
|
|
|
label:PrintTetris(tetris);
|
|
|
|
|
Sleep(tetris->speed);
|
|
|
|
|
CleanTetris(tetris);
|
|
|
|
|
Temp1=tetris->x;
|
|
|
|
|
Temp2=tetris->flag; //记住当前俄罗斯方块序号
|
|
|
|
|
if(kbhit()) //判断是否有键盘输入,有则用ch↓接收
|
|
|
|
|
{
|
|
|
|
@ -618,7 +612,7 @@ void play()
|
|
|
|
|
}
|
|
|
|
|
if(ch == 32) //按空格键,暂停
|
|
|
|
|
{
|
|
|
|
|
PrintTetris(tetris);
|
|
|
|
|
Print(tetris);
|
|
|
|
|
while(1)
|
|
|
|
|
{
|
|
|
|
|
if(kbhit()) //再按空格键,继续游戏
|
|
|
|
@ -684,14 +678,41 @@ for(i=tetris->y-2;i<tetris->y+2;i++)
|
|
|
|
|
printf("|| ■■ ■ ■■■■■ ■ ■ || \n");
|
|
|
|
|
printf(" @============================================================================@ \n");
|
|
|
|
|
if(MessageBox(NULL,"游戏结束.\n要重新来一局么?","Game Over",MB_YESNO|MB_ICONQUESTION)==IDYES)
|
|
|
|
|
Replay(tetris);
|
|
|
|
|
{
|
|
|
|
|
system("cls");
|
|
|
|
|
memset(a,0,6400*sizeof(int));
|
|
|
|
|
Game();
|
|
|
|
|
play();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
exit(0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
tetris->flag = tetris->next; //清除下一个俄罗斯方块的图形(右边窗口)
|
|
|
|
|
tetris->flag = tetris->next;
|
|
|
|
|
tetris->x=FrameX+2*Frame_width+6;
|
|
|
|
|
tetris->y=FrameY+10;
|
|
|
|
|
CleanTetris(tetris);
|
|
|
|
|
Clean(tetris);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* 清除痕迹
|
|
|
|
|
*/
|
|
|
|
|
void Clean(struct Tetris *tetris)
|
|
|
|
|
{
|
|
|
|
|
for(i=0;i<4;i++) //数组b[4]中有4个元素,循环这4个元素,让每个元素的值都为0
|
|
|
|
|
{
|
|
|
|
|
b[i]=0; //数组b[4]的每个元素的值都为0
|
|
|
|
|
}
|
|
|
|
|
Make(tetris);
|
|
|
|
|
for( i = tetris->x - 2;i <= tetris->x + 4; i+=2 ) // X为中心方块
|
|
|
|
|
{
|
|
|
|
|
for(j = tetris->y-2;j <= tetris->y + 1;j++)
|
|
|
|
|
{
|
|
|
|
|
if( a[i][j] == 0 && j > FrameY ) //如果这个位置上没有图案,并且处于游戏界面当中
|
|
|
|
|
{
|
|
|
|
|
gotoxy(i,j);
|
|
|
|
|
printf(" "); //清除方块
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|