#include<dos.h>
#include<stdio.h>
#include<conio.h>
char ficha[][16]={
"0000011111100000",
"0001111111111000",
"0011111111111100",
"0111111111111110",
"0111111111111110",
"1111111111111111",
"1111111111111111",
"1111111111111111"};
char R[][3]={"1-0","0-1","1/2"};
char far*Q,far*q=(char far*)0xA0000000;
char E,G[10],H[10][4],I[2][8];
char L[10][10],J[10][10];
int S[]={6,3,0}; //Color
int X[]={26,30,37,41}; //Tabulacion
int C[10]={9},A[10],B[10];
int N[10],M[10][10],V[10],W[10];
int i[484],p[242],m[10][10];
int c=8,g=8,w=2,y=57595,ply=6;
int d,j,n,t,v,x,z;
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){
Q=q+8751+F/3*7680-F%3*24;
for(w=242;w--;*(Q+i[w])=*(Q+i[483-w])=p[w]*S[F1]+1);
}
void total(F,F1,F2){
gotoxy(F1%2*11+26,w=g>ply?2*g+6-(ply+!t)/2*2:F1/2*2+4);
if(!F) printf("%.3s",R[z>8?2:t==F2%2]);
gotoxy(g>ply?34-!t%2*4:34-F1%2*4,g>ply?w:(g-!t)/2*2+4);
if(c--) printf("%c%u",99-c%3,3-c/3);
}
int main(){
_AX=0x13;
geninterrupt(0x10);
printf("%c[2;26fBlancas Rojas",27);
for(v=3;v--;)
printf("%c[%u;%uf%c",27,5+3*v,7,51-v),
printf("%c[%u;%uf%c",27,14,3*v+10,v+97);
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=w=y=0;y<22;y++,w+=298)
for(x=22;x--;i[v++]=w++)
if(y>2&&y<11&&x>2&&x<19)
p[v]=ficha[y-3][x-3]-48;
for(y=3;y--;)
for(x=3;x--;figura(j,2),B[j++]=1)
for(v=1,w=0,d=4;d--;v-=w,w=1)
if(y-2*v>=0&&y-2*v<3&&x-2*w>=0)
for(--g,n=0;n<3;) c=3*(y-v*n)+x-w*n++,
H[c][G[c]++]=g;
for(j=n=v=0;v<10;w=v%2,V[v]=!w-w,W[v++]=2*w);
Inicio:
for(x=v=ply+1;--v>n;) //Reinicio de contadores
for(w=x-v;w--;J[w][v+w]=W[w]);
while(c=C[n]--) //Casilla siguiente
if(B[--c]){
B[A[n]=c]=0;
C[++n]=9;
for(g=G[c];g--;)
if(++I[t][H[c][g]]>2) C[n]=0;
if(n==ply&&C[n]) J[C[n]=0][n]=1;
t=!t;
}
if(n){
if(!J[0][w=n--]&&n&&J[n-w%2][w])
for(v=w;--v;m[w][v]=A[v]);
J[0][n]=1;
if(!n){
for(y=0;y++<ply;)
if(L[j][N[j]=v=y]=J[y-1][y]) M[j][y]=0;
else for(L[j][w=y+1]=2,y=ply;--w;)
M[j][w]=m[v][w]+1;
L[j][0]=v+(ply+v)%2;
M[j++][0]=A[0]+1;
}
else for(y=0;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;
B[c=A[n]]=1;
t=!t;
for(g=G[c];g--;I[t][H[c][g]]--);
goto Inicio;
}
borrar(20);
total(n=j,t,c=g=0);
while(!j) if(getch()==27) return 0;
printf("%c[%u;%ufN=%u",27,(g+t)/2*2+6,11*t+26,(g=ply)%10);
do{ //Ordenar maximos o minimos
for(x=y=j;y--;)
if(N[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=N[x]-N[y]) x=V[N[x]]==(v>0)-(v<0)?x:y;
else if(G[M[x][0]-1]<G[M[y][0]-1]) x=y;
if(++g<(ply+!t)/2+10)
total(L[x][N[x]],ply+t,N[x],c=M[x][0]);
if(n==j) d=x;
N[x]*=y;
}while(--n);
do{ //Teclado
borrar(ply+t);
for(g=1-N[d];--g;)
total(L[d][g],g+t,g,c=M[d][g-1]);
figura(c,t);
while(kbhit()) getch();
while(!(E=getch()));
if(E==13){
B[c]=0;
for(g=G[c];g--;)
if(++I[t][H[c][g]]>2) ply=0;
z+=ply>0;
t=!t;
}
else ply+=g=(E=='+')-(E=='-'&&ply>2),
d+=E==77?d<j-1:!d-1,
figura(c,2);
}while(!g);
if(ply+z>8) ply=9-z;
C[j=n=0]=ply?9:0;
goto Inicio;
}