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.714 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 ficha[][16]={
" 222222 ",
" 2222222222 ",
" 222222222222 ",
" 22222222222222 ",
" 22222222222222 ",
"2222222222222222",
"2222222222222222",
"2222222222222222"};
char posicion[][3][8]={
".p.p.p.p","........","........",
"p.p.p.p.","....d...","..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.","........","........"};
char R[][3]={"1-0","0-1"};
char far*Q,far*q=(char far*)0xA0000000;
char E,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],z[99][10];
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 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 f[65]={1},I1[]={1,25},I2[]={0,24}; //Blancas 1 a I2[0]
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 C1[100],C3[100],D[100],e[100],pc3[100];
int C2[12],P[64],V[20],W[20],Z[12];
int M[99][12],m[12][12]; //Secuencia
int a[12],i[576],l[99],pc1[12];
int c=63,g=6,w=2,y=57595,ply=5;
int d,j,n,t,v,x;
void Borrar(F){
for(v=F/2+1;v--;)
for(n=w=F<20?!v:0;w<3-n*t;w++)
printf("%c[%u;%uf%*c",27,2*v+4,X[w],X[w+1]-X[w]-1,32);
}
void Figura(F,F1,F2,F3){
S[F1][F2][0]=S[2][0][1]=F3;
Q=q+54720+F%8*24-F/8*7680;
for(w=288;w--;)
*(Q+i[w])=*(Q+i[575-w])=S[F1][F2][p[w]];
}
void Total(F,F1,F2,F3){
gotoxy(F1%2*11+26,w=g>ply?2*g+6-(ply+!t)/2*2:F1/2*2+4);
F?printf("%3u",F):printf("%.3s",R[t==F2%2]);
if(!F3) return;
if(g<=ply) gotoxy(34-F1%2*4,(g-!t)/2*2+4);
else printf("%c[%u;30f%c%u-",27,w,F3/64%8+97,F3/64/8+1);
printf("%c%u",d%8+97,(d=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--;w=2,y-=5000)
do{
x=!v&&w?1219:5120*v+8*X[w]+947;
for(n=16;n--;*(q+x+320*n)=*(q+y+320*n)=7);
for(n=y+1-x,y=x;n--;*(q+x+n)=*(q+x+n+5120)=7);
}while(w--);
for(v=20;v--;w=v%2,V[v]=!w-w,W[v]=99*w);
for(v=0;v<8;v++)
for(w=8;w--;J[8-v][w+1]=c+1,B[c--]=b[v])
if(n=i[posicion[v][1][w]]) //posicion[v][?=0,1,...][w]
y=n>3?--I1[x=1]:++I2[x=0],
A[y]=--n%3,
C[y]=c,
P[c]=y,
T[y]=x;
for(c=g=v=w=y=0;y<24;y++,w+=296)
for(x=24;x--;i[v++]=w++)
if(y>3&&y<12&&x>3&&x<20)
if(n=ficha[y-4][x-4]-32) p[v]=n-17;
do{
if(c%8) f[c+1]=f[c]=4-f[c-1];
Figura(c,T[P[c]],A[P[c]],f[c]);
for(d=f[c]<2?4:0;d--;G[c][d]=g++)
if(x=c%8+1)
if(y=c/8+1)
while(j=J[y+=iy[d]][x+=ix[d]])
if(H[g]<2) N[g][H[g]++]=j-1;
}while(++c<64);
Inicio:
ti=time(NULL)-1;
for(x=v=ply+1;v--;)
for(w=x-v;w--;J[w][v+w]=W[w]);
Z[j=n=0]=1;
pc1[0]=I1[t]; //Primera ficha
Origen:
d=C1[c=10*n]=C[pc1[n]]; //Casilla de la ficha
if(d>63) goto Siguiente;
P[d]=0;
a[n]=A[pc1[n]]; //Tipo de ficha
D[c]=d1[a[n]]; //Direccion inicial
Destino:
g=G[C1[c]][D[c]];
if(!H[g]) goto Direccion;
y=P[d=N[g][0]];
if(Z[n]){
if(T[y]!=!t||H[g]<2||P[N[g][1]]) goto Direccion;
if(n==ply&&++J[0][n]) goto Direccion;
++Z[n]>2?e[c-1]=1:Z[n]++;
C[y]=64;
C3[c]=d;
P[d]-=pc3[c]=y;
C1[++c]=N[g][1];
D[c]=d1[a[n]];
goto Destino;
}
if(y||n==ply&&++J[0][n]) goto Direccion;
Simulacion:
C[pc1[n]]=C2[n]=d; //Ficha a destino
P[d]=pc1[n];
if(B[d]==t) A[pc1[n]]=2; //Promocion
Z[++n]=1;
pc1[n]=I1[t=!t];
goto Origen;
Direccion:
if(D[c]++<d2[a[n]]) goto Destino;
if(Z[n]>2){
d=C1[c--];
Z[n]--;
if(!e[c]) goto Simulacion;
C[pc3[c]]=C3[c];
P[C3[c]]=pc3[c];
e[c]=0;
goto Direccion;
}
C[pc1[n]]=C1[c];
P[C1[c]]=pc1[n];
Siguiente:
if(pc1[n]++<I2[t]) goto Origen; //Ficha siguiente
if(Z[n]==1&&Z[n]--)
if(pc1[n]=I1[t]) goto Origen;
if(n){
if(!J[0][w=n--]&&n&&J[n-w%2][w])
for(v=w;--v;m[w][v]=C2[v]);
J[0][n]++;
if(!n){
for(v=10;v--;z[j][v]=v<Z[0]-1?C3[v]:0);
for(y=0;++y<x;)
if(L[j][l[j]=v=y]=J[y-1][y]) M[j][y]=0;
else for(L[j][w=y+1]=99,y=x;--w;)
M[j][w]=m[v][w]+64;
L[j][0]=v+(ply+v)%2;
M[j++][0]=C1[0]*64+C2[0];
}
else for(y=0;++y<x-n;w++) //Minimax
if(v=J[y-1][w]-J[y][w])
if(V[y]==(v>0)-(v<0)) J[y][w]+=v;
for(v=x;--v>n;) //Reinicio de contadores
for(w=x-v;w--;J[w][v+w]=W[w]);
c=10*n;
P[d=C2[n]]=0;
if(Z[n]) C[pc3[c]]=C3[c+=Z[n]-2],
P[C3[c]]=pc3[c];
if(B[d]==(t=!t)) A[pc1[n]]=a[n];
goto Direccion;
}
Borrar(20);
Total(n=j,t,g=0,0);
printf("%c[%u;%ufN=%u",27,v=(g+t)/2*2+6,11*t+26,g=ply);
printf("%c[%u;30f%5.f%c",27,v,difftime(time(NULL),ti),34);
while(n--){ //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)?x:y;
else if(v=l[x]-l[y])
x=V[l[x]]==(v>0)-(v<0)?x:y;
if(++g<(ply+!t)/2+10)
Total(L[x][l[x]],ply+t,l[x],M[x][0]);
l[x]*=y;
}
c=M[0][0]/64;
Teclado:
Figura(d=c,T[y],A[y=P[c]],7+t);
while(kbhit()) getch();
while(!(E=getch()));
if(E==27&&getch()==E) return 0;
if(E==77&&c<63) c++;
if(E==75&&c) c--;
if(E==72&&c<56) c+=8;
if(E==80&&c>7) c-=8;
if(x=E!=13) Figura(d,T[y],A[y],f[d]);
ply+=n=(E=='+'&&ply<9)-(E=='-'&&ply>1);
if(!n)
if(x--) goto Teclado;
else{
Eleccion:
x+=V[E==75];
if(x==j||x<0) if(c==d) goto Teclado;
else x=x<0?j-1:0;
if(M[x][0]/64!=c) goto Eleccion;
for(g=1-l[x];--g;)
Total(L[x][g],g+t,g,M[x][g-1]);
Figura(d,t,A[y],8-t);
while(!(E=getch()));
Borrar(ply+t);
if(c!=d) Figura(d,2,0,1);
if(E==27) goto Teclado;
if(E!=13) goto Eleccion;
P[C[y]=d]=y;
if(B[d]==t) A[y]=2; //Promocion
Figura(d,t,A[y],1);
if(c!=d) Figura(c,2,P[c]=0,1);
for(v=10;v--;)
if(c=z[x][v]) C[P[c]]=64,
Figura(c,2,P[c]=0,1);
t=!t;
}
goto Inicio;
}