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",
"2222222222222222",
"2222222222222222",
"2222222222222222",
"2222222222222222",
" 22222222222222 ",
" 22222222222222 ",
" 222222222222 ",
" 2222222222 ",
" 222222 "};
char posicion[][2][8]=
{".p.p.p.p",".d......",
"p.p.p.p.","........",
".p.p.p.p",".D......",
"........","..D.....",
"........","........",
"P.P.P.P.","........",
".P.P.P.P","........",
"P.P.P.P.","........"};
char E,far*Q[64];
char far*q=(char far*)0xA0000000;
char N[64][4][2]; //Origen,direccion,alcance=Destino
char H[64][4]; //Alcance
char k[12][12],p[576]; //(0PB,1PN,2D,3vacia)
int A[25],C[25]={64},T[25]={2}; //Tipo,casilla,bando
int B[64],b[]={0,3,3,3,3,3,3,1}; //Promocion
int L[100][9],J[9][9]; //Control de jugadas
int M[100][9],M1[9][9],M2[9]; //Secuencia
int P[64],C1[9],C2[9],C3[9]; //Piezas
int I[][2]={1,0,25,24}; //Blancas de 1 a I[0][1]
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 a[9],D[9]; //Rutina principal
int i[576],f[65]={1};
int ix[13]={-1,1,1,-1};
int iy[13]={1,1,-1,-1};
int Z[9],pc1[9],pc3[9];
int d1[]={0,2,0};
int d2[]={1,3,3};
int z[]={46,80,46,68,46,112,100};
int c=64,g=7,ply=3;
int d,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(v=576;v--;*(Q[F]+i[v])=S[F1][F2][p[v]]);
}
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) c2=F3%64,
printf("%c[%u;%uf%c",27,4+2*d,30,97+F3/64%8),
printf("%u-%c%u",F3/64/8+1,97+c2%8,c2/8+1);
}
int main(){
_AX=0x13;
geninterrupt(0x10);
time_t ti;
printf("%c[2;26fBlancas Negras",27);
while(i[z[g]]=g--);
for(v=0;v<8;v++)
for(w=8;w--;){
k[9-v][w+2]=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<21&&(x=v%24)>3&&x<20)
if(n=pieza[y-4][x-4]-32) p[v]=n-17;
do{
if(x=c%8) f[c+1]=f[c]=4-f[c-1];
Q[c]=q+54720+24*x-7680*(y=c/8);
Figura(c,T[P[c]],A[P[c]],f[c]);
for(d=4;d--;){
v=y+2;
w=x+2;
while(n=k[v+=iy[d]][w+=ix[d]])
if(H[c][d]<2) N[c][d][H[c][d]++]=n-1;
}
}while(++c<64);
for(v=13;v--;n=v%2,ix[v]=n-!n,iy[v]=100*!n)
for(d=4;d--;y=x){
if(!v&&d<3&&d) x=1219;
else x=5120*v+948+8*X[d];
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--;M2[v]=0)
for(w=9-v;w--;J[w][v+w]=iy[w]);
pc1[n=1]=I[t][Z[1]=j=0]; //Primera pieza
Origen:
C1[n]=C[pc1[n]]; //Casilla de la pieza
if(C1[n]>63) goto Siguiente;
P[C1[n]]=0;
a[n]=A[pc1[n]]; //Tipo de pieza
D[n]=d1[a[n]]; //Direccion inicial
Destino:
x=H[C1[n]][D[n]];
if(!x) goto Direccion;
c2=N[C1[n]][D[n]][0];
if(Z[n]!=1){
if(T[P[c1=c2]]!=!t||x<2) goto Direccion;
if(P[c2=N[C1[n]][D[n]][1]]) goto Direccion;
Z[n]=2;
}
if(!P[c2])
if(n==ply) J[1][n]++;
else{
if(a[n]<2&&B[c2]==t) A[pc1[n]]=2; //Promocion
C[pc1[n]]=C2[n]=c2; //Pieza a destino
P[c2]=pc1[n];
if(Z[n]>1) C[pc3[n]=P[c1]]=64,
P[C3[n]=c1]=0;
pc1[n]=I[t=!t][Z[++n]=0];
goto Origen;
}
Direccion:
if(D[n]++<d2[a[n]]) goto Destino;
C[pc1[n]]=C1[n];
P[C1[n]]=pc1[n];
Siguiente:
if(pc1[n]++<I[t][1]) goto Origen; //Pieza siguiente
if(!Z[n]++)
if(pc1[n]=I[t][0]) goto Origen;
if(!J[1][n]) for(M2[x=y=n]=1,x*=n<5;--y>1;)
M1[x][y]=C1[y]*64+C2[y];
if(--n){
t=!t;
if(Z[n]>1) P[C3[n]]=pc3[n],
C[pc3[n]]=C3[n];
P[C2[n]]=0;
J[1][n]++; //Jugadas posibles
if(y=n>1)
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(M2[x=n+3])
for(M2[x]=0;--x>1;M1[n+3][x]=M1[0][x]);
}while(y++<ply-n);
else{
while(y++<ply)
if(L[j][x]=(w=J[x=y-1][y])) M[j][x]=M2[y]=0;
else for(v=y=ply;--v>1;M2[v+1]=0)
M[j][v]=M1[x+1][v];
if(!w&&ix[x]==ix[ply]) L[j][++x]=100;
M[j][0]=A[pc1[1]];
M[j][1]=C1[1]*64+C2[1];
L[j++][0]=x;
}
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]]>a[n]) A[pc1[n]]=t;
goto Direccion;
}
for(y=11;y--;)
for(d=3;d--;)
printf("%c[%u;%uf%*c",27,4+2*y,X[d],X[d+1]-X[d]-1,32);
Total(c=j,t,g=0,0);
printf("%c[%u;%ufN=%u",27,n=4+2*g,26+11*t,g=ply);
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]>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)) x=y;
else if(v==w&&L[x][0]>L[y][0]) x=y;
}
n=L[x][0];
L[x][0]=-(n-=L[x][n]>99);
if((d=++g)<11)
Total(L[x][n],(!t+ply)%2,n%2,M[x][1]);
}
while(kbhit()) getch();
c1=63*t;
Teclado:
c2=c=c1; //Casilla de origen
Figura(c,T[P[c]],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,T[P[c]],A[P[c]],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][1]/64!=c1) goto Eleccion;
for(d=-L[x][0];d--;)
Total(L[x][g],(t+g)%2,g%2,M[x][g=d+1]);
Figura(c2,t,M[x][0],8-t);
while(!(E=getch()));
Figura(c2,2,0,f[c2]);
for(y=ply;y--;)
for(d=!y;d<3-!y;d++)
printf("%c[%u;%uf%*c",27,4+2*y,X[d],X[d+1]-X[d]-1,32);
if(E==27) goto Teclado;
if(E!=13) goto Eleccion;
A[P[c1]]=M[x][0]; //Promocion
C[P[c1]]=c2;
P[c2]=P[c1];
P[c1]=0;
Figura(c1,2,0,f[c1]);
Figura(c2,t,A[P[c2]],f[c2]);
if((c=c1+c2)%2<1) C[P[c/=2]]=64,
P[c]=0,
Figura(c,2,0,f[c]);
t=!t;
goto Inicio;
}
No hay comentarios