#include<dos.h>
#include<time.h>
#include<stdio.h>
#include<conio.h>
char pieza[][6][22]=
{" "," 22 "," 2 2 "," "," "," 22 22 ",
" "," 22 "," 22 22 "," 222222222222 "," "," 2222 2222 ",
" 2222 "," 222222 "," 22222 "," 222222222222 "," 222 2222 222 "," 22 2222 2222 22 ",
" 222222 "," 222222 "," 2222222 "," 222111111222 "," 222 2222 222 ","2222 22 22 2222",
" 222222 "," 22222 22 22222 "," 222222122 "," 22222221222 "," 222 2222 222 ","2222 2 2 2222",
" 222222 ","2211122 22 2211122"," 22222222122 "," 2222222221222 "," 22222222222222 "," 22 22 22 22 ",
" 2222 ","21222122211222122212"," 2222112222122 "," 2 2222222221222 "," 22222222222222 "," 22 22 22 22 ",
" 222222 ","21222212211221222212"," 2222122222122 "," 2212222222222122 "," 2111111112 "," 22 22 22 22 ",
" 22222222 ","22122221222212222122"," 22222222222122 "," 22221211222222122 "," 2222222222 "," 222 222222 222 ",
" 22222222 "," 221222212212222122 "," 2222222222221222 "," 222122122122222122 "," 2222222222 "," 22222222222222 ",
" 22222222 "," 2212222222222122 "," 22222222222222122 ","2221222212122222122 "," 2222222222 "," 22222222222222 ",
" 222222 "," 22222222222222 ","221222222222222122 "," 222122122122222122 "," 2222222222 "," 22222222222222 ",
" 22222222 "," 21111111111112 ","211222222212222122 "," 22221211222222122 "," 2222222222 "," 21111111111112 ",
" 2222222222 "," 2222222222222222 "," 222222 122222122 "," 2212222222222222 "," 2222222222 "," 2222222222222222 ",
" 2222222222 "," 222222222222222222 "," 22 22222221222 "," 2 222222222 22 "," 2222222222 "," 222222222222222222 ",
" 222222222222 "," 2222222222222222 "," 22222222122 "," 2222222 22 "," 2222222222 "," 2222222222222222 ",
" 222222222222 "," 21111111111112 "," 222222222122 "," 22222 2 "," 211111111112 "," 21111111111112 ",
" 222222222222 "," 22222222222222 "," 222222222122 "," 222222222 "," 22222222222222 "," 22222222222222 ",
" 222222222222 "," 2222222222222222 "," 2222222222122 "," 2222222222222 "," 2222222222222222 "," 2222222222222222 ",
" "," 2222222222222222 "," 2222222222222 "," 222222 22222 "," 2222222222222222 "," 2222222222222222 ",
" "," "," "," 22222 "," "," "};
char icono[][5][13]=
{" ' "," ' ' "," '''''''' "," ''' ''' ''' "," ''' ''' ",
" ''' "," '''' "," ' ' "," ' ''' ''' ' ","'' ''' ''' ''",
" ''' ' ''' "," ' ' "," ''''' ' "," ' ' ","'' ' ' ''",
"' ' ' ' '"," ' ' ' "," ' ' '"," ''''''''''' "," ' ' ' ' ",
"' ' ' ' ' '"," ' ' ' ' "," ' ' '"," ' ' "," ' '' '' ' ",
"' ' ' ' '"," ' ' ' "," ' ' ' ' '"," ' ' "," '' '' '' '' ",
"' ' ' '"," ' ' '","' ' ' ' '"," ' ' "," ' ' ' ' ' ",
" ' ' ' ' ","' '' ' '"," ' ' ' ' '"," ' ' "," ' ' ",
" ' ' "," '''' ' ' '"," ' ' '"," ' ' "," ' ' ",
" ''''''''' "," ' ' '"," ' ' ''"," ''''''' "," ''''''''' ",
" ' ' "," ' ' '"," ' ' '"," ' ' "," ' ' ",
"' '"," ' ' '"," ' ''' "," ' ' ","' '",
"'''''''''''''"," ''''''''''"," ''''' "," ''''''''''' ","'''''''''''''"};
char posicion[][5][8]=
{"tcadract","......T.","..R.....","........",".....dc.",
"pppppppp","..R.....","T.......",".......p","t.cCa...",
"........","........","...Pr...","..A....D","pD.p.p..",
"........","........","....p...",".P.p....","p..r....",
"........",".....p..","...PPA..",".....CC.","....T..C",
"........","......p.","...P.P..",".....r..","..p...P.",
"PPPPPPPP",".D...Cr.","........","........","..PP...p",
"TCADRACT","........","........",".R......","R..A...."};
char E,far*Q[64],far*q=(char far*)0xA0000000;
char e[7][8],p[8][576];
char N[512][8]; //Origen+direccion,alcance=Destino
char H[512],h[4][512]; //Tipo,casilla+direccion=Alcance
int A[33]={7},C[33]={64},T[33]={2}; //Tipo,casilla,bando
int Z[9],pc1[9],pc2[9],pc3[9]; //(0PB,1PN,2R,3C,4A,5T,6D)
int B[64],b[]={0,3,-1,4,4,-2,2,1}; //Promocion y al paso
int L[200][9],J[12][12],l[200]; //Control de jugadas
int M[200][9],m[2][9][9]; //Secuencia
int C1[9],C2[9],C3[9]; //Piezas
int V[]={-1,1,-1,1,-1,1,-1,1,-1,1};
int W[]={400,0,400,0,400,0,400,0,400,0};
int i[576],K[64],P[64],G[64][8];
int ii[]={46,80,46,82,67,65,84,68,46,112,114,99,97,116,100};
int aa[9],dd[9],gg[9],hh[9]; //Rutina principal
int pr[2],R[]={4,60}; //Pieza y casilla del rey en inicio
int I1[]={1,33},I2[]={0,32}; //Blancas de 1 a I2[0]
int f[65]={1},S[][3]={0,0,15,0,15,0,0,0,0}; //Fondo, perfil
int X[]={1156,1188,1244}; //Tabulacion
int ix[]={-1,0,1,1,1,0,-1,-1,1,2,2,1,-1,-2,-2,-1};
int iy[]={1,1,1,0,-1,-1,-1,0,2,1,-1,-2,-2,-1,1,2};
int D[]={2,1,2,2,2,0,2,2}; //Peon al frente
int d1[]={0,4,0,0,0,1,0};
int d2[]={2,6,7,7,6,7,7};
int d3[]={1,1,1,1,2,2,1};
int c=63,g=14,y=57595,ply=3;
int a,d,j,n,t,v,w,x,c1,c2;
void Borrar(F){
for(g=F;g--;)
for(c=d=F==ply?!g:0;d<3-c;d++)
for(n=X[d]+5120*g+9920,v=15;v--;n-=320)
for(w=d==1?55:31;w--;*(q+n+w)=0);
}
void Figura(F,F1,F2,F3){
S[F1][0]=F3;
for(v=576;v--;*(Q[F]+i[v])=S[F1][p[F2][v]]);
}
void Jaque(F){
for(y=d=0;d<8;d++,y=0)
if(h[3][g=G[F][d]]&&A[x=P[N[g][0]]]==3&&T[x]!=t) d=8;
else while(y<H[g]) if(x=P[N[g][++y]])
if(T[x]!=t&&y<e[A[x]][d]) y=d=8;
else break;
}
void Jugada(F,F1){
n=5120*F+10826;
if(F1>0) n-=34;
else F1=-F1;
c2=F1%64;
if(F1) printf("%c[%u;32f%c%u",27,2*F+4,c2%8+97,c2/8+1);
a=F1/64;
for(v=a>1?13:0;v--;n-=320)
for(w=13;w--;*(q+n+w)=icono[v][a-2][w]-32);
}
void Total(F,F1,F2){
gotoxy(11*F1+26,2*g+4);
if(F>1) printf("%3u",F/2);
else if(F) printf("1/2");
else if(t!=F2%2) printf("1-0");
else printf("0-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--;y-=5000)
for(g=3;g--;y=x){
if(!v&&g) x=1219;
else x=X[g]+5120*v-1;
for(w=y+1-x;w--;*(q+x+w)=*(q+x+w+5120)=7);
for(w=16;w--;*(q+x+320*w)=*(q+y+320*w)=7);
}
for(a=7;a--;)
for(d=d1[a];d<=d2[a];d+=d3[a])
if(a>3) e[a][d]=8;
else if(a>1) e[2][d]=6-2*a;
else if(D[d]>1) e[!a][d]=2;
for(v=0;v<8;v++)
for(w=8;w--;J[9-v][w+2]=c+1,B[c--]=b[v])
if(a=i[posicion[v][2][w]]) //posicion[v][?=0,1,...][w]
y=a>7?--I1[x=1]:++I2[x=0],
A[y]=--a%7,
C[y]=c,
P[c]=y,
T[y]=x,
pr[x]+=A[y]==2?y:0;
for(v=576;v--;i[v]=320*y+v%24)
if((y=v/24)>1&&y<22&&(x=v%24)>1&&x<22)
for(w=6;w--;) if(a=pieza[y-2][w][x-2]-32)
p[w+1][v]=p[w+1-!w][v]=a-16;
do{
if(x=++c%8) f[c+1]=f[c]=4-f[c-1];
Q[c]=q+24*x+54720-7680*(y=c/8);
Figura(c,T[P[c]],A[P[c]],f[c]);
for(d=8;d--;){
G[c][d]=++g;
if(j=J[(v=y+2)+iy[d+8]][(w=x+2)+ix[d+8]])
N[g][h[3][g]--]=j-1;
while(j=J[v+=iy[d]][w+=ix[d]])
N[g][++H[g]]=j-1;
for(a=H[g]?3:0;a--;h[a][g]=n+1)
if(a<2) n=B[c]==a+2&&d==4*a+1;
else n=(c==4||c==60)&&(d==3||d==7);
}
}while(c<63);
Inicio:
ti=time(NULL)-1;
for(j=v=0;v<ply;v++)
for(w=0;w++<ply-v;J[w][v+w]=W[w]);
pc1[n=1]=I1[t]; //Primera pieza
Origen:
c=C1[n]=C[pc1[n]]; //Casilla de la pieza
if(c>63) goto Siguiente;
K[c]++; //Simulacion de origen
P[c]=0;
aa[n]=A[pc1[n]]; //Tipo de pieza
dd[n]=d1[aa[n]]; //Direccion inicial
Alcance:
gg[n]=G[C1[n]][dd[n]];
hh[n]=aa[n]<4?h[aa[n]][gg[n]]:H[gg[n]];
if(!hh[n]) goto Direccion;
Z[n]=aa[n]!=3;
Destino:
c2=C2[n]=N[gg[n]][Z[n]]; //Casilla destino
if(T[pc2[n]=P[c2]]==t) goto Direccion; //Mismo bando
if(aa[n]==t) //Peon
if(D[dd[n]]!=T[P[c2]]) A[pc1[n]]=B[c2]==t?6:t; //Promocion
else if(P[c2]||B[c2]+t+1||aa[x=n-1]>1) goto Direccion;
else if(Z[x]<2||c2+c2!=C1[x]+C2[x]) goto Direccion;
else c=C3[n]=C2[x], //Al paso
C[P[c]]=64,
P[c]-=pc3[n]=P[c];
if(aa[n]==2&&Z[n]>1) //Enroque
if(P[c2]||K[c1=C1[n]]>1) goto Direccion;
else{
Jaque(c1);
if(d=d>8) goto Direccion;
if(c1<c2)
if(K[c=c1+3]||P[c]!=pr[t]+3*V[t]) goto Direccion;
if(c1>c2)
if(K[c=c1-4]||P[c+1]||P[c]!=pr[t]-4*V[t]) goto Direccion;
y=pc3[n]=P[C3[n]=c]; //Simulacion de enroque
C[y]=(c1+c2)/2;
P[c]-=P[C[y]]=y;
}
Simulacion:
C[pc2[n]]=64;
C[pc1[n]]=C2[n]; //Pieza a destino
P[C2[n]]=pc1[n];
Jaque(C[pr[t]]);
if(d<9&&n<ply&&(pc1[++n]=I1[t=!t])) goto Origen;
Restaurar:
if(P[c2=C2[n]]=pc2[n]) C[pc2[n]]=c2;
if(y=pc3[n]) P[(R[t]+c2)/2]*=A[y]==!t,
C[y]=C3[n],
pc3[n]-=P[C[y]]=y;
if(d>8) hh[n]-=d=aa[n]==2; //No permite enroque
else if(n<2){
for(J[1][y=1]+=2;y++<ply;)
if((x=L[j][l[j]=y-1]=J[y-1][y])>1) M[j][y-1]=0;
else for(L[j][y]=400-x,v=y=ply;--v>1;)
M[j][v]=m[x][l[j]+1][v];
L[j][0]=l[j]+(l[j]+y)%2;
a=A[pc1[1]];
M[j][1]=(C2[1]+64*a)*V[a==aa[1]];
M[j++][0]=C1[1];
}
else for(J[1][x=n]+=2,y=0;y++<ply-n;)
if(v=J[y+1][++x]-J[y][x])
if(V[y]==(v>0)-(v<0)) J[y+1][x]=J[y][x];
for(v=n;v<ply;v++) //Reinicio de contadores
for(w=0;w++<ply-v;J[w][v+w]=W[w]);
if(A[y=pc1[n]]>aa[n]) if(--A[y]<3) A[y]=t;
else goto Simulacion;
if(!pc2[n]&&Z[n]++<hh[n]) goto Destino;
Direccion:
dd[n]+=d3[aa[n]];
if(dd[n]<=d2[aa[n]]) goto Alcance;
K[c=C1[n]]--; //Restaura origen
C[pc1[n]]=c;
P[c]=pc1[n];
Siguiente:
if(pc1[n]++<I2[t]) goto Origen; //Pieza siguiente
if(!J[1][n]){
Jaque(C[pr[t]]);
J[1][v=n]=d=d<9;
if(n<5||J[n+n%2-2][n]>d)
while(--v>1) a=A[pc1[v]],
m[d][n][v]=(C2[v]+64*a)*V[a==aa[v]];
}
t=!t;
if(--n) goto Restaurar;
Borrar(11);
c1=R[t=!t]; //Casilla del rey en origen
Total(j?j+j:J[1][1],t,g=0);
printf("%c[%u;%ufN=%u",27,n=2*g+4,11*t+26,g=ply);
printf("%c[%u;30f%5.f%c",27,n,difftime(time(NULL),ti),34);
if(c=j)
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)?y:x;
else if(l[x]%2==l[x]>l[y]) x=y;
if(++g<11) Jugada(g,M[x][1]),
Total(L[x][l[x]],(!t+ply)%2,l[x]%2);
l[x]*=-1;
}while(--c);
Teclado:
do{
Figura(c2=c1,T[y],A[y=P[c1]],7+t);
while(kbhit()) getch();
while(!(E=getch()));
if(E==27&&!j) return 0;
if(E==77&&c1<63) c1++;
if(E==75&&c1>0) c1--;
if(E==72&&c1<56) c1+=8;
if(E==80&&c1>7) c1-=8;
if(x=E!=13) Figura(c2,T[y],A[y],f[c2]);
ply+=n=(E=='+'&&ply<8)-(E=='-'&&ply>2);
}while(!n&&x);
if(x--) goto Inicio;
Eleccion:
if((x+=E!=75)==j||(x-=E==75)<0)
if(c2==c1) goto Teclado;
else x=x<0?j-1:0;
if(M[x][0]!=c1) goto Eleccion;
for(g=1-l[x];--g;) Jugada(g-1,M[x][g]),
Total(L[x][g],(t+g)%2,g%2);
Figura(c2,t,a,8-t);
while(!(E=getch()));
Borrar(ply);
Figura(c2,T[P[c2]],A[P[c2]],f[c2]);
if(E==27) goto Teclado;
if(E!=13) goto Eleccion;
aa[0]=A[y]=a; //Promocion
Z[0]=(c=c1-c2)/8*V[t]; //Posibilitar al paso
if(a==t&&!P[c2]&&c%8) C[P[c=C2[0]]]=64,
P[c]=0,
Figura(c,2,7,f[c]);
K[C1[0]=c1]=K[C2[0]=c2]=1; //Casillas usadas
do C[P[c2]]=64,
C[P[c=c1]]=c2,
P[c]-=P[c2]=P[c],
Figura(c,2,7,f[c]),
Figura(c2,t,a=A[P[c2]],f[c2]),
c1+=a==2?3*(c2-c==2)-4*(c-c2==2):0,
c2=(c+c2)/2;
while(c!=c1);
t=!t;
goto Inicio;
}