#include<dos.h>
#include<time.h>
#include<stdio.h>
#include<conio.h>
char pieza[][16]={
" 222222 ",
" 2222222222 ",
" 222222222222 ",
" 22222222222222 ",
" 22222222222222 ",
"2222222222222222",
"2222222222222222",
"2222222222222222"};
char E,far*Q[64],far*q=(char far*)0xA0000000;
char B[12][25],H[337];
char D[40][25],N[336][7]; //Origen,direccion=Destino
char L[40][12],J[12][12]; //Control de jugadas
char M[40][12],m[12][12]; //Secuencia
int S[][2]={0,7,0,4,0,1}; //Color
int K[]={2,2},X[]={26,30,37,41}; //Tabulacion
int ix[]={0,1,1,1,0,-1,-1,-1};
int iy[]={1,1,0,-1,-1,-1,0,1,};
int A[12],C[12],V[12],W[12];
int R[64],T[64],G[64][8]; //Alcance
int i[484],l[40],p[242];
int c=64,y=57595,ply=3;
int d,g,j,n,t,v,w,x;
void Borrar(F){
for(v=F;v--;)
for(n=w=F<11?!v:0;w<3-n*t;w++)
printf("%c[%u;%uf%*c",27,2*v+4,X[w],X[w+1]-X[w]-1,32);
}
void Figura(F,F1,F2){
S[F1][0]=S[2][0]=F2;
for(n=242;n--;)
*(Q[F]+i[n])=*(Q[F]+i[483-n])=S[F1][p[n]];
}
void Total(F,F1){
gotoxy(v=F1%2*11+26,F1/2*2+4);
if(g>ply) gotoxy(v,w=2*g+6-(ply+!t)/2*2),
F1=!t;
else w=(g-!t)/2*2+4;
if(!j) printf("%3u",K[t]),
printf("%c[%u;%uf%3u",27,4,37-11*t,K[!t]);
else if(K[0]+K[1]+y<64) printf("%3u",F);
if(c--) printf("%c[%u;%uf%c%u",27,w,34-F1%2*4,c%8+97,c/8+1);
}
int main(){
_AX=0x13;
geninterrupt(0x10);
time_t ti;
printf("%c[2;26fBlancas Rojas ",27);
for(v=12;v--;y-=5000,w=v%2,V[v]=!w-w,W[v]=64*w)
for(w=3;w--;y=x){
if(!v&&w) x=1219;
else x=5120*v+8*X[w]+947;
for(n=y+1-x;n--;*(q+x+n)=*(q+x+n+5120)=7);
for(n=16;n--;*(q+x+320*n)=*(q+y+320*n)=7);
}
for(v=484;v--;i[v]=320*y+v%22)
if((y=v/22)>2&&y<11&&(x=v%22)>2&&x<19)
if(n=pieza[y-3][x-3]-32) p[v]=n-17;
for(y=8;y--;)
for(x=8;x--;J[y+1][x+1]=c--,T[c]=2,R[c]--)
T[27]=T[36]=0;
T[28]=T[35]=1;
do{
Q[c]=q+55041+c%8*24-c/8*7680;
Figura(c,T[c],1);
for(d=8;d--;){
x=c%8+1;
y=c/8+1;
while(j=J[y+=iy[d]][x+=ix[d]])
N[g][H[g]++]=j-1;
if(H[g]>1) G[c][++R[c]]=g++;
else H[g]=0;
}
}while(++c<64);
Inicio:
ti=time(NULL)-1;
for(x=v=ply+1;v--;)
for(w=x-v;w--;J[w][v+w]=W[w]);
c=C[j=n=0]=64;
Origen:
while(c--)
if(T[c]>1){
v=R[c];
do{
w=0;
g=G[c][v];
while(w<H[g]&&T[y=N[g][w]]==!t)
B[n][A[n]+w++]=y;
if(w&&T[y]==t)
if(n==ply) J[v=0][n]++;
else A[n]+=w;
}while(v--);
if(!A[n]) continue;
for(v=A[n];v--;T[B[n][v]]=t);
T[C[n++]=c]=t;
c=64;
t=!t;
}
if(n){
if(!J[y=0][w=n--]&&n&&J[n-w%2][w])
for(v=w;--v;m[w][v]=C[v]);
if(!n){
for(D[j][0]=v=A[0]+1;--v;D[j][v]=B[0][v-1]);
while(y++<ply)
if(L[j][l[j]=v=y]=J[y-1][y]) M[j][y]=0;
else for(L[j][y+1]=64,y=w=ply;--w;)
M[j][w]=m[v][w]+1;
L[j][0]=v+(ply+v)%2;
M[j++][0]=C[0]+1;
}
else for(;y++<ply-n;w++) //Minimax
if(v=J[y-1][w]-J[y][w])
if(V[y]==(v>0)-(v<0)) J[y][w]+=v;
for(v=x;--v>n;) //Reinicio de contadores
for(w=x-v;w--;J[w][v+w]=W[w]);
T[c=C[n]]=2;
for(v=A[n];v--;T[B[n][v]]=t);
J[A[n]=0][n]++;
t=!t;
goto Origen;
}
Borrar(11);
Total(n=j,t,c=g=y=0);
while(!j) if(getch()==27) return 0;
printf("%c[%u;%ufN=%u",27,v=(++g+t)/2*2+6,11*t+26,g=ply-1);
printf("%c[%u;30f%5.f%c",27,v,difftime(time(NULL),ti),34);
do{ //Ordenar maximos o minimos
for(x=y=j;y--;)
if(l[y]>0)
if(x==j) x=y;
else if(v=L[x][L[x][0]]-L[y][L[y][0]])
x=V[ply]==(v>0)-(v<0)?x:y;
else if(v=l[x]-l[y]) x=V[l[x]]==(v>0)-(v<0)?x:y;
else if(D[x][0]<D[y][0]) x=y;
if(n==j) d=x;
l[x]=-(y=l[x]);
if(++g<(ply+!t)/2+10)
Total(L[x][L[x][0]],ply+t,c=M[x][0]);
}while(--n);
do{ //Teclado
Borrar((ply+t)/2+1);
for(g=1-l[d];--g;)
Total(L[d][y=g],g+t,c=M[d][g-1]);
Figura(c,t,8);
while(kbhit()) getch();
while(!(E=getch()));
Figura(c,2,1);
if(E!=13) ply+=g=(E=='+'&&ply<10)-(E=='-'&&ply>2),
d+=E==80?d<j-1:-(d>0);
else{
Figura(c,T[c]=t,1);
for(K[t]+=v=D[d][0];--v;K[!t]--)
Figura(c,T[c=D[d][v]]=t,1);
if(L[d][g=1]) t=!t;
}
}while(!g);
goto Inicio;
}