代码如下~~
/*
俄罗斯方块v1.0bate2
by 千百度 2017-5-1
请调整键盘高度为最低,或设置字号为8
*/
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>
//地图范围
#define H 21
#define W 16
typedef struct
{
int x[4][4];
int y[4][4];
int type;
}TETRIS;
TETRIS t1,t2;//方块结构体
TETRIS getxy();//随机获取一组方块坐标
void loading();
void gyrate();//旋转
void remove();//消除行得分
void initmap();//初始化地图
void drawmap();//绘制地图
void move();//向下移动
void gameover();//游戏结束
void *event(void *);//按键事件,独立线程
int x1[][4][4]=
{//方块横坐标
{0,2,0,0,1,2,3,0},//T型方块
{0,0,0,0,1,2,3,4},//I
{1,2,0,0,1,2,0,0},//O
{1,2,0,0,0,2,3,0},//Z
{0,2,3,0,1,2,0,0},//S
{1,0,0,0,1,2,3,0},//J
{0,0,3,0,1,2,3,0}//L
},y1[][4][4]=
{//方块纵坐标
{0,1,0,0,2,2,2,0},//T型方块
{0,0,0,0,2,2,2,2},//I
{1,1,0,0,2,2,0,0},//O
{1,1,0,0,0,2,2,0},//Z
{0,1,1,0,2,2,0,0},//S
{1,0,0,0,2,2,2,0},//J
{0,0,1,0,2,2,2,0}//L
};
enum //DIRECTION
{
UP = '2',
DOWN = '5',
LEFT = '4',
RIGHT = '6',
PAUSE = '0'
};
//全局变量
volatile int kkk=0,kk=0,k=0,p=1,hs=0,score=0,w=4,h=4,hh,pt,t_sum[7],map[H+1][W+1],pau=1,star = 0;
//主函数
int main()
{
loading();
while (p)
{
initmap();
if (pau>0)
move();
drawmap();
usleep(500000);
clrscr();
}
}
//加载界面
void loading()
{
int k;
printf("\033[?25l"); //隐藏光标
pthread_t pid1, pid2;
do
{
k=pthread_create(&pid1, NULL, event, NULL);
}while (k);
t2=getxy();
for (int i=0;i<100;i++)
{
printf("\033[47;34m\t loading......%d%%",i);
usleep(20000);
drawmap();
clrscr();
}
t1=getxy();
star=1;
initmap();
drawmap();
printf("\033[40;32m\t按任意键开始游戏……");
getch();
clrscr();
}
//初始化地图
void initmap(void)
{
for (int i=0;i<=H;++i)//定义地图
for (int j=0;j<W;++j)
{
if ((i==H||i==0)&&j<=11)
map[i][j]=3;
else
if (j==0||j==11)
map[i][j]=2;
else
if (map[i][j]<4)
map[i][j]=0;
}
for (int i=0;i<w;i++)
for (int j=0;j<h;j++)
{
if (t1.y[i][j]!= 0&&t1.x[i][j]!= 0)
{
map[t1.y[i][j]][t1.x[i][j]]=1;
map[H][t1.x[i][j]]=11;
}
if (t2.y[i][j]!= 0&&t2.x[i][j]!= 0)
map[t2.y[i][j]][t2.x[i][j]+8]=-1;
}
}
//获取随机方块
TETRIS getxy()
{
TETRIS a;
srand(time(NULL));//初始化伪随机数生成器
int k = (double)rand()/RAND_MAX*7;
// k=1; //单个调试
a.type=k;
for (int i=0;i<h;i++)
for (int j=0;j<w;j++)
{
a.x[i][j]=x1[k][i][j];
a.y[i][j]=y1[k][i][j];
if (a.y[i][j]!= 0&&a.x[i][j]!= 0)
a.x[i][j]+=3;
}
return a;
}
/*消除判断和得分*/
void remove()
{
int k[4]={0},sum=0;
dd:int kk=0;
for (int i=hh;i>hh-4;i--)
{
k[kk++]=1;
for (int j=1;j<11;j++)
if (map[i][j]<4)
k[kk-1]=0;
}
kk=0;
for (int i=hh;i>hh-4;--i)
{
if (k[kk++]==1)
{
for (int kkk=i;kkk>1;--kkk)
{
for (int j=1;j<11;++j)
map[kkk][j]=map[kkk-1][j];
}
sum++;
hs++;
goto dd;
}
}
score+=(sum*sum*100/2);
}
//方块右移
void right()
{
for (int i=0;i<h;i++)
for (int j=0;j<w;j++)
{
if (map[t1.y[i][j]][t1.x[i][j]+1]==2||map[t1.y[i][j]][t1.x[i][j]+1]>3)
{
kk=1;
goto k2;
}
else
kk=0;
}
k2:
if (!kk)
{
for (int i=0;i<h;i++)
for (int j=0;j<w;j++)
{
if (t1.y[i][j]!= 0&&t1.x[i][j]!= 0)
t1.x[i][j]++;
}
}
k=0;
}
//方块左移
void left()
{
for (int i=0;i<h;i++)
for (int j=0;j<w;j++)
{
if (map[t1.y[i][j]][t1.x[i][j]-1]==2||map[t1.y[i][j]][t1.x[i][j]-1]>3)
{
kk=1;
goto k1;
}
else
kk=0;
}
k1:
if (!kk)
{
for (int i=0;i<h;i++)
for (int j=0;j<w;j++)
{
if (t1.y[i][j]!= 0&&t1.x[i][j]!= 0)
t1.x[i][j]--;
}
}
k=0;
}
//按键事件
void *event(void*)
{
sleep(2);
while(p)
{
usleep(10000);
while (kbhit())//判断输入,有则循环
{
clrscr();
int key = getch();//获取按键
switch(key)
{
case RIGHT:
if (pau>0)
right();
break;
case LEFT:
if (pau>0)
left();
break;
case UP:
if (pau>0)
gyrate();
k=0;
break;
case DOWN:
if (pau>0)
move();
break;
case PAUSE:
pau=-pau;
break;
}
initmap();
drawmap();
}
}
}
//方块下落
void move()
{
if (!k)
{
for (int i=0;i<h;i++)
{
for (int j=0;j<w;j++)
{
if (map[t1.y[i][j]+1][t1.x[i][j]]>=3)
{
k=1;
goto kk;
}
}
}
for (int i=0;i<h;i++)
{
for (int j=0;j<w;j++)
{
if (map[t1.y[i][j]][t1.x[i][j]]<2)
t1.y[i][j]++;
}
}
}
else
{
for (int i=0;i<h;i++)
for (int j=0;j<w;j++)
{
if (t1.y[i][j]!= 0&&t1.x[i][j]!= 0)
{
switch (t1.type)
{
case 0:
map[t1.y[i][j]][t1.x[i][j]]=4;
break;
case 1:
map[t1.y[i][j]][t1.x[i][j]]=5;
break;
case 2:
map[t1.y[i][j]][t1.x[i][j]]=6;
break;
case 3:
map[t1.y[i][j]][t1.x[i][j]]=7;
break;
case 4:
map[t1.y[i][j]][t1.x[i][j]]=8;
break;
case 5:
map[t1.y[i][j]][t1.x[i][j]]=9;
break;
case 6:
map[t1.y[i][j]][t1.x[i][j]]=10;
break;
}
hh=t1.y[i][j];
}
}
if (t1.y[1][1]-1==1)
{
gameover();
}
score+=10;
remove();
t_sum[t1.type]++;
t1=t2;
t2=getxy();
k=kk=kkk=0;
}
kk:;
}
//游戏结束
void gameover()
{
clrscr();
drawmap(); printf("游戏结束,任意键继续…\n您的分数为%d",score);
// usleep(1000000);
score=0;
getch();
for (int i=1;i<H;i++)
{
for (int j=1;j<W;j++)
map[i][j]=0;
}
}
//绘制主界面
void drawmap()
{
for (int i=0;i<=H;i++)//画地图
{
for (int j=0;j<W;j++)
{
switch(map[i][j])
{
case 0:
printf("\33[40;30m++\33[40;37m");//如果地图异常,请添加一个空格
break;
case 2:
printf("\033[40;37m│ \33[40;37m");
break;
case 3:
printf("\033[40;37m﹌\33[40;37m");
break;
case 11:
printf("\033[47;3%dm==\33[40;37m",t1.type);
break;
case 1:
printf("\033[47;3%dm■ \33[40;37m",t1.type);
break;
case -1:
printf("\033[47;3%dm■ \33[40;37m",t2.type);
break;
case 4:
printf("\033[47;30m■ \33[40;37m");
break;
case 5:
printf("\033[47;31m■ \33[40;37m");
break;
case 6:
printf("\033[47;32m■ \33[40;37m");
break;
case 7:
printf("\033[47;33m■ \33[40;37m");
break;
case 8:
printf("\033[47;34m■ \33[40;37m");
break;
case 9:
printf("\033[47;35m■ \33[40;37m");
break;
case 10:
printf("\033[47;36m■ \33[40;37m");
break;
}
}
if (i==8&&pau<0)
printf("\033[47;34m暂停中");
if (i==3)
printf("\033[43;34m 得分: \033[40;37m %d",score);
if (i==4)
printf("\033[46;34m 行数: \033[40;37m %d",hs);
if (i==5)
printf("\033[42;30m 级别: \033[40;37m 1");
if (i==0&&star)
printf("\033[47;30m 俄罗斯方块v1.2\033[40;37m");
if (i==2)
printf("\033[47;30m←下一个");
if (i==10)
printf("\033[47;30m■ T :\033[40;36m %d",t_sum[0]);
if (i==11)
printf("\033[47;31m■ I :\033[40;36m %d",t_sum[1]);
if (i==12)
printf("\033[47;32m■ O :\033[40;36m %d",t_sum[2]);
if (i==13)
printf("\033[47;33m■ Z :\033[40;36m %d",t_sum[3]);
if (i==14)
printf("\033[47;34m■ S :\033[40;36m %d",t_sum[4]);
if (i==15)
printf("\033[47;35m■ J :\033[40;36m %d",t_sum[5]);
if (i==16)
printf("\033[47;36m■ L :\033[40;36m %d",t_sum[6]);
if (i==17)
printf("\033[47;30msum: \033[40;36m %d",t_sum[0]+t_sum[1]+t_sum[2]+t_sum[3]+t_sum[4]+t_sum[5]+t_sum[6]);
if (i==19)
printf("\033[43;34m 数字键: '4'左移'6'右移 ");
if (i==20)
printf("\033[43;34m '2'旋转;'8'下落;'0'暂停");
printf("\n");
}
}
/*方块的旋转*/
void gyrate()
{
kkk++;
if (kkk>3)
kkk=0;
switch (t1.type)
{
case 0:
switch (kkk)
{
case 1:
if(!map[t1.y[1][1]+1][t1.x[1][1]])
{
t1.x[2][1]=t1.x[1][0]+1;
t1.y[2][1]=t1.y[1][0]+1;
t1.x[1][0]=t1.y[1][0]=0;
}
else kkk--;
break;
case 2:
if(!map[t1.y[1][1]][t1.x[1][1]-1])
{
t1.x[1][0]=t1.x[0][1]-1;
t1.y[1][0]=t1.y[0][1]+1;
t1.x[0][1]=t1.y[0][1]=0;
}
else kkk--;
break;
case 3:
if(!map[t1.y[1][1]][t1.x[1][1]+1])
{
t1.x[0][1]=t1.x[1][2]-1;
t1.y[0][1]=t1.y[1][2]-1;
t1.x[1][2]=t1.y[1][2]=0;
}
else kkk--;
break;
case 0:
if(!map[t1.y[1][1]][t1.x[1][1]+1])
{
t1.x[1][2]=t1.x[2][1]+1;
t1.y[1][2]=t1.y[2][1]-1;
t1.x[2][1]=t1.y[2][1]=0;
}
else kkk--;
break;
}
break;
case 1:
if (kkk>1)
kkk-=2;
switch (kkk)
{
case 1:
if (!(map[t1.y[1][1]+2][t1.x[1][1]]||map[t1.y[1][1]+1][t1.x[1][1]]))
{
t1.x[0][1]=t1.x[1][0]+1;
t1.y[0][1]=t1.y[1][0]-1;
t1.x[2][1]=t1.x[1][2]-1;
t1.y[2][1]=t1.y[1][2]+1;
t1.x[3][1]=t1.x[1][3]-2;
t1.y[3][1]=t1.y[1][3]+2;
t1.x[1][0]=t1.y[1][0]=
t1.x[1][2]=t1.y[1][2]=
t1.x[1][3]=t1.y[1][3]=0;}
else kkk--;
break;
case 0:
if (!(map[t1.y[1][1]][t1.x[1][1]-1]||map[t1.y[1][1]][t1.x[1][1]+1]||map[t1.y[1][1]][t1.x[1][1]+2]))
{
t1.x[1][0]=t1.x[0][1]-1;
t1.y[1][0]=t1.y[0][1]+1;
t1.x[1][2]=t1.x[2][1]+1;
t1.y[1][2]=t1.y[2][1]-1;
t1.x[1][3]=t1.x[3][1]+2;
t1.y[1][3]=t1.y[3][1]-2;
t1.x[0][1]=t1.y[0][1]=
t1.x[2][1]=t1.y[2][1]=
t1.x[3][1]=t1.y[3][1]=0;}
else kkk--;
break;
}
break;
case 3:
if (kkk>1)
kkk-=2;
switch (kkk)
{
case 1:
if (!map[t1.y[1][1]+1][t1.x[1][1]])
{
t1.x[0][2]=t1.x[0][0]+2;
t1.y[0][2]=t1.y[0][0];
t1.x[2][1]=t1.x[0][1];
t1.y[2][1]=t1.y[0][1]+2;
t1.x[0][0]=t1.x[0][1]=
t1.y[0][0]=t1.y[0][1]=0;
}
else kkk--;
break;
case 0:
if (!map[t1.y[1][1]-1][t1.x[1][1]-1])
{
t1.x[0][0]=t1.x[0][2]-2;
t1.y[0][0]=t1.y[0][2];
t1.x[0][1]=t1.x[2][1];
t1.y[0][1]=t1.y[2][1]-2;
t1.x[0][2]=t1.x[2][1]=
t1.y[0][2]=t1.y[0][2]=0;
}
else kkk--;
break;
}
break;
case 4:
if (kkk>1)
kkk-=2;
switch (kkk)
{
case 1:
if (!map[t1.y[1][1]+1][t1.x[1][1]])
{
t1.x[1][2]=t1.x[1][0]+2;
t1.y[1][2]=t1.y[1][0];
t1.x[2][2]=t1.x[0][2];
t1.y[2][2]=t1.y[0][2]+2;
t1.x[1][0]=t1.x[0][2]=
t1.y[1][0]=t1.y[0][2]=0;
}
else kkk--;
break;
case 0:
if (!map[t1.y[1][1]][t1.x[1][1]-1])
{
t1.x[1][0]=t1.x[1][2]-2;
t1.y[1][0]=t1.y[1][2];
t1.x[0][2]=t1.x[2][2];
t1.y[0][2]=t1.y[2][2]-2;
t1.x[1][2]=t1.x[2][2]=
t1.y[1][2]=t1.y[2][2]=0;
}
else kkk--;
break;
}
break;
case 5:
switch (kkk)
{
case 1:
if (!(map[t1.y[1][1]+1][t1.x[1][1]]||map[t1.y[1][1]+1][t1.x[1][1]+1]))
{
t1.x[0][1]=t1.x[1][0]+1;
t1.y[0][1]=t1.y[1][0]-1;
t1.x[2][1]=t1.x[1][2]-1;
t1.y[2][1]=t1.y[1][2]+1;
t1.x[0][2]=t1.x[0][0]+2;
t1.y[0][2]=t1.y[0][0];
t1.x[1][0]=t1.y[1][0]=
t1.x[1][2]=t1.y[1][2]=
t1.x[0][0]=t1.y[0][0]=0;
}
else kkk--;
break;
case 2:
if (!map[t1.y[1][1]][t1.x[1][1]-1])
{
t1.x[1][2]=t1.x[0][1]+1;
t1.y[1][2]=t1.y[0][1]+1;
t1.x[1][0]=t1.x[2][1]-1;
t1.y[1][0]=t1.y[2][1]-1;
t1.x[2][2]=t1.x[0][2];
t1.y[2][2]=t1.y[0][2]+2;
t1.x[0][1]=t1.y[0][1]=
t1.x[2][1]=t1.y[2][1]=
t1.x[0][2]=t1.y[0][2]=0;
}
else kkk--;
break;
case 3:
if (!map[t1.y[1][1]][t1.x[1][1]-1])
{
t1.x[0][1]=t1.x[1][0]+1;
t1.y[0][1]=t1.y[1][0]-1;
t1.x[2][1]=t1.x[1][2]-1;
t1.y[2][1]=t1.y[1][2]+1;
t1.x[2][0]=t1.x[2][2]-2;
t1.y[2][0]=t1.y[2][2];
t1.x[1][0]=t1.y[1][0]=
t1.x[1][2]=t1.y[1][2]=
t1.x[2][2]=t1.y[2][2]=0;
}
else kkk--;
break;
case 0:
if (!(map[t1.y[1][1]][t1.x[1][1]+1]))
{
t1.x[1][2]=t1.x[0][1]+1;
t1.y[1][2]=t1.y[0][1]+1;
t1.x[1][0]=t1.x[2][1]-1;
t1.y[1][0]=t1.y[2][1]-1;
t1.x[0][0]=t1.x[2][0];
t1.y[0][0]=t1.y[2][0]-2;
t1.x[0][1]=t1.y[0][1]=
t1.x[2][1]=t1.y[2][1]=
t1.x[2][0]=t1.y[2][0]=0;
}
else kkk--;
break;
}
break;
case 6:
switch (kkk)
{
case 1:
if (!(map[t1.y[1][1]+1][t1.x[1][1]]||map[t1.y[1][1]+1][t1.x[1][1]+1]))
{
t1.x[0][1]=t1.x[1][0]+1;
t1.y[0][1]=t1.y[1][0]-1;
t1.x[2][1]=t1.x[1][2]-1;
t1.y[2][1]=t1.y[1][2]+1;
t1.x[2][2]=t1.x[0][2];
t1.y[2][2]=t1.y[0][2]+2;
t1.x[1][0]=t1.y[1][0]=
t1.x[1][2]=t1.y[1][2]=
t1.x[0][2]=t1.y[0][2]=0;
}
else kkk--;
break;
case 2:
if (!map[t1.y[1][1]][t1.x[1][1]-1])
{
t1.x[1][2]=t1.x[0][1]+1;
t1.y[1][2]=t1.y[0][1]+1;
t1.x[1][0]=t1.x[2][1]-1;
t1.y[1][0]=t1.y[2][1]-1;
t1.x[2][0]=t1.x[2][2]-2;
t1.y[2][0]=t1.y[2][2];
t1.x[0][1]=t1.y[0][1]=
t1.x[2][1]=t1.y[2][1]=
t1.x[2][2]=t1.y[2][2]=0;
}
else kkk--;
break;
case 3:
if (!map[t1.y[1][1]+1][t1.x[1][1]])
{
t1.x[0][1]=t1.x[1][0]+1;
t1.y[0][1]=t1.y[1][0]-1;
t1.x[2][1]=t1.x[1][2]-1;
t1.y[2][1]=t1.y[1][2]+1;
t1.x[0][0]=t1.x[2][0];
t1.y[0][0]=t1.y[2][0]-2;
t1.x[1][0]=t1.y[1][0]=
t1.x[1][2]=t1.y[1][2]=
t1.x[2][0]=t1.y[2][0]=0;
}
else kkk--;
break;
case 0:
if (!(map[t1.y[1][1]][t1.x[1][1]+1]||map[t1.y[1][1]][t1.x[1][1]-1]))
{
t1.x[1][2]=t1.x[0][1]+1;
t1.y[1][2]=t1.y[0][1]+1;
t1.x[1][0]=t1.x[2][1]-1;
t1.y[1][0]=t1.y[2][1]-1;
t1.x[0][2]=t1.x[0][0]+2;
t1.y[0][2]=t1.y[0][0];
t1.x[0][1]=t1.y[0][1]=
t1.x[2][1]=t1.y[2][1]=
t1.x[0][0]=t1.y[0][0]=0;
}
else kkk--;
break;
}
break;
}
}