#include<dos.h>
#include<stdio.h>
#include<conio.h>
char ficha[8][16]={
" 000000 ",
" 0000000000 ",
" 000000000000 ",
" 00000000000000 ",
" 00000000000000 "};
char far*Q,far*q=(char far*)0xA0000000;
char S[][3]={"0-1","1-0","1/2"," "};
char W[]="123456789147258369159357";
char T[10][3],R[]="%c[%u;%uf%.3s";
char H[10][4],I[2][8],G[10],E;
char N[241][10],Y[10][10];
int A[10],B[10],C[10]={10};
int D[10],X[10],V[24];
int P[242],p[484],ply[10]={9};
int a,c,d,n,t,v,x,w=3,y=21755;
void figura(f,F){
Q=q+f/3*7680-f%3*24+3631;
for(v=242;v--;*(Q+p[v])=*(Q+p[483-v])=P[v]?F:1);
}
void teclado(){
figura(c-1,1);
do c+=y=(E==75)-(E==77);
while(D[c=!c?9:c>9?1:c]);
figura(c-1,t?4:7);
a+=(E==72)-(E==80);
a=a>B[c]*!y?A[c]:a<A[c]?B[c]:a;
for(v=14;v--;printf(R,27,v/4*2+4,v%4*4+25,S[3]));
for(v=X[c]+1,v+=!v,w=v+t;v--;)
printf(R,27,y=--w/2*2+4,x=33-w%2*8,T[v?N[a][v-1]:c]),
printf(R,27,y,x+4,S[v==X[c]?t==v%2:ply[0]>1?3:2]);
while(E=kbhit()) getch();
while(!E) E=getch();
}
int main(){
_AX=0x13;
geninterrupt(0x10);
printf("%c[2;25fBlancas Rojas",27);
for(v=5;v--;w=3,y-=4992)
do{
x=!v&&w?1211:v*5120+w*32+1147;
for(c=16;c--;*(q+x+c*320)=*(q+y+c*320)=7);
for(c=y-x+1,y=x;c--;*(q+x+c)=*(q+x+c+5120)=7);
}while(w--);
for(c=v=w=y=0;++y<23;w+=298)
for(x=22;x--;p[v++]=w++)
if(y>3&&y<12&&x>2&&x<19)
P[v]=ficha[y-4][x-3]!=32;
for(y=9;y--;figura(c++,1),ply[c]=c)
printf("%c[12;%uf%c",27,y%3*3+10,T[c+1][0]=y%3+97),
printf("%c[%u;7f%c",27,9-y/3*3,T[c+1][1]=y/3+49);
for(v=24;v--;W[v]=w=v%2,V[v]=!w-w)
H[c=W[v]-48][G[c]++]=v/3;
Inicio:
for(x=y=ply[d]+1;--y>n;) //Reinicio de contadores
for(v=x-y;v--;Y[v][y+v]=W[v]);
while(y=--C[n]) //Casilla siguiente
if(!D[y]){
D[y]=C[++n]=10;
for(x=G[y];x--;)
if(++I[t][H[y][x]]>2) C[n]=1;
if(n==ply[d]&&C[n]>1) C[n]=Y[0][n]=1;
t=!t;
}
switch(n){
case 0: switch(d){
case 0: while(E!=13) teclado();
if(--ply[0]*X[c]==0) return 0;
for(x=G[c];x--;I[t][H[c][x]]++);
D[c]=C[E=a=0]=10;
t=!t;
break;
default: if(y=X[c]-d++) C[0]=N[a-1][y-1];
else C[d=0]=c;
}
break;
case 1: for(n=x=y=0;!x&&ply[d]>y++;)
if(!Y[y-1][y]) x=y;
if(d<=x)
switch(d){
case 0: A[c=C[0]]=a;
X[c]=d=x-1;
if(d+=!x) C[0]=10;
break;
case 1: N[B[c]=a++][X[c]-1]=C[0];
for(y=9;y--;N[a][y]=N[a-1][y]);
break;
default: N[a][X[c]-d--]=C[0];
C[0]=10;
}
break;
default: Y[y=0][--n]=1; //Minimax
for(x=n+1;ply[d]-n>y++;x++)
if(V[y]==Y[y-1][x]-Y[y][x])
Y[y][x]+=V[y];
}
if(C[n]<10){
t=!t;
D[y=C[n]]=0;
for(x=G[y];x--;I[t][H[y][x]]--);
}
goto Inicio;
}