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
*/