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.640 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[10][61][8],Y[10][10];
int D[10],X[10],V[10],W[10];
int A[10],K[16],k[16];
int C[10]={10},ply[10]={9};
int c,d,n,t,v,w,x,y=1;
void figura(f,F){
printf("%c[%u;%um",27,0,F);
printf(R,27,y=5+f/3*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);
v+=(E==43)-(E==45);
v=!A[c]?1:!E+!v||w?A[c]:v>A[c]?1:v;
printf("%c[0m",27);
for(y=16;y--;printf(R,27,K[y],k[y],y%2?" ":" "));
if(x=X[c]+1)
printf(R,27,K[y],k[y=f+2*x-1],t==x%2?"0-1":"1-0"),
printf("%c[%u;%ufN§ %u",27,K[14],k[14],v);
for(x+=!x;x--;)
printf(R,27,K[y],k[y=f+2*x],T[x?N[c][v-1][x-1]:c]);
E=getch();
}
int main(){
textmode(C40);
_setcursortype(_NOCURSOR);
for(v=9;v--;ply[y]=y++)
printf("%c[20;%uf%c",27,7+v%3*6,T[y][0]=97+v%3),
printf("%c[%u;2f%c",27,16-v/3*5,T[y][1]=49+v/3);
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=6+v/4*2,x=25+v%4*4-w,w?"---":"--");
for(v=4;v--;printf(R,27,4+v*5,5,"----- ----- -----"));
Inicio:
for(v=x=ply[d]+1;--v>n;) //Reinicio de contadores
for(w=x-v;w--;Y[w][v+w]=W[w]);
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=0]=10;
t=!t;
break;
default: if(x=X[c]-d++) C[0]=N[c][A[c]][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: A[c=C[0]]=0;
X[c]=d=y-1;
if(d+=!y) C[0]=10;
break;
case 1: N[c][y=A[c]++][x=X[c]-1]=C[0];
while(x--) N[c][y+1][x]=N[c][y][x];
break;
default: N[c][A[c]][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;
}
Comentarios sobre la versión: 1.1 (0)
No hay comentarios