#include<time.h>
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int main()
{
clock_t T;
srand(time(NULL));
textmode(C40);
_setcursortype(_NOCURSOR);
char far*p=(char far*) 0xB8000000L;
char E,A[][12]={"000000111100",
"000020222000",
"000300033300",
"000400444000",
"000055055000",
"006600066000",
"000770077000"};
int B[]={6,2,10,7,3,0,11,8,4,1,9,5};
int N[]={1,2,11,12,13,14,22,23,24,25,34,35};
int C[12],D[12],Y[25],I[275],i[275];
int a,c,d=0,n,x,y,z=6,M=9,L=0;
printf("%c[3;29f Nivel=1",27);
for(y=0;y<25;y++)
for(Y[y]=x=0;x<11;x++,d++){i[d]=80*y+2*x+29;
I[d]=*(p+i[d])=8*(!y||y>23||!x||x>9);
*(p+i[d]-1)=219;
}
Inicio:
a=z;
z=rand()%7;
for(n=12;n--;)
*(p+N[n]/11*80+N[n]%11*2+621)=(A[z][n]-48)*16;
printf("%c[5;29fLineas=%u",27,L);
c=15;
for(n=12;n--;)
if(C[n]=A[a][n]-48)
if(!I[N[n]+c]) *(p+i[N[n]+c])=C[n];
else while(1) if(getch()==27) return 0;
T=clock();
while(n<0){while(E=kbhit()) getch();
do if(kbhit()) E=getch();
while(!E&&clock()-T<M);
if(E==27&&getch()==27) return 0;
if(E=='-') printf("%c[3;36f%u",27,10-(M+=M<10));
if(E=='+') printf("%c[3;36f%u",27,10-(M-=M>1));
while(++n<12)
if(C[n]) I[N[n]+c]=*(p+i[N[n]+c])=0;
if(E==72){while(n--)
if(D[n]=C[B[n]])
if(I[N[n]+c]) break;
if(n<0)
for(n=12;n--;)
if(C[n]=D[n]) I[N[n]+c]=*(p+i[N[n]+c])=C[n];
}
else{if(E==77||E==75) d=c+E-76;
else d=c+(E=11);
while(n--)
if(C[n])
if(I[N[n]+d]) break;
if(n<0)
for(c=d,n=12;n--;)
if(C[n]) I[N[n]+c]=*(p+i[N[n]+c])=C[n];
}
if(n>=0)
for(n=0;n<12;n++)
if(C[n]) I[N[n]+c]=*(p+i[N[n]+c])=C[n];
if(E==11) T=clock();
else n=-1;
}
for(y=c/11;y<c/11+4;y++)
if(y>23) break;
else for(d=11*y+1,Y[y]=n=0,x=9;x--;d++)
if(I[d])
if(++n<9) Y[y]=1;
else for(L++,Y[y]=0;n--;d--)
I[d]=*(p+i[d])=0;
while(--y)
if(!Y[d=y])
while(--d)
if(Y[d]){Y[d]=0;
n=11*d+1;
d=11*y+1;
for(x=9;x--;d++,n++)
if(I[n]){I[d]=I[n];
*(p+i[d])=*(p+i[n]);
I[n]=*(p+i[n])=0;
}
Y[y]=d=1;
}
goto Inicio;
}