saludos
Código:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<math.h>
#include<time.h>
#define num 4
#define arriba 72
#define abajo 80
#define izquierda 75
#define derecha 77
void generar_rompecabezas();
void imprimir_rompecabezas();
void comprobar_completo();
void mover();
void desordenar();
int main(){
int puzzle[num][num],reg=0, mov;
//unsigned char mov;
generar_rompecabezas(puzzle);
desordenar(250,puzzle);
imprimir_rompecabezas(puzzle);
do{
system("cls");
imprimir_rompecabezas(puzzle);
comprobar_completo(puzzle, reg);
if(reg==0){
mov=getch();
mover(mov,puzzle);
}
else{
system("cls");
printf("Completado");
}
}
while(reg!=1);
getch();
return 0;
}
void generar_rompecabezas(int puzzle[num][num]){
int aux=1;
int x,y;
for(x=0;x<num;x++){
for(y=0;y<num;y++){
puzzle[x][y]=aux;
if(x==num-1 && y==num-1){
puzzle[x][y]=0;
}
//printf("matriz %d %d = %d\n",x,y,puzzle[x][y]);
aux++;
}
}
}
void imprimir_rompecabezas(int puzzle[num][num]){
int x,y;
for(x=0;x<num;x++){
if(x==0)
printf("\t\t\t---------------------\n");
printf("\t\t\t|");
for(y=0;y<num;y++){
if(puzzle[x][y]<10){
printf(" ");
}
if(puzzle[x][y]==0)
printf(" |");
else
printf(" %d |", puzzle[x][y]);
}
printf("\n");
printf("\t\t\t---------------------\n");
}
}
void comprobar_completo(int puzzle[num][num],int reg){
int x,y;
int aux=1;
int z=num*num;
for(x=0;x<num;x++){
for(y=0;y<num;y++){
if(puzzle[x][y]==aux){
aux++;
}
}
}
if(aux==z){
printf("resuelto");
reg=1;
}
else{
printf("No Resuelto");
reg=0;
}
}
void mover(int direccion, int puzzle[num][num]){
int x,y,aux;
for(x=0;x<num;x++){
for(y=0;y<num;y++){
if(puzzle[x][y]==0){
switch(direccion){
case izquierda:
if(y!=num-1){
aux=puzzle[x][y];
puzzle[x][y]=puzzle[x][y+1];
puzzle[x][y+1]=aux;
printf("\nMovimiento izquierda\n");
}
break;
case derecha:
if(y!=0){
//printf("%d a cambiar con %d",puzzle[x][y], puzzle[x][y-1]);
aux=puzzle[x][y];
puzzle[x][y]=puzzle[x][y-1];
puzzle[x][y-1]=aux;
printf("\nMovimiento derecha\n");
}
break;
case arriba:
if(x!=num-1){
aux=puzzle[x][y];
puzzle[x][y]=puzzle[x+1][y];
puzzle[x+1][y]=aux;
printf("\nMovimiento Arriba\n");
}
break;
case abajo:
if(x!=0){
aux=puzzle[x][y];
puzzle[x][y]=puzzle[x-1][y];
puzzle[x-1][y]=aux;
printf("\nMovimiento abajo\n");
}
break;
}
}
}
}
}
void desordenar(int cantidad, int puzzle[num][num]){
int x,opc;
srand (time(NULL));
for(x=0;x<cantidad;x++){
opc=(rand()%4+1);
switch(opc){
case 1:
mover(arriba, puzzle);
break;
case 2:
mover(abajo, puzzle);
break;
case 3:
mover(izquierda, puzzle);
break;
case 4:
mover(derecha, puzzle);
break;
}
}
}