求大佬解决
#include <stdio.h>
#include <windows.h>#include <time.h>
#include <conio.h>
#define FrameX 3
#define FrameY 13
#define Frame_height 20
#define Frame_width 18
int i,j,Temp,Temp1,Temp2;
int a[80][80]={0};
int b[4];
struct Tetris
{
int x;
int y;
int number;
int flag;
int speed;
int score;
int level;
int next;
};
HANDLE hOut;
void gotoxy(int x,int y);
void MakeTetris(struct Tetris *);
void PrintTetris(struct Tetris *);
void CleanTetris(struct Tetris *);
void regulation();
void Replay(struct Tetris*);
void Gameplay();
void Flag(struct Tetris *);
void close();
void welcom();
void title();
void explation();
void DrwaGameframe();
int ifMove(struct Tetris *);
void Del_Fullline(struct Tetris *);
void gotoxy(int x,int y)
{
COORD pos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
int color(int c)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c);
return 0;
}
void DrwaGameframe()
{
gotoxy(FrameX+Frame_width+5,FrameY-11);
color(11);
printf("趣味俄罗斯方块");
gotoxy(FrameX+Frame_width+30,FrameY-2);
color(2);
printf("***************************");
gotoxy(FrameX+Frame_width+30,FrameY+2);
color(3);
printf("下一个出现方块:");
gotoxy(FrameX+Frame_width+30,FrameY+4);
color(2);
printf("***************************");
gotoxy(FrameX+Frame_width+30,FrameY+6);
color(14);
printf("↑键:旋转");
gotoxy(FrameX+Frame_width+30,FrameY+8);
color(10);
printf("空格:暂停");
gotoxy(FrameX+Frame_width+30,FrameY+10);
color(11);
printf("Esc:退出游戏");
color(12);
gotoxy(FrameX+10,FrameY-9);
printf("╔");
gotoxy(FrameX+Frame_width+26,FrameY-9);
printf("╗");
gotoxy(FrameX+10,FrameY+Frame_height-9);
printf("╚");
gotoxy(FrameX+Frame_width+26,FrameY+Frame_height-9);
printf("╝");
a[FrameX+10][FrameY+Frame_height-9]=2;
a[FrameX+Frame_width+26][FrameY+Frame_height-9]=2;
for(i=2;i<Frame_width+16;i+=2)
{
gotoxy(FrameX+10+i,FrameY-9);
printf("═");
}
for(i=2;i<Frame_width+16;i+=2)
{
gotoxy(FrameX+10+i,FrameY+Frame_height-9);
printf("═");
a[FrameX+10+i][FrameY+Frame_height-9]=2;
}
for(i=1;i<Frame_height;i++)
{
gotoxy(FrameX+10,FrameY-9+i);
printf("║");
a[FrameX+10][FrameY-9+i]=2;
}
for(i=1;i<Frame_height;i++)
{
gotoxy(FrameX+Frame_width+26,FrameY-9+i);
printf("║");
a[FrameX+Frame_width+26][FrameY-9+i]=2;
}
}
void title()
{
color(11);
gotoxy(28,4);
printf("趣 味 俄 罗 斯 方 块");
color(14);
gotoxy(15,6);
printf("■");
gotoxy(15,7);
printf("■■");
gotoxy(15,8);
printf("■");
color(6);
gotoxy(25,6);
printf("■■");
gotoxy(27,7);
printf("■■");
color(10);
gotoxy(35,6);
printf("■■");
gotoxy(35,7);
printf("■■");
color(13);
gotoxy(45,5);
printf("■");
gotoxy(45,6);
printf("■");
gotoxy(45,7);
printf("■");
gotoxy(45,8);
printf("■");
color(12);
gotoxy(55,7);
printf("■■■");
gotoxy(59,6);
printf("■");
}
void close()
{
exit(0);
}
void welcom()
{
int n;
int i,j=1;
color(14);
for(i=9;i<=26;i++)
{
for(j=15;j<=61;j++)
{
gotoxy(j,i);
if(i==9 || i==26) printf("=");
else if(j==15 || j==60) printf("||");
}
}
color(12);
gotoxy(20,11);
printf("1.开始游戏");
color(5);
gotoxy(45,11);
printf("2.游戏规则");
color(10);
gotoxy(20,20);
printf("3.按键说明");
color(8);
gotoxy(45,20);
printf("4.退出游戏");
color(12);
gotoxy(30,30);
printf("请输入[1 2 3 4]:[ ]\b\b");
scanf("%d",&n);
switch(n)
{
case 1:
system("cls");
DrwaGameframe();
Gameplay();
break;
case 2:
system("cls");
// regulation();
break;
case 3:
system("cls");
// explation();
break;
case 4:
system("cls");
close();
break;
}
}
void Flag(struct Tetris *tetris)
{
tetris->number++;
srand(time(NULL));
if(tetris->number==1)
{
tetris->flag=rand()%19+1;
}
tetris->next=rand()%19+1;
}
void Gameplay()
{
int n;
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+Frame_width+48;
tetris->y=FrameY+1;
tetris->flag=tetris->next;
PrintTetris(tetris);
tetris->x=FrameX+Frame_width+9;
tetris->y=FrameY-7;
tetris->flag=Temp;
while(1)
{
label:PrintTetris(tetris);
Sleep(tetris->speed);
CleanTetris(tetris);
Temp1=tetris->x;
Temp2=tetris->flag;
if(kbhit())
{
ch=getch();
if(ch==75)
{
tetris->x-=2;
}
if(ch==77)
{
tetris->x+=2;
}
if(ch==80)
{
if(ifMove(tetris)!=0)
{
tetris->y+=2;
}
if(ifMove(tetris)==0)
{
tetris->y=FrameY+Frame_height-8;
}
}
if(ch==72)
{
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)
{
PrintTetris(tetris);
while(1)
{
if(kbhit())
{
ch=getch();
if(ch==32)
{
goto label;
}
}
}
}
if(ch==27)
{
system("cls");
memset(a,0,6400*sizeof(int));
welcom();
}
if(ifMove(tetris)==0)
{
tetris->x=Temp1;
tetris->flag=Temp2;
}
else
{
goto label;
}
}
tetris->y++;
if(ifMove(tetris)==0)
{
tetris->y--;
PrintTetris(tetris);
Del_Fullline(tetris);
break;
}
}
for(i=tetris->y-2;i<tetris->y+2;i++)
{
if(i==FrameY-9)
{
system("cls");
gotoxy(29,7);
printf(" \n");
color(12);
printf("\t\t\t■■■■ ■ ■ ■■ \n");
printf("\t\t\t■ ■■ ■ ■ ■ \n");
printf("\t\t\t■■■ ■ ■ ■ ■ ■ \n");
printf("\t\t\t■ ■ ■■ ■ ■ \n");
printf("\t\t\t■■■■ ■ ■ ■■ \n");
gotoxy(17,18);
color(14);
printf("我要重新玩一局-------1");
gotoxy(44,18);
printf("不玩了,退出吧-------2\n");
int n;
gotoxy(32,20);
printf("选择【1/2】:");
color(11);
scanf("%d", &n);
switch (n)
{
case 1:
system("cls");
Replay(tetris); //重新开始游戏
break;
case 2:
exit(0);
break;
}
}
}
tetris->flag=tetris->next;
tetris->x=FrameX+Frame_width+48;
tetris->y=FrameY+1;
CleanTetris(tetris);
}
}
void Del_Fullline(struct Tetris *tetris)
{
int k,del_rows=0;
for(j=FrameY+Frame_height-9;j>=FrameY-9;j--)
{
k=0;
for(i=FrameX+10;i<FrameX+Frame_width+26;i+=2)
{
if(a[i][j]==1)
{
k++;
if(k==7)
{
for(k=FrameX+12;k<FrameX+Frame_width+26;k+=2)
{
a[k][j]=0;
gotoxy(k,j);
printf(" ");
}
for(k=j-1;k>FrameY;k--)
{
for(i=FrameX+12;i<FrameX+Frame_width+26;i+=2)
{
if(a[i][k]==1)
{
a[i][k]=0;
gotoxy(i,k);
printf(" ");
a[i][k+1]=1;
gotoxy(i,k+1);
printf("■");
}
}
}
j++;
del_rows++;
}
}
}
}
tetris->score+=100*del_rows;
if(del_rows>0 && (tetris->score%1000==0||tetris->score/1000>tetris->level-1))
{
tetris->speed-=20;
tetris->level++;
}
}
int ifMove(struct Tetris *tetris)
{
if(a[tetris->x][tetris->y]!=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==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==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==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==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==19 && ( 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==17 && ( a[tetris->x-2][tetris->y]==0 &&
a[tetris->x+2][tetris->y+1]==0 && a[tetris->x+2][tetris->y]==0 ) ) )
{
return 1;
}
}
}
void Replay(struct Tetris *)
{
system("cls");
memset(a,0,6400*sizeof(int));
DrwaGameframe();
Gameplay();
}
void PrintTetris(struct Tetris *tetris)
{
for(i=0;i<4;i++)
{
b[i]=1;
}
MakeTetris(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-9)
{
gotoxy(i,j);
printf("■");
}
}
}
gotoxy(FrameX+Frame_width+30,FrameY-7);
color(4);
printf("level : ");
color(12);
printf(" %d",tetris->level);
gotoxy(FrameX+Frame_width+30,FrameY-5);
color(4);
printf("score : ");
color(12);
printf(" %d",tetris->score);
gotoxy(FrameX+Frame_width+30,FrameY-3);
color(4);
printf("speed : ");
color(12);
printf(" %dms",tetris->speed);
}
void CleanTetris(struct Tetris *tetris)
{
for(i=0;i<4;i++)
{
b[i]=0; //数组b[4]的每个元素的值都为0
}
MakeTetris(tetris); //制作俄罗斯方块
for( i = tetris->x - 2;i <= tetris->x + 4; i+=2 ) //■X ■■ X为中心方块
{
for(j = tetris->y-2;j <= tetris->y + 1;j++) /* ■
■
X
■ */
{
if( a[i][j] == 0 && j > FrameY-9 )
{
gotoxy(i,j);
printf(" "); //清除方块
}
}
}
}
void MakeTetris(struct Tetris *tetris)
{
a[tetris->x][tetris->y]=b[0]; //中心方块位置的图形状态
switch(tetris->flag) //共7大类,19种类型
{
case 1: /*田字方块 ■■
■■ */
{
color(10);
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: /*直线方块 ■■■■*/
{
color(13);
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: /*直线方块 ■
■
■
■ */
{
color(13);
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字方块 ■■■
■ */
{
color(11);
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: /* 顺时针90°T字方块 ■
■■
■*/
{
color(11);
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: /* 顺时针180°T字方块 ■
■■■*/
{
color(11);
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: /* 顺时针270°T字方块 ■
■■
■ */
{
color(11);
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字方块 ■■
■■*/
{
color(14);
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字方块 ■
■■
■ */
{
color(14);
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字方块 ■■
■■ */
{
color(14);
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字方块 ■
■■
■ */
{
color(14);
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字方块 ■■
■
■ */
{
color(12);
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: /* 顺时针90°7字方块 ■
■■■*/
{
color(12);
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: /* 顺时针180°7字方块 ■
■
■■ */
{
color(12);
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: /* 顺时针270°7字方块 ■■■
■ */
{
color(12);
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字方块 ■■
■
■ */
{
color(12);
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: /* 顺时针转90°7字方块 ■■■
■*/
{
color(12);
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: /* 顺时针转180°7字方块 ■
■
■■ */
{
color(12);
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: /* 顺指针转270°7字方块 ■
■■■*/
{
color(12);
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 main()
{
title();
welcom();
}