Damas inglesas (Checkers)
C/Visual C
Actualizado el 31 de Octubre del 2020 por Adelino (27 códigos) (Publicado el 18 de Febrero del 2019)
15.715 visualizaciones desde el 18 de Febrero del 2019
Simulador del juego de damas.
#include<dos.h>
#include<time.h>
#include<stdio.h>
#include<conio.h>
char pieza[][16]=
{" 222222 ",
" 2222222222 ",
" 222222222222 ",
" 22222222222222 ",
" 22222222222222 ",
"2222222222222222",
"2222222222222222",
"2222222222222222"};
char posicion[][3][8]=
{".p.p.p.p",".d......","........",
"p.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.P.P.","........","D......."};
char E,far*Q[64],far*q=(char far*)0xA0000000;
char N1[128],N2[128]; //Origen,direccion=Destino
char G[64][4],H[128]; //Alcance
char L[99][10],J[10][10]; //Control de jugadas
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 C1[99],C3[99],D[99],e[99],pc3[99];
int M[99][10],M1[10][10],M2[10]; //Secuencia
int P[64],C2[10],Z[10],z[10];
int a[10],i[576],l[99];
int m[99][10],p[288],pc1[10];
int f[65]={1},I[][2]={1,0,25,24}; //Blancas 1 a I[0][1]
int S[3][3][2]={0,15,0,0,0,14,0,0,0,0,0,4}; //Color
int V[]={1,-1,1,-1,1,-1,1,-1,1,-1};
int W[]={0,99,0,99,0,99,0,99,0,99};
int X[]={26,30,37,41}; //Tabulacion
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 c=64,g=7,ply=1;
int j,n,t,v,w,x,y,c1,c2;
void Figura(F,F1,F2,F3){
S[F1][F2][0]=S[2][0][1]=F3;
for(n=288;n--;)
*(Q[F]+i[n])=*(Q[F]+i[575-n])=S[F1][F2][p[n]];
}
void Total(F,F1,F2,F3){
gotoxy(26+11*F1,4+2*g);
if(F>0) printf("%3u",F);
else if(t&&!F2||!t&&F2) printf("1-0");
else printf("0-1");
if(F3) gotoxy(30,4+2*v),
printf("%c%u-",97+F3/64%8,F3/64/8+1),
printf("%c%u",97+c2%8,(c2=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--;)
for(g=4;g--;y=x){
if(!v&&g<3&&g) x=1219;
else x=5120*v+948+8*X[g];
if(g>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);
}
for(g=v=0;v<8;v++)
for(w=8;w--;){
J[8-v][w+1]=c--;
B[c]=b[v]; //posicion[v][?=0,1,...][w]
if(i[n=posicion[v][0][w]])
y=I[x=i[n]>3][!x]+=!x-x,
A[y]=(i[n]-1)%3,
C[y]=c,
P[c]=y,
T[y]=x;
}
for(v=576;v--;i[v]=320*y+v%24)
if((y=v/24)>3&&y<12&&(x=v%24)>3&&x<20)
if(n=pieza[y-4][x-4]-32) p[v]=n-17;
do{
if(w=x=c%8) f[c+1]=f[c]=4-f[c-1];
Q[c]=q+54720+24*x-7680*(v=y=c/8);
Figura(c,T[P[c]],A[P[c]],f[c]);
if(f[c]<2) for(n=4;n--;v=y,w=x,G[c][n]=g++)
while(j=J[(v+=iy[n])+1][(w+=ix[n])+1])
if(++H[g]<2) N1[g]=j-1;
else if(H[g]<3) N2[g]=j-1;
}while(++c<64);
Inicio:
ti=time(NULL)-1;
for(v=10;v--;m[0][v]=M2[v]=0)
for(w=10-v;w--;J[w][v+w]=W[w]);
Z[j=n=0]=1;
pc1[0]=I[t][0]; //Primera pieza
Origen:
C1[c=10*n]=C[pc1[n]]; //Casilla de la pieza
if(C1[c]>63) goto Siguiente;
P[C1[c]]=0;
a[n]=A[pc1[n]]; //Tipo de pieza
D[c]=d1[a[n]]; //Direccion inicial
Destino:
g=G[C1[c]][D[c]];
if(!H[g]) goto Direccion;
c1=N1[g];
if(Z[n]){
if(T[P[c1]]!=!t||H[g]<2) goto Direccion;
if(P[c2=N2[g]]) goto Direccion;
Z[n]=2;
if(n==ply&&++J[0][n]) goto Direccion;
if(z[n]) e[c-1]=1;
pc3[c]=P[c1];
C3[c]=c1;
C[P[c1]]=64;
P[c1]=0;
z[n]++;
C1[++c]=c2;
D[c]=d1[a[n]];
goto Destino;
}
if(P[c2=c1]||n==ply&&++J[0][n]) goto Direccion;
Simulacion:
C[pc1[n]]=C2[n]=c2; //Pieza a destino
P[c2]=pc1[n];
if(B[c2]==t) A[pc1[n]]=2; //Promocion
Z[++n]=1;
pc1[n]=I[t=!t][0];
goto Origen;
Direccion:
if(D[c]++<d2[a[n]]) goto Destino;
if(z[n]){
c2=C1[c--];
z[n]--;
if(!e[c]) goto Simulacion;
P[C3[c]]=pc3[c];
C[pc3[c]]=C3[c];
e[c]=0;
goto Direccion;
}
C[pc1[n]]=C1[10*n];
P[C1[10*n]]=pc1[n];
Siguiente:
if(pc1[n]++<I[t][1]) goto Origen; //Pieza siguiente
if(Z[n]==1&&(pc1[n]=I[t][Z[n]=0])) goto Origen;
if(!J[0][n]) for(M2[x=y=n]=1,y*=n<4;--x>0;)
M1[y][x]=C1[10*x]*64+C2[x];
if(n--){
J[y=0][n]++; //Jugadas posibles
if(!n){
for(v=10;v--;M2[v]=0)
m[j][v]=!Z[0]||v>z[0]?0:C3[v];
while(y++<ply)
if(L[j][y]=J[y-1][x=y]) M[j][y-1]=0;
else{
for(v=y=ply;--v;M[j][v]=M1[x][v]);
if(x%2!=y%2) L[j][++x]=99;
}
M[j][0]=C1[0]*64+C2[0];
l[j++]=x;
}
else do{ //Minimax
c=J[y][x=n+y+1]-J[y+1][x];
if(V[y]!=(c<0)-(c>0)) continue;
J[y+1][x]=J[y][x];
if(y==2&&M2[v=n+3])
for(M2[v]=0;--v;M1[n+3][v]=M1[0][v]);
}while(++y<ply-n);
for(v=n;v++<ply;) //Reinicio de contadores
for(w=ply-v+1;w--;J[w][v+w]=W[w]);
t=!t;
P[C2[n]]=0;
c=10*n+z[n];
if(Z[n]) P[C3[c]]=pc3[c],
C[pc3[c]]=C3[c];
if(A[pc1[n]]>a[n]) A[pc1[n]]=t;
goto Direccion;
}
for(v=11;v--;)
for(w=3;w--;)
printf("%c[%u;%uf%*c",27,4+2*v,X[w],X[w+1]-X[w]-1,32);
Total(c=j,t,g=0,0);
printf("%c[%u;%ufN=%u",27,n=4+2*g,26+11*t,g=ply+1);
printf("%c[%u;30f%5.f%c",27,n,difftime(time(NULL),ti),34);
while(c--){ //Ordenar maximos o minimos
for(x=y=j;y--;)
if(l[y]>0)
if(x==j) x=y;
else{
v=L[x][l[x]];
w=L[y][l[y]];
if(V[ply]==(v<w)-(v>w)) x=y;
if(v==w) if(l[x]>l[y]&&ply%2) x=y;
else if(l[x]<l[y]&&ply%2<1) x=y;
}
n=l[x];
l[x]=-(n-=L[x][n]>98);
if((v=++g)<11)
Total(L[x][n],(t+ply)%2,n%2,M[x][0]);
}
c1=j?M[0][0]/64:63*t;
while(kbhit()) getch();
Teclado:
c2=c=c1; //Casilla de origen
Figura(c,x=T[P[c]],y=A[P[c]],7+t);
while(!(E=getch()));
if(E==27) return 0;
if(E==13) x=-1;
else{
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;
Figura(c,x,y,f[c]);
if(y=(E=='+'&&ply<8)-(E=='-'&&ply>1)) 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][0]/64!=c1) goto Eleccion;
for(g=1-l[x];--g;)
Total(L[x][g],(t+g)%2,g%2,M[x][v=g-1]);
Figura(c2,t,A[P[c1]],8-t);
while(!(E=getch()));
if(c2!=c1) Figura(c2,2,0,1);
for(v=ply+1;v--;)
for(w=!v;w<3-!v;w++)
printf("%c[%u;%uf%*c",27,4+2*v,X[w],X[w+1]-X[w]-1,32);
if(E==27) goto Teclado;
if(E!=13) goto Eleccion;
if(B[c2]==t) A[P[c1]]=2; //Promocion
C[P[c1]]=c2;
P[c2]=P[c1];
Figura(c2,t,A[P[c2]],1);
if(c2!=c1) P[c1]=0,
Figura(c1,2,0,1);
for(y=10;y--;)
if(c=m[x][y]) C[P[c]]=64,
P[c]=0,
Figura(c,2,0,1);
t=!t;
goto Inicio;
}
No hay comentarios