Puzzle

Consiste en un tablero de 4x4 casillas con números ordenados del 1 al 15, no contiene el 16 por simular el espacio, que trata principalmente en mostrar al usuario un tablero desordenado para que éste lo ordene en la menor cantidad de movimientos posibles


#include<stdio.h> 
#include<stdlib.h> 
#include<time.h> 
#include<conio.h> 
#define FLECHA 224 // Codigo Ascii común a flecha (esto es copia de otro posteo XD) 
#define IZQUIERDA 75 // Codigo Ascii flecha izquierda 
#define DERECHA 77 // Codigo Ascii flecha derecha 
#define ARRIBA 72 // Codigo Ascii flecha arriba 
#define ABAJO 80 // Codigo Ascii flecha abajo 
#define N 4 
void imprime(int puzzle[N][N]){ 
int i,j; 
printf("\nnttt *-----------------------*n"); 
for(i=0;i<N;i++){ 
printf("ttt |"); 
for(j=0;j<N;j++){ 
if(puzzle[i][j]==0) 
printf(" |"); 
else 
printf("%3d |",puzzle[i][j]); 
printf("n"); 
if(i<3) 
printf("ttt ------+-----+-----+------n"); 
printf("ttt *-----------------------*nnn"); 
char tecla (unsigned char pulsacion){ 
if (pulsacion==224) //se hace esta condición por si no se llegase a ingresar flechas para mover 
pulsacion=getch(); 
return pulsacion; 
void mover(int puzzle[N][N],int mov){// Realiza movimientos el usuario 
int i,j,k,l,aux; 
for(k=0;k<N;k++)//encontramos el lugar donde no hay nada para tener los indices de posicion 
for(l=0;l<N;l++) 
if(puzzle[k][l]==0){ 
i=k; 
j=l; 
while((mov==80 && i==0)||(mov==75 && j==3)||(mov==77 && j==0)||(mov==72 && i==3)||(mov!=80 && mov!=75 && mov!=77 && mov!=72)){ 
system("cls"); 
imprime(puzzle); 
printf("nnt Presione las flechas para realizar movimientos (%c%c%c%c)",27,24,25,26); 
mov=tecla(getch()); 
if(mov==80){ // movimiento abajo 
aux=puzzle[i][j]; 
puzzle[i][j]=puzzle[i-1][j]; 
puzzle[i-1][j]=aux; 
i=i-1; 
else if(mov==75){ // movimiento izquirda 
aux=puzzle[i][j]; 
puzzle[i][j]=puzzle[i][j+1]; 
puzzle[i][j+1]=aux; 
j=j+1; 
else if(mov==77){ // movimiento derecha 
aux=puzzle[i][j]; 
puzzle[i][j]=puzzle[i][j-1]; 
puzzle[i][j-1]=aux; 
j=j-1; 
else{ // movimiento arriba 
aux=puzzle[i][j]; 
puzzle[i][j]=puzzle[i+1][j]; 
puzzle[i+1][j]=aux; 
i=i+1; 
 
void desordena(int puzzle[N][N],int dific){ 
int i,j,k,alea; 
int aux; 
i=3; 
j=3; 
for(k=0;k<dific;k++){ 
do{ 
alea=rand()%4; //Genero aleatorio para posicion de arreglo movimiento 
}while((alea==0 && i==0)||(alea==1 && j==3)||(alea==2 && j==0)||(alea==3 && i==3)); 
switch(alea){ 
case 0: // movimiento abajo 
aux=puzzle[i][j]; 
puzzle[i][j]=puzzle[i-1][j]; 
puzzle[i-1][j]=aux; 
i=i-1; 
break; 
case 1: // movimiento izquirda 
aux=puzzle[i][j]; 
puzzle[i][j]=puzzle[i][j+1]; 
puzzle[i][j+1]=aux; 
j=j+1; 
break; 
case 2: // movimiento derecha 
aux=puzzle[i][j]; 
puzzle[i][j]=puzzle[i][j-1]; 
puzzle[i][j-1]=aux; 
j=j-1; 
break; 
case 3: // movimiento arriba 
aux=puzzle[i][j]; 
puzzle[i][j]=puzzle[i+1][j]; 
puzzle[i+1][j]=aux; 
i=i+1; 
break; 
void genera_puzzle(int puzzle[N][N]){ 
int i,j,num; 
num=1; 
for(i=0;i<N;i++){ 
for(j=0;j<N;j++){ 
puzzle[i][j]=num; 
num++; 
if(i==3 && j==3) 
puzzle[i][j]=0; 
int correcto(int puzzle[N][N]){//ve si el puzzle esta resuelto 
int i,j,num,flag; 
num=1; 
flag=1; 
for(i=0;i<N;i++) 
for(j=0;j<N;j++){ 
if(i==3 && j==3) 
num=0; 
if(puzzle[i][j]!=num) 
flag++; 
num++; 
return(flag); 
main() 
// Declaraciones 
int n,i,dific,cont; 
int puzzle[N][N]; //Arreglo con puzzle 
int continuar; 
unsigned char mov;//se declara como unsigned char porque el código ascii no imprimible de las flechas 
//es 224 y un simple char solo soporta ascii entre 0 y 127 y con la 
//declaracion de insigned char soporta codigo ascii entre 0 y 225 
time_t t; 
time(&t); 
srand(t); 
 
// Algoritmo 
 
genera_puzzle(puzzle); 
do{ 
printf("[1] Faciln"); 
printf("[2] Intermedion"); 
printf("[3] Dificiln"); 
printf("Ingrese dificultad: "); 
dific=getch(); 
system("cls"); 
}while(dific!=49 && dific!=50 && dific!=51); 
if(dific==49) 
dific=200; 
else if(dific==50) 
dific=500; 
else 
dific=900; 
do{ // para corroborar que realmente se ha desordenado 
desordena(puzzle,dific); 
continuar=correcto(puzzle); 
}while(continuar==1); 
cont=0;// contador de jugadas 
system("color 70"); 
do{ 
do{ 
system("cls"); 
imprime(puzzle); 
printf("nnt Presione las flechas para realizar movimientos (%c%c%c%c)",27,24,25,26); 
mov=tecla(getch()); 
printf("n"); 
}while(mov!=ABAJO && mov!=IZQUIERDA && mov!=DERECHA && mov!=ARRIBA); 
mover(puzzle,mov); 
continuar=correcto(puzzle); 
cont++; 
}while(continuar!=1); 
system("cls"); 
imprime(puzzle); 
system("color 07"); 
sleep(400); 
printf(" %c%c%c%c%c %c%c%c%c %c %c %c%c%c%c%c %c %c%c%c %c %c%c%c %c%c%c%c %c%c%c%c%cn",1,1,1,1,1,2,2,2,2,1,2,1,1,1,1,1,2,1,1,1,2,1,1,1,2,2,2,2,1,1,1,1,1); 
system("color 70"); 
sleep(400); 
printf(" %c %c %c %c %c %c %c %c %c %c %c %cn",1,2,1,1,1,1,2,2,1,1,2); 
system("color 07"); 
sleep(400); 
printf(" %c%c %c%c %c %c %c %c %c %c %c%c%c%c%c %c %c %c%c %c%c%c%c%cn",1,1,2,2,1,2,1,2,1,1,2,2,2,2,2,1,1,2,2,1,1,1,1,1); 
system("color 70"); 
sleep(400); 
printf(" %c %c %c %c %c %c %c %c %c %c %c %c %c %cn",1,2,1,2,1,2,1,1,2,2,1,1,2,1); 
system("color 07"); 
sleep(400); 
printf(" %c %c%c%c%c%c %c%c%c%c%c %c %c%c%c%c%c %c %c%c%c %c %c %c%c%c %c%c%c%c%c %c%c%c%c%cn",1,2,2,2,2,2,1,1,1,1,1,2,1,1,1,1,1,2,1,1,1,2,2,1,1,1,2,2,2,2,2,1,1,1,1,1); 
system("color 70"); 
sleep(400); 
printf("nttt Total movimientos: %dnntt ",cont); 
system("color 07"); 
sleep(400); 
system("pause"); 
/* 
Se declara a la variable mov como unsigned char debido a que un simple char 
solo acepta código ascii entre 0 y 127, lo cual no nos sirve, debido a que 
los caracteres no imprimibles están comprendidos entre 0 y 225, siendo el 
código ascii común de las flechas el número 224, pero el específico de cada 
flecha serían los siguientes: 
Abajo : 80 
Izquierda : 75 
Derecha : 77 
Arriba : 72 
*/