// 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; }