You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

464 lines
10 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*控制颜色*/
int color(int c)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c);
return 0;
}
/***控制文字显示位置***/
void gotoxy(int x,int y)
{
COORD pos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
/***欢迎界面上的标题***/
void title()
{
gotoxy(24,3);
printf("俄 罗 斯 方 块");
gotoxy(18,5);
printf("");
gotoxy(18,6);
printf("■■");
gotoxy(18,7);
printf("");
gotoxy(26,6);
printf("■■");
gotoxy(28,7);
printf("■■");
gotoxy(36,6);
printf("■■");
gotoxy(36,7);
printf("■■");
gotoxy(45,5);
printf("");
gotoxy(45,6);
printf("");
gotoxy(45,7);
printf("");
}
/***菜单选项***/
void welcome()
{
int i,j=1,n;
for(i=9;i<=20;i++)
{
for(j=15;j<=60;j++)
{
gotoxy(j,i);
if(i==9||i==20)
{
printf("=");
}
else if(j==15||j==59)
printf("||");
}
}
gotoxy(25,12);
printf("1.开始游戏");
gotoxy(40,12);
printf("2.按键说明");
gotoxy(25,17);
printf("3.游戏规则");
gotoxy(40,17);
printf("4.退出游戏");
gotoxy(21,22);
printf("请选择[1 2 3 4]:[ ]\b\b");
scanf("%d",&n);
switch(n)
{
case 1:
system("cls");//清屏
DrawGameframe();
Gameplay();
break;
case 2:
explation();
break;
case 3:
regulation();
break;
case 4:
close();
break;
}
}
/***制作游戏窗口***/
void DrawGameframe()
{
gotoxy(FrameX+Frame_width-7,FrameY-2);
printf("俄罗斯方块");
gotoxy(FrameX,FrameY);
printf("");
gotoxy(FrameX+2*Frame_width-2,FrameY);
printf("");
gotoxy(FrameX,FrameY+Frame_height);
printf("") ;
gotoxy(FrameX+2*Frame_width-2,FrameY+Frame_height);
printf("");
for(i=2;i<2*Frame_width-2;i+=2)
{
gotoxy(FrameX+i,FrameY);
printf("");
}
for(i=2;i<2*Frame_width-2;i+=2)
{
gotoxy(FrameX+i,FrameY+Frame_height);
printf("");
a[FrameX+i][FrameY+Frame_height] =2;
}
for(i=1;i<Frame_height;i++)
{
gotoxy(FrameX,FrameY+i);
printf("") ;
a[FrameX][FrameY+i]=2;
}
for(i=1;i<Frame_height;i++)
{
gotoxy(FrameX+2*Frame_width-2,FrameY+i);
printf("");
a[FrameX+2*Frame_width-2][FrameY+i]=2;
}
gotoxy(FrameX+2*Frame_width+3,FrameY+7);
printf("**********");
gotoxy(FrameX+2*Frame_width+3,FrameY+13);
printf("**********");
gotoxy(FrameX+2*Frame_width+13,FrameY+7);
printf("下一出现方块: ");
gotoxy(FrameX+2*Frame_width+3,FrameY+17);
printf("↑:旋转");
gotoxy(FrameX+2*Frame_width+3,FrameY+19);
printf("空格:暂停");
gotoxy(FrameX+2*Frame_width+3,FrameY+15);
printf("Esc退出游戏");
}
/***制作俄罗斯方块***/
void MakeTetris(struct Tetris *tetris)
{
a[tetris->x][tetris->y]=b[0];
switch(tetris->flag)
{
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:
{
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:
{
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:
{
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:
{
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:
{
a[tetris->x-2][tetris->y]=b[1];
a[tetris->x][tetris->y+1]=b[2];
a[tetris->x+2][tetris->y+1]=b[3];
break;
}
case 9:
{
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:
{
a[tetris->x+2][tetris->y]=b[1];
a[tetris->x][tetris->y-1]=b[2];
a[tetris->x-2][tetris->y-1]=b[3];
break;
}
case 11:
{
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 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:
{
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:
{
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:
{
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:
{
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:
{
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:
{
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:
{
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;
}
}
}
/***打印俄罗斯方块***/
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)
{
color(9);
gotoxy(i,j);
printf("");
}
}
}
/***打印菜单信息***/
gotoxy(FrameX+2*Frame_width+3,FrameY+1);
printf("level: ");
printf("%d",tetris->level);
gotoxy(FrameX+2*Frame_width+3,FrameY+3);
printf("score: ");
printf("%d",tetris->score);
gotoxy(FrameX+2*Frame_width+3,FrameY+5);
printf("speed: ");
printf("%dms",tetris->speed);
}
/***判断是否可移动***/
int ifMove(struct Tetris *tetris)
{
if(a[tetris->x][tetris->y]!=0)
{
return 0;
}
else
{
if
(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)||
(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==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 CleanTetris(struct Tetris *tetris)
{
for(i=0;i<4;i++)
{
b[i]=0;
}
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]==0&&j>FrameY)
{
gotoxy(i,j);
printf(" ");
}
}
}
}
/***判断是否满行并删除满行的方块***/
void Del_Fullline(struct Tetris *tetris)
{
int k,del_rows=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(k,j);
printf(" ");
}
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(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++;
}
}
/*随机产生序号*/
void Flag(struct Tetris *tetris)
{
tetris->number++;
srand(time(NULL));
if(tetris->number==1)
{
tetris->flag=rand()%19+1;
}
tetris->next=rand()%19+1;
}