#include <stdio.h>
#include <windows.h>
#include <conio.h>
#include <time.h>
#define FrameX 13 //游戏窗口左上角x坐标为13
#define FrameY 3 //y坐标为3
#define Frame_height 20 //游戏窗口高度为20
#define Frame_width 18 //宽度为18
int i,j,Temp,Temp1,Temp2;
int a[80][80]={}; //在二维图中对应位置的值为0表示没有方块,对应位置为1表示有方块,2表示为边界
int b[4]; //标记4个“口”方块,1表示有方块,0表示没方块
struct Tetris{ //声明俄罗斯方块的结构体
int x; //中心方块x坐标
int y; //中心方块y坐标
int flag; //标记方块类型的序号
int next; //下一个俄罗斯方块的序号
int speed; //俄罗斯方块移动的速度
int number; //产生俄罗斯方块的个数
int score; //游戏的分数
int level; //游戏的等级
};
HANDLE hOut; //控制台句柄
void gotoxy(int x,int y); //光标跳转到(x,y)处
void DrwaGameframe(); //“画”出游戏界面的框架
void DrwaGameframe2(); //“画”出方向紊乱版的游戏界面框架
void Flag(struct Tetris *); //随机生成一个方块的类型
void MakeTetris(struct Tetris *); //制作方块
void PrintTetris(struct Tetris *); //"画"出方块
void CleanTetris(struct Tetris *); //清除方块的轨迹
int ifMove(struct Tetris *);//若是方块可以移动则返回值为1;否则为0
void Del_Fullline(struct Tetris *);//判断是否满行并删除满行的方块
void Gameplay(); //开始游戏
void Gameplay2(); //开始方向紊乱版游戏
void regulation(); //游戏规则
void explation(); //按键说明
void welcom(); //连接众多函数
void Replay(struct Tetris *tetris); //重开
void title(); //制作标题
void flower(); //装饰花
void close(); //结束游戏
BOOL SetConsoleTextAttribute(HANDLE consolehwnd,WORD wAttributes);
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(){
color(15);
gotoxy(24,3);
printf("趣味俄罗斯方块\n");
color(11);
gotoxy(18,5);
printf("■");
gotoxy(18,6);
printf("■■");
gotoxy(18,7);
printf("■");
color(14);
gotoxy(26,6);
printf("■■");
gotoxy(28,7);
printf("■■");
color(10);
gotoxy(36,6);
printf("■■");
gotoxy(36,7);
printf("■■");
color(13);
gotoxy(45,5);
printf("■");
gotoxy(45,6);
printf("■");
gotoxy(45,7);
printf("■");
gotoxy(45,8);
printf("■");
color(12);
gotoxy(56,6);
printf("■");
gotoxy(52,7);
printf("■■■");
}
int main(){
title();
flower();
welcom();
}
void flower(){
gotoxy(66,11);
color(12);
printf("(_)");
gotoxy(64,12);
printf("(_)");
gotoxy(68,12);
printf("(_)");
gotoxy(66,13);
printf("(_)");
gotoxy(67,12);
color(6);
printf("@");
gotoxy(72,10);
color(13);
printf("(_)");
gotoxy(76,10);
printf("(_)");
gotoxy(74,9);
printf("(_)");
gotoxy(74,11);
printf("(_)");
gotoxy(75,10);
color(6);
printf("@");
gotoxy(71,12);
printf("|");
gotoxy(72,11);
printf("/");
gotoxy(70,13);
printf("\\|");
gotoxy(70,14);
printf("`|/");
gotoxy(70,15);
printf("\\|");
gotoxy(71,16);
printf("|/");
gotoxy(71,17);
printf("|");
gotoxy(67,17);
color(10);
printf("\\\\\\\\");
gotoxy(73,17);
printf("//");
gotoxy(67,18);
color(2);
printf("^^^^^^^^");
gotoxy(65,19);
color(5);
printf("XXXXXX"); //所属单位落款
gotoxy(68,20);
printf("XXX"); //姓名
}
void welcom(){ // 程序的重要枢纽
int n;
int i,j=1;
color(14);
for(int i=9;i<=20;i++){
for(int j=15;j<=60;j++){
gotoxy(j,i);
if(i==9||i==20)printf("=");
else if(j==15||j==59)printf("||");
}
}
color(12);
gotoxy(25,11);
printf("1.开始游戏");
gotoxy(40,11);
printf("2.按键说明");
gotoxy(25,14);
printf("3.游戏规则");
gotoxy(40,14);
printf("4.退出");
gotoxy(25,17);
printf("5.(特色)紊乱模式");
gotoxy(21,22);
color(3);
printf("请选择[1 2 3 4]:[ ]\b\b");
color(14);
scanf("%d",&n);
switch(n){
case 1:system("cls");DrwaGameframe();Gameplay();break; //清屏
case 2:explation();break;
case 3:regulation();break;
case 4:close();break;
case 5:system("cls");DrwaGameframe2();Gameplay2();break;
}
}
void DrwaGameframe(){
gotoxy(FrameX+Frame_width-7,FrameY-2);
color(11);
printf("趣味俄罗斯方块");
gotoxy(FrameX+2*Frame_width+3,FrameY+7);
color(2);
printf("**********");
gotoxy(FrameX+2*Frame_width+13,FrameY+7);
color(3);
printf("下一个出现方块:");
gotoxy(FrameX+2*Frame_width+3,FrameY+13);
color(2);
printf("**********");
gotoxy(FrameX+2*Frame_width+3,FrameY+17);
color(14);
printf("↑键:旋转");
gotoxy(FrameX+2*Frame_width+3,FrameY+19);
printf("空格:暂停游戏");
gotoxy(FrameX+2*Frame_width+3,FrameY+15);
printf("Esc:退出游戏");
gotoxy(FrameX+2*Frame_width+20,FrameY+15);
printf("↓:加速下落");
gotoxy(FrameX,FrameY);
color(12);
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(int i=2;i<2*Frame_width-2;i+=2){
gotoxy(FrameX+i,FrameY);
printf("═");
}
for(int i=2;i<2*Frame_width-2;i+=2){
gotoxy(FrameX+i,FrameY+Frame_height);
printf("═");
a[FrameX+i][FrameY+Frame_height]=2;
}
for(int i=1;i<Frame_height;i++){
gotoxy(FrameX,FrameY+i);
printf("║");
a[FrameX][FrameY+i]=2;
}
for(int i=1;i<Frame_height;i++){
gotoxy(FrameX+2*Frame_width-2,FrameY+i);
printf("║");
a[FrameX+2*Frame_width-2][FrameY+i]=2;
a[FrameX][FrameY+i]=2;
a[FrameX+i][FrameY+Frame_height]=2;
}
}
void DrwaGameframe2(){
gotoxy(FrameX+Frame_width-7,FrameY-2);
color(11);
printf("趣味俄罗斯方块");
gotoxy(FrameX+2*Frame_width+3,FrameY+7);
color(2);
printf("**********");
gotoxy(FrameX+2*Frame_width+13,FrameY+7);
color(3);
printf("下一个出现方块:");
gotoxy(FrameX+2*Frame_width+3,FrameY+13);
color(2);
printf("**********");
gotoxy(FrameX+2*Frame_width+3,FrameY+17);
color(14);
printf("↓键:旋转");
gotoxy(FrameX+2*Frame_width+3,FrameY+19);
printf("空格:暂停游戏");
gotoxy(FrameX+2*Frame_width+3,FrameY+15);
printf("Esc:退出游戏");
gotoxy(FrameX+2*Frame_width+20,FrameY+15);
printf("↑:加速下落");
gotoxy(FrameX+2*Frame_width+20,FrameY+17);
printf("←:方块向右移动");
gotoxy(FrameX+2*Frame_width+20,FrameY+19);
printf("→:方块向左移动");
gotoxy(FrameX,FrameY);
color(12);
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(int i=2;i<2*Frame_width-2;i+=2){
gotoxy(FrameX+i,FrameY);
printf("═");
}
for(int i=2;i<2*Frame_width-2;i+=2){
gotoxy(FrameX+i,FrameY+Frame_height);
printf("═");
a[FrameX+i][FrameY+Frame_height]=2;
}
for(int i=1;i<Frame_height;i++){
gotoxy(FrameX,FrameY+i);
printf("║");
a[FrameX][FrameY+i]=2;
}
for(int i=1;i<Frame_height;i++){
gotoxy(FrameX+2*Frame_width-2,FrameY+i);
printf("║");
a[FrameX+2*Frame_width-2][FrameY+i]=2;
a[FrameX][FrameY+i]=2;
a[FrameX+i][FrameY+Frame_height]=2;
}
}
void MakeTetris(struct Tetris *tetris){
a[tetris->x][tetris->y]=b[0];
switch(tetris->flag){
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
color(9);
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:
color(9);
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:
color(9);
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:
color(9);
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(int 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){
gotoxy(i,j);
printf("■");
}
}
}
//打印菜单信息
gotoxy(FrameX+2*Frame_width+3,FrameY+1);
color(4);
printf("level : ");
color(12);
printf(" %d",tetris->level);
gotoxy(FrameX+2*Frame_width+3,FrameY+3);
color(4);
printf("score : ");
color(12);
printf(" %d",tetris->score);
gotoxy(FrameX+Frame_width*2+3,FrameY+5);
color(4);
printf("speed : ");
color(12);
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==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&&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(int i=0;i<4;i++){
b[i]=0;
}
MakeTetris(tetris);
for(int i=tetris->x-2;i<=tetris->x+4;i+=2){
for(int j=tetris->y-2;j<=tetris->y+1;j++){
if(a[i][j]==0&&j>FrameY){
color(0);
gotoxy(i,j);
printf(" ");
}
}
}
}
/*
判断是否满行并删除满行的俄罗斯方块
*/
void Del_Fullline(struct Tetris *tetris){ //当某行有Frame_width-2个方块时,则满行消除
int k,del_rows=0; //分别记录某行方块个数和删除方块的行数
for(int j=FrameY+Frame_height-1;j>=FrameY+1;j--){
k=0;
for(int 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<Frame_width*2-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+=del_rows*100;
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;
}
/*
开始游戏
*/
void Gameplay(){
int n;
struct Tetris t,*tetris=&t;
char ch;
tetris->number=0;
tetris->speed=250;
tetris->score=0;
tetris->level=1;
while(1){
int Speed=tetris->speed;
int speedsign=0;
Flag(tetris);
tetris->y+=2;
Temp=tetris->flag;
tetris->x=FrameX+2*Frame_width+6;
tetris->y=FrameY+10;
tetris->flag=tetris->next;
PrintTetris(tetris);
tetris->x=FrameX+Frame_width;
tetris->y=FrameY-1;
tetris->flag=Temp;
while(1){
label:PrintTetris(tetris);
Sleep(tetris->speed); //等待tetris->speed 毫秒后再运行下一步,因此speed越小,方块下降的越快
CleanTetris(tetris); //清除轨迹
Temp1=tetris->x;
Temp2=tetris->flag;
if(kbhit()){
ch=getch();
if(ch==75)tetris->x-=2;//按“←”键则向左动,中心坐标减2
if(ch==77)tetris->x+=2;//按“→”键则向右动,中心坐标加2
if(ch==80){
//if(ifMove(tetris)!=0&&ifMove(tetris2)!=0)tetris->y+=2;
//if(ifMove(tetris)==0)tetris->y=FrameY+Frame_height-2;
if(tetris->speed>50)tetris->speed=50;
speedsign=1;
}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;
}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->speed=Speed;
tetris->y--;
PrintTetris(tetris);
Del_Fullline(tetris);
break;
}
}
for(int i=tetris->y-2;i<tetris->y+2;i++){
if(i==FrameY){
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+2*Frame_width+6;
tetris->y=FrameY+10;
CleanTetris(tetris);
}
}
/*
混乱模式
*/
void Gameplay2(){
int n;
struct Tetris t,*tetris=&t;
char ch;
tetris->number=0;
tetris->speed=250;
tetris->score=0;
tetris->level=1;
while(1){
int Speed=tetris->speed;
int speedsign=0;
Flag(tetris);
tetris->y+=2;
Temp=tetris->flag;
tetris->x=FrameX+2*Frame_width+6;
tetris->y=FrameY+10;
tetris->flag=tetris->next;
PrintTetris(tetris);
tetris->x=FrameX+Frame_width;
tetris->y=FrameY-1;
tetris->flag=Temp;
while(1){
label:PrintTetris(tetris);
Sleep(tetris->speed); //等待tetris->speed 毫秒后再运行下一步,因此speed越小,方块下降的越快
CleanTetris(tetris); //清除轨迹
Temp1=tetris->x;
Temp2=tetris->flag;
if(kbhit()){
ch=getch();
if(ch==77)tetris->x-=2;//按“→”键则向左动,中心坐标减2
if(ch==75)tetris->x+=2;//按“←”键则向右动,中心坐标加2
if(ch==72){
//if(ifMove(tetris)!=0&&ifMove(tetris2)!=0)tetris->y+=2;
//if(ifMove(tetris)==0)tetris->y=FrameY+Frame_height-2;
if(tetris->speed>50)tetris->speed=50;
speedsign=1;
}if(ch==80){ //↑键顺时针转动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;
}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->speed=Speed;
tetris->y--;
PrintTetris(tetris);
Del_Fullline(tetris);
break;
}
}
for(int i=tetris->y-2;i<tetris->y+2;i++){
if(i==FrameY){
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+2*Frame_width+6;
tetris->y=FrameY+10;
CleanTetris(tetris);
}
}
/*
重新开始游戏
*/
void Replay(struct Tetris *tetris){
system("cls");
memset(a,0,6400*sizeof(int)); //初始化BOX数组,否则不会正常显示方块,导致游戏直接结束
DrwaGameframe();
Gameplay();
}
void explation (){
int i,j=1;
system("cls");
color(13);
gotoxy(32,3);
printf("按键说明");
color(2);
for(i=6;i<=16;i++){
for(j=15;j<=60;j++){
gotoxy(j,i);
if(i==6||i==16)printf("=");
else if(j==15||j==59)printf("||");
}
}
color(3);
gotoxy(18,7);
printf("tip1:玩家可以通过 ← → 方向按键来移动方块");
color(10);
gotoxy(18,9);
printf("tip2:通过↑键使方块旋转");
color(14);
gotoxy(18,11);
printf("tip3:通过↓键加速方块下落");
color(11);
gotoxy(18,13);
printf("tip4:按空格键暂停游戏,再按空格键继续");
color(4);
gotoxy(18,15);
printf("tip5:按Esc退出游戏");
getch();
system("cls");
main();
}
void regulation(){
int i,j=1;
system("cls");
color(13);
gotoxy(34,3);
printf("游戏规则");
color(2);
for(i=6;i<=18;i++){
for(j=12;j<=70;j++){
gotoxy(j,i);
if(i==6||i==18)printf("=");
else if(j==12||j==69)printf("||");
}
}
color(12);
gotoxy(16,7);
printf("tip1:不同形状的小方块从屏幕上方落下,玩家通过调整");
gotoxy(22,9);
printf("方块的位置和方向,使它们在屏幕底部拼出完整的");
gotoxy(22,11);
printf("一条或几条");
color(14);
gotoxy(16,13);
printf("tip2:每消除一行,积分涨100");
color(11);
gotoxy(16,15);
printf("tip3:每积累1000分,会提升一个等级");
color(10);
gotoxy(16,17);
printf("tip4:提升等级会使方块下落速度明显加快,游戏难度加大");
getch();
system("cls");
welcom();
}
void close(){
exit(0);
}
俄罗斯方块+方向键特色版(C语言)
最新推荐文章于 2023-01-07 15:31:38 发布