#include<time.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
char A[4][4][7][4]={
"0000","0000","0000","0000","0000","0000","0000",
"1111","0100","0010","0110","0110","0100","0110",
"0000","0111","1110","0011","1100","1110","0110",
"0000","0000","0000","0000","0000","0000","0000"};
char E,far*q=2048+(char far*)0xB8000000;
char far*Q[250],B[256],b[256],e[256];
char C[7][4][4],D[7][4][4],Y[25];
int H[7][4][4],I[4],i[50]={4};
int G[]={1,2,3,0};
int X[]={10,1,-1,0};
int M=9,h=48,c=250,p=6;
int L,a,g,n,v,w,x,y;
int main(){
textmode(C40);
_setcursortype(_NOCURSOR);
clock_t T;
srand(time(NULL));
printf("%c[3;28f Nivel=1",27);
e[77]=1,e[75]=2,e[72]=3;
for(y=25;y--;*(q+=22)=8,*--q=219)
for(q-=81,x=10;x--;*q--=219)
*(Q[--c]=q--)=!x||y%24<1?8:0;
for(g=4;g--;h=0)
for(a=7;a--;)
for(n=0,x=y=4;y--;x=4)
while(x--) if(A[g][y][a][x]=A[G[g]][x][a][3-y]-h)
C[a][g][n++]=10*y+x;
for(a=7;a--;)
for(g=0,n=x=y=4;y--;n=x=4,g=y)
do{
while(n--&&i[I[n]]--) i[I[n]=C[a][y][n]]++;
H[a][y][--x]=h;
while(++n<4) !i[v=X[x]+C[a][g][n]]?B[h++]=v:i[v]--;
D[a][g=y][x]=h-c;
while(n) i[v=I[--n]]?b[c++]=v:i[v]++;
}while(x);
Inicio:
printf("%c[5;28fLineas=%u",27,L);
for(n=4;n--;*(q+502)=0)
if(!*Q[c=4+C[a=p][g=0][n]]) *(q=Q[c])=a+1;
else while(1) if(getch()==27) return 0;
p=rand()%7;
for(c=n=4;n--;*--q=219)
*(q=Q[C[p][0][n]]+510)=p+1;
do{
if(n<0) T=clock();
do if(E=kbhit()) E=getch();
while(!E&&clock()-T<M);
if(E==27&&getch()==E) return 0;;
if(y=(E=='-'&&M<10)-(E=='+'&&M>1))
printf("%c[3;35f%u",27,10-(M+=y));
h=H[a][g][x=e[E]];
n=y=D[a][g][x];
while(y--&&!*Q[I[y]=c+B[h]]) i[y]=c+b[h++];
if(y<0) for(x>2?g=G[g]:c+=X[x++];n--;)
*Q[i[n]]-=*Q[I[n]]=a+1;
}while(x);
for(n=4;n--;Y[y=(c+C[a][g][n])/10]++);
do while(Y[x=y]>8)
do for(L+=x==y,c=10*x--,n=9;n--;)
*Q[++c]=x?*Q[c-10]:0;
while(Y[x+1]=Y[x]);
while(Y[--y]);
goto Inicio;
}