#include<dos.h>
#include<time.h>
#include<stdio.h>
#include<conio.h>
char ficha[][16]={
" 222222 ",
" 2222222222 ",
" 222222222222 ",
" 22222222222222 ",
" 22222222222222 ",
"2222222222222222",
"2222222222222222",
"2222222222222222"};
char posicion[][3][8]={
".p.p.p.p","........","........",
"p.p.p.p.","....d...","..p.p.p.",
".p.p.p.p",".D......","........",
"........","........","..p.p.p.",
"........","...D....","........",
"P.P.P.P.","........","..p.p.p.",
".P.P.P.P","........",".P......",
"P.P.P.P.","........","........"};
char R[][3]={"1-0","0-1"};
char far*Q,far*q=(char far*)0xA0000000;
char E,N[128][2]; //Origen,direccion=Destino
char G[64][4],H[128]; //Alcance
char L[99][12],J[12][12]; //Control de jugadas
char p[288],z[99][10];
int A[25],C[25]={64},T[25]={2}; //Tipo,casilla,bando
int B[64],b[]={0,2,2,2,2,2,2,1}; //Promocion
int S[3][3][2]={0,15,0,0,0,14,0,0,0,0,0,4}; //Color
int X[]={26,30,37,41}; //Tabulacion
int f[65]={1},I1[]={1,25},I2[]={0,24}; //Blancas 1 a I2[0]
int d1[]={0,2,0};
int d2[]={1,3,3};
int ii[]={46,80,46,68,46,112,100};
int ix[]={-1,1,1,-1};
int iy[]={1,1,-1,-1};
int C1[100],C3[100],D[100],e[100],pc3[100];
int C2[12],P[64],V[20],W[20],Z[12];
int M[99][12],m[12][12]; //Secuencia
int a[12],i[576],l[99],pc1[12];
int c=63,g=6,w=2,y=57595,ply=5;
int d,j,n,t,v,x;
void Borrar(F){
for(v=F/2+1;v--;)
for(n=w=F<20?!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,F3){
S[F1][F2][0]=S[2][0][1]=F3;
Q=q+54720+F%8*24-F/8*7680;
for(w=288;w--;)
*(Q+i[w])=*(Q+i[575-w])=S[F1][F2][p[w]];
}
void Total(F,F1,F2,F3){
gotoxy(F1%2*11+26,w=g>ply?2*g+6-(ply+!t)/2*2:F1/2*2+4);
F?printf("%3u",F):printf("%.3s",R[t==F2%2]);
if(!F3) return;
if(g<=ply) gotoxy(34-F1%2*4,(g-!t)/2*2+4);
else printf("%c[%u;30f%c%u-",27,w,F3/64%8+97,F3/64/8+1);
printf("%c%u",d%8+97,(d=F3%64)/8+1);
}
int main(){
_AX=0x13;
geninterrupt(0x10);
time_t ti;
printf("%c[2;26fBlancas Negras",27);
while(i[ii[g]]=g--);
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]=99*w);
for(v=0;v<8;v++)
for(w=8;w--;J[8-v][w+1]=c+1,B[c--]=b[v])
if(n=i[posicion[v][1][w]]) //posicion[v][?=0,1,...][w]
y=n>3?--I1[x=1]:++I2[x=0],
A[y]=--n%3,
C[y]=c,
P[c]=y,
T[y]=x;
for(c=g=v=w=y=0;y<24;y++,w+=296)
for(x=24;x--;i[v++]=w++)
if(y>3&&y<12&&x>3&&x<20)
if(n=ficha[y-4][x-4]-32) p[v]=n-17;
do{
if(c%8) f[c+1]=f[c]=4-f[c-1];
Figura(c,T[P[c]],A[P[c]],f[c]);
for(d=f[c]<2?4:0;d--;G[c][d]=g++)
if(x=c%8+1)
if(y=c/8+1)
while(j=J[y+=iy[d]][x+=ix[d]])
if(H[g]<2) N[g][H[g]++]=j-1;
}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]);
Z[j=n=0]=1;
pc1[0]=I1[t]; //Primera ficha
Origen:
d=C1[c=10*n]=C[pc1[n]]; //Casilla de la ficha
if(d>63) goto Siguiente;
P[d]=0;
a[n]=A[pc1[n]]; //Tipo de ficha
D[c]=d1[a[n]]; //Direccion inicial
Destino:
g=G[C1[c]][D[c]];
if(!H[g]) goto Direccion;
y=P[d=N[g][0]];
if(Z[n]){
if(T[y]!=!t||H[g]<2||P[N[g][1]]) goto Direccion;
if(n==ply&&++J[0][n]) goto Direccion;
++Z[n]>2?e[c-1]=1:Z[n]++;
C[y]=64;
C3[c]=d;
P[d]-=pc3[c]=y;
C1[++c]=N[g][1];
D[c]=d1[a[n]];
goto Destino;
}
if(y||n==ply&&++J[0][n]) goto Direccion;
Simulacion:
C[pc1[n]]=C2[n]=d; //Ficha a destino
P[d]=pc1[n];
if(B[d]==t) A[pc1[n]]=2; //Promocion
Z[++n]=1;
pc1[n]=I1[t=!t];
goto Origen;
Direccion:
if(D[c]++<d2[a[n]]) goto Destino;
if(Z[n]>2){
d=C1[c--];
Z[n]--;
if(!e[c]) goto Simulacion;
C[pc3[c]]=C3[c];
P[C3[c]]=pc3[c];
e[c]=0;
goto Direccion;
}
C[pc1[n]]=C1[c];
P[C1[c]]=pc1[n];
Siguiente:
if(pc1[n]++<I2[t]) goto Origen; //Ficha siguiente
if(Z[n]==1&&Z[n]--)
if(pc1[n]=I1[t]) goto Origen;
if(n){
if(!J[0][w=n--]&&n&&J[n-w%2][w])
for(v=w;--v;m[w][v]=C2[v]);
J[0][n]++;
if(!n){
for(v=10;v--;z[j][v]=v<Z[0]-1?C3[v]:0);
for(y=0;++y<x;)
if(L[j][l[j]=v=y]=J[y-1][y]) M[j][y]=0;
else for(L[j][w=y+1]=99,y=x;--w;)
M[j][w]=m[v][w]+64;
L[j][0]=v+(ply+v)%2;
M[j++][0]=C1[0]*64+C2[0];
}
else for(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]);
c=10*n;
P[d=C2[n]]=0;
if(Z[n]) C[pc3[c]]=C3[c+=Z[n]-2],
P[C3[c]]=pc3[c];
if(B[d]==(t=!t)) A[pc1[n]]=a[n];
goto Direccion;
}
Borrar(20);
Total(n=j,t,g=0,0);
printf("%c[%u;%ufN=%u",27,v=(g+t)/2*2+6,11*t+26,g=ply);
printf("%c[%u;30f%5.f%c",27,v,difftime(time(NULL),ti),34);
while(n--){ //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;
if(++g<(ply+!t)/2+10)
Total(L[x][l[x]],ply+t,l[x],M[x][0]);
l[x]*=y;
}
c=M[0][0]/64;
Teclado:
Figura(d=c,T[y],A[y=P[c]],7+t);
while(kbhit()) getch();
while(!(E=getch()));
if(E==27&&getch()==E) return 0;
if(E==77&&c<63) c++;
if(E==75&&c) c--;
if(E==72&&c<56) c+=8;
if(E==80&&c>7) c-=8;
if(x=E!=13) Figura(d,T[y],A[y],f[d]);
ply+=n=(E=='+'&&ply<9)-(E=='-'&&ply>1);
if(!n)
if(x--) goto Teclado;
else{
Eleccion:
x+=V[E==75];
if(x==j||x<0) if(c==d) goto Teclado;
else x=x<0?j-1:0;
if(M[x][0]/64!=c) goto Eleccion;
for(g=1-l[x];--g;)
Total(L[x][g],g+t,g,M[x][g-1]);
Figura(d,t,A[y],8-t);
while(!(E=getch()));
Borrar(ply+t);
if(c!=d) Figura(d,2,0,1);
if(E==27) goto Teclado;
if(E!=13) goto Eleccion;
P[C[y]=d]=y;
if(B[d]==t) A[y]=2; //Promocion
Figura(d,t,A[y],1);
if(c!=d) Figura(c,2,P[c]=0,1);
for(v=10;v--;)
if(c=z[x][v]) C[P[c]]=64,
Figura(c,2,P[c]=0,1);
t=!t;
}
goto Inicio;
}