/*控制颜色*/ 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;ix][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;iFrameY;k--) { for(i=FrameX+2;iscore+=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; }