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