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.p",".D......","........",
"........","..D.....","..d.....",
"........","........","........",
"P.P.P.P.","........","..P.p...",
".P.P.P.P","........","........",
"P.P.P.P.","........","........"};
char E,far*Q[64],far*q=(char far*)0xA0000000;
char N1[256],N2[256]; //Origen,direccion=Destino
char H[256]; //Alcance
char k[12][12],p[288]; //(0PB,1PN,2D)
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 G[64][4],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],D[9],Z[9];
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 V[]={-1,1,-1,1,-1,1,-1,1,-1};
int W[]={100,0,100,0,100,0,100,0,100};
int X[]={26,30,37,41}; //Tabulacion
int d1[]={0,2,0};
int d2[]={1,3,3,0};
int f[65]={1};
int ii[]={46,80,46,68,46,112,100};
int ix[13]={-1,1,1,-1};
int iy[13]={1,1,-1,-1};
int a[9],i[576],l[100],pc1[9],pc3[9];
int c=64,g=7,ply=4;
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(v=288;v--;)
*(Q[F]+i[v])=*(Q[F]+i[575-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,
gotoxy(30,4+2*v),
printf("%c%u-%c%u",97+F3/64%8,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[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(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<12&&(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(n=4;n--;){
v=y+2;
w=x+2;
G[c][n]=++g;
while(H[g]<2&&(j=k[v+=iy[n]][w+=ix[n]]))
if(!H[g]++) N1[g]=j-1;
else N2[g]=j-1;
}
}while(++c<64);
Inicio:
ti=time(NULL)-1;
for(v=9;v--;M2[v]=0)
for(w=9-v;w--;J[w][v+w]=W[w]);
pc1[Z[1]=n=1]=I[t][j=0]; //Primera pieza
Origen:
C1[n]=C[pc1[n]]; //Casilla de la pieza
if(C1[n]>63&&(a[n]=D[n]=3)) goto Siguiente;
a[n]=A[pc1[n]]; //Tipo de pieza
D[n]=d1[a[n]]; //Direccion inicial
Destino:
g=G[C1[n]][D[n]];
if(!H[g]) goto Siguiente;
c2=N1[g];
if(Z[n]){
if(T[P[c2]]!=!t||H[g]<2) goto Siguiente;
if(P[c2=N2[g]]) goto Siguiente;
Z[n]=2;
}
else if(P[c2]) goto Siguiente;
if(n==ply&&(++J[1][n])) goto Siguiente;
P[C1[n]]=0;
C[pc1[n]]=C2[n]=c2; //Pieza a destino
P[c2]=pc1[n];
if(Z[n]>1) C[pc3[n]=P[N1[g]]]=64,
P[C3[n]=N1[g]]=0;
if(a[n]<2&&B[c2]==t) A[pc1[n]]=2; //Promocion
Z[++n]=1;
pc1[n]=I[t=!t][0];
goto Origen;
Siguiente:
if(D[n]++<d2[a[n]]) goto Destino;
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[1][n]) for(M2[x=y=n]=1,x*=n<5;--y>1;)
M1[x][y]=C1[y]*64+C2[y];
if(--n){
J[y=1][n]++; //Jugadas posibles
if(n<2){
while(y++<ply)
if(L[j][x]=(w=J[x=y-1][y])) M[j][x]=0;
else for(v=y=ply;--v>1;)
M[j][v]=M1[x+1][v];
if(!w&&V[x]==V[ply]) L[j][++x]=100;
M[j][0]=A[pc1[1]];
M[j][1]=C1[1]*64+C2[1];
l[j++]=x;
for(v=ply;v--;M2[v]=0);
}
else do{ //Minimax
x=J[y][n+y]-J[y+1][n+y];
if(V[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);
for(v=n;v<ply;v++) //Reinicio de contadores
for(w=0;w++<ply-v;J[w][v+w]=W[w]);
t=!t;
C[pc1[n]]=C1[n];
P[C1[n]]=pc1[n];
P[C2[n]]=0;
if(Z[n]>1) P[C3[n]]=pc3[n],
C[pc3[n]]=C3[n];
if(A[pc1[n]]>a[n]) A[pc1[n]]=t;
goto Siguiente;
}
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);
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<1) x=y;
else if(l[x]<l[y]&&ply%2) x=y;
}
n=l[x];
l[x]=-(n-=L[x][n]>99);
if((v=++g)<11)
Total(L[x][n],(!t+ply)%2,n%2,M[x][1]);
}
while(kbhit()) getch();
c1=j?M[0][1]/64: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(v=-l[x];v--;)
Total(L[x][g],(t+g)%2,g%2,M[x][g=v+1]);
Figura(c2,t,M[x][0],8-t);
while(!(E=getch()));
Figura(c2,2,0,f[c2]);
for(v=ply;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;
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