3 en raya
C/Visual C
Actualizado el 30 de Octubre del 2024 por Adelino (27 códigos) (Publicado el 27 de Agosto del 2024)
5.665 visualizaciones desde el 27 de Agosto del 2024
Juego de Tres en raya en pantalla de texto.


#include<stdio.h>
#include<conio.h>
char P[]="123456789147258369159357";
char E,T[10][3],R[]="%c[%u;%uf%s";
int H[10][4],I[2][8],G[10];
int N[241][10],Y[10][10];
int A[10],B[10],C[10]={10};
int D[10],X[10],V[10],W[10];
int K[16],k[16],ply[10]={9};
int a,c,d,n,t,v,w,x,y=1;
void figura(f,F){
printf("%c[%u;%um",27,0,F);
printf(R,27,y=f/3*5+5,x=18-f%3*6," ");
printf(R,27,++y,--x," ");
printf(R,27,++y,x," ");
printf(R,27,++y,++x," ");
}
void plasmar(f){
figura(c-1,40);
do c+=w=(E==75)-(E==77);
while(D[c=c>9?1:!c?9:c]);
figura(c-1,t?41:47);
printf("%c[0m",27);
a+=(E==43)-(E==45);
if(a>B[c]) a=A[c];
if(!E||w||a<A[c]) a=B[c];
for(v=16;v--;printf(R,27,K[v],k[v],v%2?" ":" "));
printf(R,27,K[f],k[f],T[c]);
for(v=w=X[c]+1;v--;)
if(v) printf(R,27,K[x],k[x=2*v+f],T[N[a][v-1]]);
else printf(R,27,K[x],k[x=2*w+f-1],t==w%2?"0-1":"1-0"),
printf("%c[%u;%ufN§ %u",27,K[14],k[14],a-A[c]+1);
E=getch();
}
int main(){
textmode(C40);
_setcursortype(_NOCURSOR);
for(v=9;v--;ply[y]=y++)
printf("%c[20;%uf%c",27,v%3*6+7,T[y][0]=v%3+97),
printf("%c[%u;2f%c",27,16-v/3*5,T[y][1]=v/3+49);
printf(R,27,3,25,"Blancas Rojas");
printf(R,27,4,25,"------- -------");
for(v=24;v--;H[w][G[w=P[v]-48]++]=v/3);
for(v=10;v--;W[v]=w=v%2,V[v]=!w-w);
for(w=1,v=16;v--;K[v]=y-1,k[v]=x,w=!w)
printf(R,27,y=v/4*2+6,x=v%4*4+25-w,w?"---":"--");
for(v=4;v--;printf(R,27,v*5+4,5,"----- ----- -----"));
Inicio:
for(v=w=ply[d]+1;--v>n;) //Reinicio de contadores
for(x=w-v;x--;Y[x][v+x]=W[x]);
while(y=--C[n]) //Casilla siguiente
if(!D[y]){
D[y]=C[++n]=10;
for(x=G[y];x--;)
if(++I[t][H[y][x]]>2) C[n]=1;
if(n==ply[d]&&C[n]>1) C[n]=Y[0][n]=1;
t=!t;
}
switch(n){
case 0: switch(d){
case 0: while(E!=13) plasmar(t+t);
if(--ply[0]*X[c]==0) return 0;
for(x=G[c];x--;I[t][H[c][x]]++);
D[c]=C[E=a=0]=10;
t=!t;
break;
default: if(x=X[c]-d++) C[0]=N[a-1][x-1];
else C[d=0]=c;
}
break;
case 1: for(n=x=y=0;!y&&ply[d]>x++;)
if(!Y[x-1][x]) y=x;
if(d>y) break;
switch(d){
case 0: X[c=C[0]]=d=y-1;
A[c]=B[c]=a;
if(d+=!y) C[0]=10;
break;
case 1: N[B[c]=a++][X[c]-1]=C[0];
for(x=X[c];x--;N[a][x]=N[a-1][x]);
break;
default: N[a][X[c]-d--]=C[0];
C[0]=10;
}
break;
default: Y[y=0][--n]=1; //Minimax
for(x=n+1;ply[d]-n>y++;x++)
if(V[y]==Y[y-1][x]-Y[y][x])
Y[y][x]+=V[y];
}
if(C[n]<10){
t=!t;
D[y=C[n]]=0;
for(x=G[y];x--;I[t][H[y][x]]--);
}
goto Inicio;
}
No hay comentarios