#include<dos.h>
#include<time.h>
#include<stdio.h>
#include<conio.h>
char pieza[][16]={
" 222222 ",
" 2222222222 ",
" 222222222222 ",
" 22222222222222 ",
" 22222222222222 ",
"2222222222222222",
"2222222222222222",
"2222222222222222"};
char far*Q=(char far*)0xA0000000,far*q=Q+49612;
char G[42],H[42][16];
char L[9][12],J[12][12]; //Control de jugadas
char E,p[288];
int A[12],C[6][7],I[2][69];
int M[9][12],m[12][12]; //Secuencia
int B[7],b[12],i[576],l[9];
int S[3]={7,4,0}; //Color
int V[]={1,-1,1,-1,1,-1,1,-1,1,-1};
int W[]={0,2,0,2,0,2,0,2,0,2};
int X[]={26,30,37,41}; //Tabulacion
int ix[]={0,1,1,1};
int iy[]={1,1,0,-1};
int c=41,g=69,y=57595,ply=6;
int d,j,n,t,v,w,x,z;
void Borrar(F){
for(v=F;v--;)
for(n=w=F<11?!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){
for(Q=q+F%7*24-F/7*7680,v=288;v--;)
*(Q+i[v])=*(Q+i[575-v])=p[v]?S[F1]:F<42;
}
void Total(F,F1,F2){
gotoxy(v=F1%2*11+26,F1/2*2+4);
if(g>ply) gotoxy(v,w=2*g+6-(ply+!t)/2*2),
F1=!t;
else w=(g-!t)/2*2+4;
if(!F) if(ply&&z>41) printf("1/2");
else if(t!=F2%2) printf("1-0");
else printf("0-1");
if(c--) gotoxy(34-F1%2*4,w),
printf("%c%u",c%7+97,c/7+1);
}
int main(){
_AX=0x13;
geninterrupt(0x10);
time_t ti;
printf("%c[2;26fBlancas Rojas",27);
for(v=12;v--;y-=5000)
for(w=3;w--;y=x){
if(!v&&w) x=1219;
else x=5120*v+8*X[w]+947;
for(n=y+1-x;n--;*(Q+x+n)=*(Q+x+n+5120)=7);
for(n=16;n--;*(Q+x+320*n)=*(Q+y+320*n)=7);
}
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 Figura(c,2);
while(C[c/7][c%7]=c--);
for(y=6;y--;)
for(x=7;x--;printf("%c[%u;%uf%c",27,24,3*x+4,x+97))
for(d=4;d--;)
if((v=x+3*ix[d])<7&&(w=y+3*iy[d])>=0&&w<6)
for(--g,n=4;n--;H[c][G[c]++]=g)
c=C[w-n*iy[d]][v-n*ix[d]];
Inicio:
ti=time(NULL)-1;
for(x=v=ply+1;v--;)
for(w=x-v;w--;J[w][v+w]=W[w]);
b[j=n=0]=v; //Primera fila
Origen:
while(++b[n]<7) //Fila siguiente
while(B[b[n]]<6)
if(n==ply&&(b[n]=6)&&(J[0][n]=1)) break;
else{
c=A[n]=C[B[b[n]]++][b[n]]; //Casilla de la ficha
b[++n]=0;
for(g=G[c];g--;)
if(++I[t][H[c][g]]>3) b[n]=6;
t=!t;
if(b[n]) break;
}
if(n){
if(!J[y=0][w=n--]&&n&&J[n-w%2][w])
for(v=w;--v;m[w][v]=A[v]);
if(!n){
while(y++<ply)
if(L[j][v=l[j]=y]=J[y-1][y]) M[j][y-1]=0;
else for(L[j][y+1]=2,w=y=ply;--w;)
M[j][w]=m[v][w]+1;
L[j][0]=(ply+v)%2+v;
M[j++][0]=A[0]+1;
}
else for(;y++<ply-n;w++) //Minimax
if(v=J[y-1][w]-J[y][w])
if(V[y]==(v>0)-(v<0)) J[y][w]=J[y-1][w];
for(v=x;--v>n;) //Reinicio de contadores
for(w=x-v;w--;J[w][v+w]=W[w]);
t=!t;
J[0][n]=1;
B[b[n]]--;
for(g=G[c=A[n]];g--;I[t][H[c][g]]--);
goto Origen;
}
Borrar(11);
Total(n=j,t,c=g=0);
while(!j) if(getch()==27) return 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);
do{ //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;
else if(G[M[x][0]-1]<G[M[y][0]-1]) x=y;
c=M[x][0];
if(n==j) d=x;
if(++g<(ply+!t)/2+10)
Total(L[x][l[x]],ply+t,l[x]);
l[x]*=-1;
}while(--n);
do{
Borrar((ply+t)/2+1);
for(g=1-l[d];--g;Total(L[d][g],g+t,g))
c=M[d][g-1];
Figura(c%7+42,t);
while(kbhit()) getch();
while(!(E=getch()));
Figura(c%7+42,2);
if(E!=13) ply+=g=(E=='+'&&ply<9)-(E=='-'&&ply>1),
d*=(d-=E==75?d>0:-1)<j;
else{
Figura(c,t);
B[c%7]++;
for(g=G[c];g--;)
if(++I[t][H[c][g]]>3) ply=0;
t=++z%2;
}
}while(!g);
goto Inicio;
}
Comentarios sobre la versión: 1.0 (0)
No hay comentarios