#include<dos.h>
#include<time.h>
#include<stdio.h>
#include<conio.h>
char e[7][8],k[12][12],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]={-1}; //Tipo,casilla,bando
int Z[9],pc1[9],pc2[9],pc3[9]; //(0PB,1PN,2R,3C,4A,5T,6D)
int i[576],K[64],P[65],G[64][8];
int main()
{
_AX=0x13;
geninterrupt(0x10);
time_t ti;
char E,far*Q[64];
char far*q=(char far*)0xA0000000;
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 figura[][5][13]=
{" ' "," ' ' "," '''''''' "," ''' ''' ''' "," ''' ''' ",
" ''' "," '''' "," ' ' "," ' ''' ''' ' ","'' ''' ''' ''",
" ''' ' ''' "," ' ' "," ''''' ' "," ' ' ","'' ' ' ''",
"' ' ' ' '"," ' ' ' "," ' ' '"," ''''''''''' "," ' ' ' ' ",
"' ' ' ' ' '"," ' ' ' ' "," ' ' '"," ' ' "," ' '' '' ' ",
"' ' ' ' '"," ' ' ' "," ' ' ' ' '"," ' ' "," '' '' '' '' ",
"' ' ' '"," ' ' '","' ' ' ' '"," ' ' "," ' ' ' ' ' ",
" ' ' ' ' ","' '' ' '"," ' ' ' ' '"," ' ' "," ' ' ",
" ' ' "," '''' ' ' '"," ' ' '"," ' ' "," ' ' ",
" ''''''''' "," ' ' '"," ' ' ''"," ''''''' "," ''''''''' ",
" ' ' "," ' ' '"," ' ' '"," ' ' "," ' ' ",
"' '"," ' ' '"," ' ''' "," ' ' ","' '",
"'''''''''''''"," ''''''''''"," ''''' "," ''''''''''' ","'''''''''''''"};
char posicion[][4][8]=
{"tcadract","......T.","..R.....","........",
"pppppppp","..R.....","T.......",".......p",
"........","........","...Pr...","..A....D",
"........","........","....p...",".P.p....",
"........",".....p..","...PPA..",".....CC.",
"........","......p.","...P.P..",".....r..",
"PPPPPPPP",".D...Cr.","........","........",
"TCADRACT","........","........",".R......"};
int z[]={46,80,46,82,67,65,84,68,46,112,114,99,97,116,100};
int B[64],b[]={0,3,-1,4,4,-2,2,1}; //Promocion y al paso
int L[200][9],J[9][9]; //Control de jugadas
int M[200][9],M1[9][9],M2[9]; //Secuencia de mate
int N1[9],N2[9],C1[9],C2[9],C3[9]; //Piezas
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 I[][2]={1,0,33,32}; //Blancas de 1 a I[0][1]
int f[65]={1},F[][3]={0,0,15,0,15,0}; //Fondo, perfil
int X[]={1156,1188,1245,1277}; //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[]={-1,1,-1,-1,-1,0,-1,-1}; //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=64,g=14,t=0,ply=3;
int a,d,j,n,v,w,x,y,c1,c2;
printf("%c[2;26fBlancas Negras",27);
while(i[z[g]]=g--);
for(v=0;v<8;v++)
for(w=8;w--;B[c]=b[v])
if(k[9-v][w+2]=c--)
if(!i[a=posicion[v][3][w]]) continue;
else{ //posicion[v][?=0,1,2,3][w]
y=I[x=i[a]>7][!x]+=!x-x;
A[y]=(i[a]-1)%7;
if(A[y]==2) pr[x]=y;
C[y]=c;
P[c]=y;
T[y]=x;
}
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;
for(v=13;v--;)
for(a=5;a--;)
for(w=13;w--;figura[v][a][w]-=32);
for(a=7;a--;)
for(d=d1[a];d<=d2[a];d+=d3[a])
if(a==2) e[2][d]=2;
else if(a>3) e[a][d]=8;
else if(a<2&&D[d]<0) e[1-a][d]=2;
do{
if(x=c%8) f[c+1]=f[c]=4-f[c-1];
Q[c]=q+54720+24*x-7680*(y=c/8);
a=A[P[c]];
F[w=T[P[c]]>0][d=0]=f[c];
for(v=576;v--;*(Q[c]+i[v])=F[w][p[a][v]]);
do{
N[++g][0]=64;
if(n=k[(v=y+2)+iy[d+8]][(w=x+2)+ix[d+8]])
N[g][h[3][g]--]=n-1;
while(n=k[v+=iy[d]][w+=ix[d]]) N[g][++H[g]]=n-1;
if(!H[G[c][d]=g]) continue;
h[0][g]=1+(B[c]==2&&d==1);
h[1][g]=1+(B[c]==3&&d==5);
h[2][g]=2-(c!=4&&c!=60||d!=3&&d!=7);
}while(++d<8);
}while(++c<64);
for(v=13;v--;n=v%2,ix[v]=n-!n,iy[v]=200*!n)
for(d=4;d--;y=x){
if(!v&&d<3&&d) x=1219;
else x=5120*v+X[d]-1;
if(v>11||d>2) continue;
for(w=y-x+1;w--;*(q+x+w)=*(q+x+w+5120)=7);
for(w=16;w--;n=320*w,*(q+x+n)=*(q+y+n)=7);
}
Inicio:
ti=time(NULL)-1;
for(v=9;v--;N1[v]=N2[v]=0)
for(w=9-v;w--;J[w][v+w]=iy[w]);
pc1[n=1]=I[t][j=0]; //Primera pieza
Origen:
C1[n]=C[pc1[n]]; //Casilla de la pieza
if(C1[n]>63) goto Siguiente;
K[C1[n]]++; //Simulacion de origen
P[C1[n]]=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]<2) //Peon
if(D[dd[n]]!=T[P[c2]]) A[pc1[n]]=B[c2]==t?6:t; //Promocion
else{ //Captura al paso
if(P[c2]||B[c2]+t+1||aa[n-1]>1) goto Direccion;
if(Z[n-1]<2||2*c2!=C1[n-1]+C2[n-1]) goto Direccion;
pc3[n]=P[C3[n]=C2[n-1]];
C[pc3[n]]=64;
P[C3[n]]=0;
}
if(aa[n]==2&&Z[n]>1) //Enroque
if(P[c2]||K[c=C1[n]]>1) goto Direccion;
else{
for(d=0;d<8;d++)
if(A[x=P[N[g=G[c][d]][y=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;
if(d=d>8) goto Direccion;
if(c<c2)
if(K[c+3]||P[c+3]!=pr[t]+3*ix[t]) goto Direccion;
else C3[n]=c+3; //Enroque corto
if(c>c2)
if(K[c-4]+P[c-3]||P[c-4]!=pr[t]-4*ix[t]) goto Direccion;
else C3[n]=c-4;
pc3[n]=P[C3[n]]; //Simulacion de enroque
C[pc3[n]]=(c+c2)/2;
P[C3[n]]=0;
P[(c+c2)/2]=pc3[n];
}
Simulacion:
C[pc1[n]]=C2[n]; //Pieza a destino
C[pc2[n]]=64;
P[C2[n]]=pc1[n];
c=C[pr[t]];
for(d=0;d<8;d++)
if(A[x=P[N[g=G[c][d]][y=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;
if(d<9&&n<ply) //Nivel siguiente
if(pc1[++n]=I[t=!t][0]) goto Origen;
Restaurar:
C[pc2[n]]=C2[n];
P[C2[n]]=pc2[n];
if(pc3[n]){ //Al paso o enroque
if(A[pc3[n]]>1) P[(R[t]+C2[n])/2]=0;
C[pc3[n]]=C3[n];
P[C3[n]]=pc3[n];
pc3[n]=0;
}
if(d>8) hh[n]-=d=aa[n]==2; //No permite enroque
else{
J[y=1][n]++; //Jugadas posibles
if(n<ply)
if(n<2){
while(y<ply)
if(L[j][x]=J[x=y][++y]) continue;
else{
while(--y) M[j][y]=M1[x+1][y];
if(N1[x+1]+N2[x+1]) L[j][x]=-1;
if(ix[x]==ix[y=ply]) L[j][++x]=200-L[j][x-1];
}
if(A[pc1[1]]==aa[1]) M[j][1]=aa[1]*64+C2[1];
else M[j][1]=-A[pc1[1]]*64-C2[1];
M[j][0]=C1[1];
L[j++][0]=x;
for(v=9;--v;N1[v]=N2[v]=0);
}
else do{ //Minimax
x=J[y][n+y]-J[y+1][n+y];
if(ix[y]!=(x<0)-(x>0)) continue;
J[y+1][n+y]=J[y][n+y];
if(y==3) //Confirma secuencia
if(N1[x=n+3])
for(N2[x]=N1[x]--;--x;M1[n+3][x]=M2[x]);
}while(y++<ply-n);
}
for(v=n;v<ply;v++) //Reinicio de contadores
for(w=0;w++<ply-v;J[w][v+w]=iy[w]);
if(A[pc1[n]]>aa[n]) //Subpromocion
if(--A[pc1[n]]>2) goto Simulacion;
else A[pc1[n]]=t;
if(!pc2[n]&&Z[n]++<hh[n]) goto Destino;
Direccion:
dd[n]+=d3[aa[n]];
if(dd[n]<=d2[aa[n]]) goto Alcance;
K[C1[n]]--; //Restaura origen
C[pc1[n]]=C1[n];
P[C1[n]]=pc1[n];
Siguiente:
if(pc1[n]++<I[t][1]) goto Origen; //Pieza siguiente
if(!J[1][n]){
c=C[pr[t]];
for(d=0;d<8;d++)
if(A[x=P[N[g=G[c][d]][y=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;
if(d>8)
if(N1[y=n]=d=1)
while(--y){ //Secuencia de mate
if(A[pc1[y]]==aa[y]) M2[y]=aa[y]*64+C2[y];
else M2[y]=-A[pc1[y]]*64-C2[y];
if(n<5) M1[n][y]=M2[y];
}
}
t=!t;
if(--n) goto Restaurar;
c1=R[t=!t]; //Casilla del rey en origen
for(y=2;y<13;y++)
for(d=3;d--;)
for(n=5120*y+X[d],v=15;v--;)
for(n-=320,w=d==1?55:31;w--;*(q+n+w)=0);
g=4+2*ply;
for(c=10-ply;c--;)
if(c<j){ //Ordenar maximos o minimos
for(x=y=j;y--;)
if(L[y][0])
if(x==j) x=y;
else{
v=L[x][L[x][0]];
w=L[y][L[y][0]];
if(ix[ply]==(v<w)-(v>w)||v==w&&L[x][0]>L[y][0]) x=y;
}
v=L[x][w=L[x][0]];
L[x][0]=0;
gotoxy(37-(t+ply)%2*11,g+=2);
if(v>0&&v<200) printf("%3u",v);
else if(!v||v==200) printf("1/2");
else if(v==iy[w-t]-ix[w-t]) printf("1-0");
else printf("0-1");
n=586+2560*g;
if((d=M[x][1])>0) n-=34;
else d=-d;
c2=d%64;
printf("%c[%u;32f%c%u",27,g,97+c2%8,c2/8+1);
if((a=d/64)>1) for(v=13;v--;n-=320)
for(w=13;w--;*(q+n+w)=figura[v][a-2][w]);
}
printf("%c[%u;%ufN=%u",27,g=4+2*ply,26+11*t,ply);
printf("%c[%u;30f%5.f%c",27,g,difftime(time(NULL),ti),34);
gotoxy(26+11*t,4);
if(j) printf("%3u",j);
else if(!N1[1]) printf("1/2");
else if(t) printf("1-0");
else printf("0-1");
while(kbhit()) getch();
Teclado:
c2=c=c1; //Casilla de origen
for(x=576;x--;)
if(*(Q[c]+i[x])==f[c]) *(Q[c]+i[x])=7+t;
while(!(E=getch()));
if(E==27&&!j) return 0;
if(E!=13){
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;
for(v=576;v--;)
if(*(Q[c]+i[v])==7+t) *(Q[c]+i[v])=f[c];
if(y=(E=='+'&&ply<8)-(E=='-'&&ply>2)) ply+=y;
else goto Teclado;
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][v=y=0]!=c1) goto Eleccion;
while(++v<ply){
gotoxy(26+(t+v)%2*11,4+2*v);
if((w=L[x][v])<1) break;
printf("%3u",w);
}
if(!w) printf("1/2");
if(w<0) if((t+(y=v-1))%2) printf("0-1");
else printf("1-0");
do{
n=586+2560*(g=4+2*y);
if((d=M[x][y+1])>0) n-=34;
else d=-d;
c2=d%64;
printf("%c[%u;32f%c%u",27,g,97+c2%8,c2/8+1);
if((a=d/64)>1) for(v=13;v--;n-=320)
for(w=13;w--;*(q+n+w)=figura[v][a-2][w]);
}while(y--);
F[t][0]=8-t;
for(v=576;v--;*(Q[c2]+i[v])=F[t][p[a][v]]);
while(!(E=getch()));
g=A[P[c2]]; //Pieza a capturar
F[w=T[P[c2]]>0][0]=f[c2];
for(v=576;v--;*(Q[c2]+i[v])=F[w][p[g][v]]);
for(y=ply;y--;)
for(d=!y;d<3-!y;d++)
for(n=5120*(y+2)+X[d],v=15;v--;)
for(n-=320,w=d==1?55:31;w--;*(q+n+w)=0);
if(E==27) goto Teclado;
if(E!=13) goto Eleccion;
aa[0]=A[P[c1]]=a; //Posibilitar al paso
Z[0]=(c=c1-c2)/8*ix[t];
if(aa[0]<2&&c%8&&g>6){
C[P[c=C2[0]]]=64;
P[c]=0;
for(v=576;v--;*(Q[c]+i[v])=f[c]);
}
K[C1[0]=c1]=K[C2[0]=c2]=1; //Casillas usadas
do{
C[P[c=c1]]=c2;
C[P[c2]]=64;
P[c2]=P[c];
P[c]=0;
for(v=576;v--;*(Q[c]+i[v])=f[c]);
a=A[P[c2]];
F[t][0]=f[c2];
for(v=576;v--;*(Q[c2]+i[v])=F[t][p[a][v]]);
if(a==2) if(c2-c==2) c1+=3;
else if(c-c2==2) c1-=4;
c2=(c+c2)/2;
}while(c!=c1);
t=!t;
goto Inicio;
}
Comentarios sobre la versión: 2.6 (0)
No hay comentarios