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.","....d...","........",
".p.p.p.p","........",".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 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],m[99][12],M1[12][12];
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][12]; //Secuencia
int P[64],C2[12],Z[12];
int a[12],i[576],l[99],pc1[12];
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=5;
int j,n,t,v,w,x,y,c1,c2;
void Borrar(F){
for(v=F;v--;)
for(n=w=!v*(F<11);w<3-n;w++)
printf("%c[%u;%uf%*c",27,4+2*v,X[w],X[w+1]-X[w]-1,32);
}
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(v=26+F1%2*11,4+F1/2*2);
if(n=g>ply) gotoxy(v,w=6+2*g-(ply+!t)/2*2);
if(F>0) printf("%3u",F);
else if(t!=F2%2) printf("1-0");
else printf("0-1");
if(!F3) return;
if(!n) gotoxy(34-F1%2*4,4+(g-!t)/2*2);
else printf("%c[%u;30f%c%u-",27,w,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][1][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(v=x=c%8) f[c+1]=f[c]=4-f[c-1];
Q[c]=q+62400+24*x-7680*(w=y=c/8+1);
Figura(c,T[P[c]],A[P[c]],f[c]);
if(f[c]<2) for(n=4;n--;v=x,w=y,G[c][n]=g++)
while(j=J[w+=iy[n]][(v+=ix[n])+1])
if(H[g]<2) N[g][H[g]++]=j-1;
}while(++c<64);
Inicio:
ti=time(NULL)-1;
for(v=10;v--;)
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=N[g][0];
if(Z[n]){
if(T[P[c1]]!=!t||H[g]<2) goto Direccion;
if(P[c2=N[g][1]]) goto Direccion;
if(n==ply&&++J[0][n]) goto Direccion;
if(++Z[n]>2) e[c-1]=1;
else Z[n]++;
pc3[c]=P[c1];
C3[c]=c1;
C[P[c1]]=64;
P[c1]=0;
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]>2){
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[c];
P[C1[c]]=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(n){
if(!J[0][n]) for(x=n;--x;M1[n][x]=C2[x]);
J[y=0][--n]++; //Minimax
if(n) do if(w=J[y][x=n+y+1]-J[y+1][x])
if(V[y]==(w<0)-(w>0))
J[y+1][x]=J[y][x];
while(++y<ply-n);
else{
for(x=10;x--;m[j][x]=C3[x]*(x<Z[0]-1));
while(y++<ply)
if(L[j][l[j]=y]=J[y-1][y]) M[j][y-1]=0;
else for(L[j][y+1]=99,x=y=ply;--x;)
M[j][x]=M1[l[j]][x]+64;
L[j][0]=l[j]+(l[j]+ply)%2*!x;
M[j++][0]=C1[0]*64+C2[0];
}
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;
if(Z[n]) P[C3[c+=Z[n]-2]]=pc3[c],
C[pc3[c]]=C3[c];
if(A[pc1[n]]>a[n]) A[pc1[n]]=t;
goto Direccion;
}
Borrar(11);
Total(c=j,t,g=0,0);
printf("%c[%u;%ufN=%u",27,n=6+(g+t)/2*2,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)
if(x==j) x=y;
else{
v=L[x][L[x][0]];
w=L[y][L[y][0]];
if(V[ply]==(v<w)-(v>w)) x=y;
if(v==w&&l[x]%2==l[x]>l[y]) x=y;
}
if(++g<10+(ply+!t)/2)
Total(L[x][l[x]],ply+t,l[x],M[x][0]);
l[x]*=-1;
}
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<9)-(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],g+t,g,M[x][g-1]);
Figura(c2,t,A[P[c1]],8-t);
while(!(E=getch()));
if(c2!=c1) Figura(c2,2,0,1);
Borrar((ply+t)/2+1);
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