#include<time.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
char A[4][4][7][5]={
" "," "," "," "," "," "," ",
" "," 1 "," 1 "," 11 "," 11 "," 1 "," 11 ",
"1111"," 111","111 "," 11","11 ","111 "," 11 "};
int B[]={40,41,42,43,44,45,46,41,47};
int C[8][4][4],D[280],Q[280];
int Y[28],e[256],i[4];
int I[]={0,77,75,72};
int G[4]={1,2,3};
int X[4]={10,1,-1};
int N=9,c=279,g=2030;
int L,E,a,n,p,x,y;
void pieza(int f,int F){
if(!f) return;
printf("%c[%i;%if",27,f/80,f%80);
printf("%c[37;%im ",27,B[F]);
printf("%c[H%c[0m",27,27);
}
int main(){
clock_t T;
srand(time(NULL));
printf("%c[2J",27);
for(y=25;y--;pieza(g+20,8),g-=60)
for(x=10;x--;Q[c--]=g-=2)
if(!x||y>23) pieza(g-2,D[c]=8);
for(g=4;g--;e[I[g]]=g)
for(a=7;a--;n=0)
for(y=4;y--;)
for(x=4;x--;)
if(A[g][y][a][x]=A[G[g]][x][a][3-y]%8)
C[a+1][g][n++]=10*y+x;
D[20]=p=rand()%7+1;
Inicio:
c=14;
for(n=4;n--&&!D[I[n]=C[p][0][n]+c]--;)
pieza(Q[I[n]],a=p),
pieza(Q[n],g=0);
while(n>=0) if(getch()==27) return 0;
p=rand()%7+1;
for(n=4;n--;)
pieza(Q[n]=Q[C[p][0][n]+20]+348,p);
Rutina:
if(n<0) T=clock();
do if(E=kbhit()) E=getch();
while(!E&&clock()-T<N);
if(E==27&&getch()==E) return 0;
if(n=(E=='-'&&N<10)-(E=='+'&&N>1))
printf("%c[2;39fNivel=%i",27,10-(N+=n));
if(x=X[e[E]]) y=g;
else y=G[g];
for(n=4;n--&&D[i[n]=C[a][y][n]+c+x]<1;);
if(n<0){
for(n=4;n--;)
if(!D[i[n]]--) pieza(Q[i[n]],a);
for(n=4;n--;I[n]=i[n])
if(!++D[I[n]]) pieza(Q[I[n]],0);
if(x) c+=x--;
else g=y;
}
if(x<10) goto Rutina;
for(n=4;n--;L+=g)
if(g=++Y[y=I[n]/10]>8)
do for(c=10*y+9,x=9;x--;)
pieza(Q[c--],D[c]=D[c-10]);
while(Y[y--]=Y[y-1]);
else D[I[n]]=a;
printf("%c[3;38fLineas=%i",27,L);
goto Inicio;
}