#include <stdio.h>
#include <stdlib.h>
#include<graphics.h>
int Mark[32][13];
int flag=0;
void InitMark() /*init the cap */
{int i,j;
for(i=1;i<31;i++)
for(j=1;j<11;j++)
Mark[i][j]=0;
for(j=0;j<13;j++)
{Mark[0][j]=1;
Mark[31][j]=1;
}
for(i=1;i<31;i++)
{Mark[i][0]=1;
Mark[i][11]=1;
Mark[i][12]=0;
}
}
void Draw1(int x,int y) /*draw the long bock*/
{setfillstyle(1,2);
bar(x-9,y+1,x-1,y+9);Mark[(y-90)/10][(x-100)/10]=1;Mark[(y-90)/10][12]++;
bar(x+1,y+1,x+9,y+9);Mark[(y-90)/10][(x-90)/10]=1; Mark[(y-90)/10][12]++;
bar(x+11,y+1,x+19,y+9);Mark[(y-90)/10][(x-80)/10]=1;Mark[(y-90)/10][12]++;
bar(x+21,y+1,x+29,y+9);Mark[(y-90)/10][(x-70)/10]=1;Mark[(y-90)/10][12]++;
}
void Draw1_1(int x,int y)/*覆盖上一个长形方块*/
{setfillstyle(1,BLACK);
bar(x-9,y+1,x+29,y+10);
Mark[(y-90)/10][(x-100)/10]=0;Mark[(y-90)/10][12]--;
Mark[(y-90)/10][(x-90)/10]=0;Mark[(y-90)/10][12]--;
Mark[(y-90)/10][(x-80)/10]=0;Mark[(y-90)/10][12]--;
Mark[(y-90)/10][(x-70)/10]=0;Mark[(y-90)/10][12]--;
}
void Draw1_2(int x,int y)/*The up long Block*/
{setfillstyle(1,2);
bar(x+1,y-9,x+9,y-1);Mark[(y-100)/10][(x-90)/10]=1;Mark[(y-100)/10][12]++;
bar(x+1,y+1,x+9,y+9);Mark[(y-90)/10][(x-90)/10]=1;Mark[(y-90)/10][12]++;
bar(x+1,y+11,x+9,y+19);Mark[(y-80)/10][(x-90)/10]=1;Mark[(y-80)/10][12]++;
bar(x+1,y+21,x+9,y+29);Mark[(y-70)/10][(x-90)/10]=1;Mark[(y-70)/10][12]++;
}
void Draw1_3(int x,int y) /*cover the Long Block*/
{setfillstyle(1,BLACK);
bar(x+1,y-9,x+9,y+29);
Mark[(y-100)/10][(x-90)/10]=0;Mark[(y-100)/10][12]--;
Mark[(y-90)/10][(x-90)/10]=0;Mark[(y-90)/10][12]--;
Mark[(y-80)/10][(x-90)/10]=0;Mark[(y-80)/10][12]--;
Mark[(y-70)/10][(x-90)/10]=0;Mark[(y-70)/10][12]--;
}
void Draw2(int x,int y) /*draw the Tian bock*/
{setfillstyle(1,3);
bar(x-9,y+1,x-1,y+9);Mark[(y-90)/10][(x-100)/10]=1;Mark[(y-90)/10][12]++;
bar(x+1,y+1,x+9,y+9);Mark[(y-90)/10][(x-90)/10]=1; Mark[(y-90)/10][12]++;
bar(x-9,y+11,x-1,y+19);Mark[(y-80)/10][(x-100)/10]=1;Mark[(y-80)/10][12]++;
bar(x+1,y+11,x+9,y+19);Mark[(y-80)/10][(x-90)/10]=1;Mark[(y-80)/10][12]++;
}
void Draw2_1(int x,int y) /*cover the Tian bock*/
{setfillstyle(1,BLACK);
bar(x-9,y+1,x+9,y+19);
Mark[(y-90)/10][(x-100)/10]=0;Mark[(y-90)/10][12]--;
Mark[(y-90)/10][(x-90)/10]=0; Mark[(y-90)/10][12]--;
Mark[(y-80)/10][(x-100)/10]=0;Mark[(y-80)/10][12]--;
Mark[(y-80)/10][(x-90)/10]=0;Mark[(y-80)/10][12]--;
}
void Draw3(int x,int y)
{setfillstyle(1,4);
bar(x-9,y+1,x-1,y+9);Mark[(y-90)/10][(x-100)/10]=1;Mark[(y-90)/10][12]++;
bar(x+1,y+1,x+9,y+9);Mark[(y-90)/10][(x-90)/10]=1; Mark[(y-90)/10][12]++;
bar(x+1,y+11,x+9,y+9);Mark[(y-80)/10][(x-90)/10]=1;Mark[(y-80)/10][12]++;
bar(x+11,y+11,x+19,y+19);Mark[(y-80)/10][(x-80)/10]=1;Mark[(y-90)/10][12]++;
}
void Draw3_1(int x,int y)
{setfillstyle(1,BLACK);
bar(x-10,y,x+10,y+10);
Mark[(y-90)/10][(x-100)/10]=0;Mark[(y-90)/10][12]--;
Mark[(y-90)/10][(x-90)/10]=0; Mark[(y-90)/10][12]--;
bar(x,y+10,x+20,y+20);
Mark[(y-80)/10][(x-90)/10]=0;Mark[(y-80)/10][12]--;
Mark[(y-80)/10][(x-80)/10]=0;Mark[(y-90)/10][12]--;
}
void Screen()
{
rectangle(100,100,200,400);
rectangle(250,150,300,200);
}
int Block()
{int i,j;
i=flag;
flag=random(3);
switch(flag)
{case 0:setfillstyle(1,BLACK);
bar(251,151,299,199);
setfillstyle(1,RED);
bar(256,171,264,179);
bar(266,171,274,179);
bar(276,171,284,179);
bar(286,171,294,179);
break;
case 1:setfillstyle(1,BLACK);
bar(251,151,299,199);
setfillstyle(1,RED);
bar(271,156,279,164);
bar(271,166,279,174);
bar(271,176,279,184);
bar(271,186,279,194);
break;
case 2:setfillstyle(1,BLACK);
bar(251,151,299,199);
setfillstyle(1,RED);
bar(266,156,274,164);
bar(276,156,284,164);
bar(266,166,274,174);
bar(276,166,284,174);
break;
}
return i;
}
int Control(int CH,int x,int y)
{int key;
switch(CH)
{case 0:/*对平放长操作*/
Draw1(x,y);
while(Mark[(y-80)/10][(x-100)/10]==0&&Mark[(y-80)/10][(x-90)/10]==0&&Mark[(y-80)/10][(x-80)/10]==0&&Mark[(y-80)/10][(x-70)/10]==0)
{
if(kbhit())
{key=getch();
if(key==75&&Mark[(y-90)/10][(x-110)/10]==0) {Draw1_1(x,y);x-=10;Draw1(x,y);}
else if(key==77&&Mark[(y-90)/10][(x-60)/10]==0) {Draw1_1(x,y);x+=10;Draw1(x,y);}
else if(key==32&&Mark[(y-100)/10][(x-90)/10]==0&&Mark[(y-80)/10][(x-90)/10]==0&&Mark[(y-70)/10][(x-90)/10]==0) {Draw1_1(x,y);Control(1,x,y);break;}
else if(key==80&&Mark[(y-80)/10][(x-100)/10]==0&&Mark[(y-80)/10][(x-90)/10]==0&&Mark[(y-80)/10][(x-80)/10]==0&&Mark[(y-80)/10][(x-70)/10]==0)
{Draw1_1(x,y);
while(Mark[(y-80)/10][(x-100)/10]==0&&Mark[(y-80)/10][(x-90)/10]==0&&Mark[(y-80)/10][(x-80)/10]==0&&Mark[(y-80)/10][(x-70)/10]==0)
{y+=10;
}
Draw1(x,y);
break;
}
else if(key==27){return 27;}
}
Draw1_1(x,y);
y+=10;
Draw1(x,y);
delay(10000000000);
}
break;
case 1: /*对竖放长操作*/
Draw1_2(x,y);
while(Mark[(y-60)/10][(x-90)/10]==0)
{
if(kbhit())
{key=getch();
if(key==75&&Mark[(y-100)/10][(x-100)/10]==0&&Mark[(y-90)/10][(x-100)/10]==0&&Mark[(y-80)/10][(x-100)]==0&&Mark[(y-70)/10][(x-100)/10]==0)
{Draw1_3(x,y);x-=10;Draw1_2(x,y);}
else if(key==77&&Mark[(y-100)/10][(x-80)/10]==0&&Mark[(y-90)/10][(x-80)/10]==0&&Mark[(y-80)/10][(x-80)/10]==0&&Mark[(y-70)/10][(x-80)/10]==0)
{Draw1_3(x,y);x+=10;Draw1_2(x,y);}
else if(key==32&&Mark[(y-90)/10][(x-100)/10]==0&&Mark[(y-90)/10][(x-80)/10]==0&&Mark[(y-70)/10][(x-70)/10]==0) {Draw1_3(x,y);Control(0,x,y);break;}
else if(key==80&&Mark[(y-60)/10][(x-90)/10]==0)
{Draw1_3(x,y);
while(Mark[(y-60)/10][(x-90)/10]==0)
{y+=10;
}
Draw1_2(x,y);
break;
}
else if(key==27) {return 27;}
}
Draw1_3(x,y);/*cover the before Up Block*/
y+=10;
Draw1_2(x,y);
delay(10000000000);
}
break;
case 2:Draw2(x,y);/*对田方处理*/
while(Mark[(y-70)/10][(x-90)/10]==0&&Mark[(y-70)/10][(x-100)/10]==0)
{
if(kbhit())
{key=getch();
if(key==75&&Mark[(y-90)/10][(x-110)/10]==0&&Mark[(y-80)/10][(x-110)/10]==0) {Draw2_1(x,y);x-=10;Draw2(x,y);}
else if(key==77&&Mark[(y-90)/10][(x-80)/10]==0&&Mark[(y-80)/10][(x-80)/10]==0) {Draw2_1(x,y);x+=10;Draw2(x,y);}
else if(key==80&&Mark[(y-70)/10][(x-100)/10]==0&&Mark[(y-70)/10][(x-90)/10]==0)
{Draw2_1(x,y);
while(Mark[(y-70)/10][(x-90)/10]==0&&Mark[(y-70)/10][(x-100)/10]==0)
{y+=10;
}
Draw2(x,y);
break;
}
else if(key==27){return 27;}
}
Draw2_1(x,y);
y+=10;
Draw2(x,y);
delay(10000000000);
}
break;
case 3:Draw3(x,y); /*left Tian design*/
while(Mark[(y-70)/10][(x-90)/10]==0&&Mark[(y-70)/10][(x-80)/10]==0&&Mark[(y-80)/10][(x-100)/10]==0)
{
if(kbhit())
{key=getch();
if(key==75&&Mark[(y-90)/10][(x-110)/10]==0&&Mark[(y-80)/10][(x-100)/10]==0) {Draw3_1(x,y);x-=10;Draw3(x,y);}
else if(key==77&&Mark[(y-90)/10][(x-80)/10]==0&&Mark[(y-80)/10][(x-70)/10]==0) {Draw3_1(x,y);x+=10;Draw3(x,y);}
else if(key==32&&Mark[(y-90)/10][(x-110)/10]==0&&Mark[(y-80)/10][(x-90)/10]==0&&Mark[(y-70)/10][(x-90)/10]==0) {Draw3_1(x,y);Control(4,x,y);break;}
else if(key==80&&Mark[(y-80)/10][(x-100)/10]==0&&Mark[(y-80)/10][(x-90)/10]==0&&Mark[(y-80)/10][(x-80)/10]==0&&Mark[(y-80)/10][(x-70)/10]==0)
{Draw1_1(x,y);
while(Mark[(y-80)/10][(x-100)/10]==0&&Mark[(y-80)/10][(x-90)/10]==0&&Mark[(y-80)/10][(x-80)/10]==0&&Mark[(y-80)/10][(x-70)/10]==0)
{y+=10;
}
Draw1(x,y);
break;
}
else if(key==27){return 27;}
}
Draw1_1(x,y);
y+=10;
Draw1(x,y);
delay(10000000000);
}
break;
case 4:break;
case 5:break;
case 6:break;
}
}
void Delete()
{int y,y1,x;
for(y=1;y<=30;y++)
{if(Mark[y][12]==10)
{for(y1=y;y1>1;y1--)
Mark[y1][12]=Mark[y1-1][12];
Mark[1][12]=0;
for(y1=y;y1>1;y1--)
for(x=1;x<=10;x++)
Mark[y1][x]=Mark[y1-1][x];
for(x=1;x<=10;x++)
Mark[1][x]=0;
setfillstyle(1,BLACK);
bar(101,101,199,399);
for(y1=1;y1<=30;y1++)
for(x=1;x<=10;x++)
if(Mark[y1][x]==1)
{setfillstyle(1,2);
bar(x*10+91,y1*10+91,x*10+99,y1*10+99);
}
}
}
}
int Gameover()
{if(Mark[1][12]>=1&&Mark[2][12]>=1&&Mark[3][12]>=1&&Mark[4][12]>=1&&Mark[5][12]>=1) return 1;
else return 0;
}
void main()
{ int gd,gm,CH,NC,OFF=0;
gd=DETECT;
initgraph(&gd,&gm,"");
randomize();
InitMark();
NC=0;
Screen(); /*屏幕设置*/
flag=random(3);
while(1)
{
CH=Block();
NC=Control(CH,140,110); /*控制图形函数*/
if(NC==27) break;
Delete();
OFF=Gameover();
if(OFF) break;
}
getch();
cleardevice();
closegraph();
}