// JUEGO DEL 8 PUZZLE
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <dos.h>
typedef struct tableros
{
int tabla[4][4];
struct tableros *sig;
};
typedef struct tableros tablero;
tablero inicio,final,*hijos;
int ix,iy;
void busca_inicio(int x, int y)
{
int j,k;
for (j=0;j<4;j++)
{
for (k=0;k<4;k++)
{
if (inicio.tabla[j][k]==0)
{
iy=j;
ix=k;
break;
}
}
}
gotoxy(x,y);
printf ("x=%d,y=%d",ix+1,iy+1);
}
void tabla_inicio(int x,int y)
{
int j,k,l,m,c;
int pass=0;
randomize();
for (j=0;j<4;j++)
{
for (k=0;k<4;k++)
{
gotoxy(x+k*5,y+j);
pass=0;
while(1)
{
inicio.tabla[j][k]=random(16);
for (l=0;l<=j;l++)
{
if (j==0)
c=k;
else
c=4;
if (l==j) c=k;
for (m=0;m<c;m++)
{
if (inicio.tabla[j][k]==inicio.tabla[l][m])
pass++;
}
}
if (pass==0)
break;
else
pass=0;
}
printf ("%d",inicio.tabla[j][k]);
}
}
}
void tabla_final(int x,int y)
{
int j,k;
int cont=1;
for (j=0;j<4;j++)
{
for (k=0;k<4;k++)
{
gotoxy(x+k*5,y+j);
final.tabla[j][k]=cont++;
if (j==3 && k==3) final.tabla[j][k]=0;
printf("%d",final.tabla[j][k]);
}
}
}
int meta(tablero uno,tablero dos)
{
int j,k;
for (j=0;j<4;j++)
{
for (k=0;k<4;k++)
{
if (uno.tabla[j][k]!=dos.tabla[j][k])
return 0;
}
}
return 1;
}
tablero *agregar_lista()
{
int j,k;
tablero *aux=(tablero *)malloc(sizeof(tablero)),*otro;
if (aux==NULL)
{
printf ("No existe suficiente Memoria");
exit(1);
}
for (j=0;j<4;j++)
{
for (k=0;k<4;k++)
{
aux->tabla[j][k]=inicio.tabla[j][k];
}
}
aux->sig=NULL;
if (hijos==NULL)
hijos=aux;
else
{
for (otro=hijos;otro->sig!=NULL;otro=otro->sig);
otro->sig=aux;
}
return aux;
}
void presenta(tablero cual,int x, int y)
{
int j,k;
for (j=0;j<4;j++)
{
for (k=0;k<4;k++)
{
gotoxy(x+k*5,y+j);
printf ("%d ",cual.tabla[j][k]);
}
}
}
int derecha()
{
busca_inicio(1,1);
if (ix==3) return 0;
inicio.tabla[iy][ix]=inicio.tabla[iy][ix+1];
inicio.tabla[iy][ix+1]=0;
return 1;
}
int izquierda()
{
busca_inicio(1,1);
if (ix==0) return 0;
inicio.tabla[iy][ix]=inicio.tabla[iy][ix-1];
inicio.tabla[iy][ix-1]=0;
return 1;
}
int arriba()
{
busca_inicio(1,1);
if (iy==0) return 0;
inicio.tabla[iy][ix]=inicio.tabla[iy-1][ix];
inicio.tabla[iy-1][ix]=0;
return 1;
}
int abajo()
{
busca_inicio(1,1);
if (iy==0) return 0;
inicio.tabla[iy][ix]=inicio.tabla[iy+1][ix];
inicio.tabla[iy+1][ix]=0;
return 1;
}
void copiar(tablero *destino,tablero fuente)
{
int j,k;
for (j=0;j<4;j++)
{
for (k=0;k<4;k++)
{
destino->tabla[j][k]=fuente.tabla[j][k];
}
}
}
int es_repetido(tablero cual)
{
tablero *aux;
for (aux=hijos;aux!=NULL;aux=aux->sig)
{
if (meta(cual,*aux))
return 1;
}
return 0;
}
int movimiento(int x, int y)
{
char movimientos;
tablero aux;
copiar(&aux,inicio);
if (derecha()&&!es_repetido(inicio))
{
presenta(inicio,x,y);
delay(300);
movimientos='D';
if (meta(inicio,final))
{
printf ("%c",movimientos);
return 1;
}
agregar_lista();
if(movimiento(1,10))
{
printf ("%c",movimientos);
return 1;
}
}
else
{
copiar(&inicio,aux);
}
if (izquierda()&&!es_repetido(inicio))
{
presenta(inicio,x,y);
delay(300);
movimientos='I';
if (meta(inicio,final))
{
printf ("%c",movimientos);
return 1;
}
agregar_lista();
if(movimiento(1,10))
{
printf ("%c",movimientos);
return 1;
}
}
else
copiar(&inicio,aux);
if (arriba()&&!es_repetido(inicio))
{
presenta(inicio,x,y);
delay(300);
movimientos='A';
if (meta(inicio,final))
{
printf ("%c",movimientos);
return 1;
}
agregar_lista();
if(movimiento(1,10))
{
printf ("%c",movimientos);
return 1;
}
}
else
{
copiar(&inicio,aux);
}
if (abajo()&&!es_repetido(inicio))
{
presenta(inicio,x,y);
delay(300);
movimientos='Ab';
if (meta(inicio,final))
{
printf ("%c",movimientos);
return 1;
}
agregar_lista();
if(movimiento(1,10))
{
printf ("%c",movimientos);
return 1;
}
}
else
{
copiar(&inicio,aux);
}
return 0;
}
int main(void )
{
clrscr();
hijos=NULL;
tabla_inicio(5,2);
getch();
tabla_final(40,2);
getch();
busca_inicio(1,1);
gotoxy(1,22);
if (meta(inicio,final))
{
printf ("Es igual inicio y Final");
getch();
return 0;
}
else
{
printf ("Comenzara la Busqueda");
}
agregar_lista();
movimiento(5,10);
getch();
return 1;
}