Logo elrincondelc.com
curso de programación en c
Foros de programación en C
Inicio :: Código fuente
Usuario: Clave: Regístrate

Valoración
10

PUZZLE

codigo enviada por: wipysk8 (2007-06-13 20:23:42)
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 
*/ 
me tira un error y un warnir con el el 'sleep' q sera??
(est3ban_5 2007-07-17 21:25:13)
el sleep tienes que escribirlo con la 's' en mayuscula asi: Sleep(400) es increible!!! yo sudé todo un rio para encontrar ese error copie y pegue (en el borland) una gran cantidad de programas de ejemplos con el sleep y ninguno me corria.. es Absurdo que la gente publique un EJEMPLO y que no funcione.... esta bien fino el programa!!! existe otro detalle, ahi que colocarle las barras diagonales [ ] antes de las letras n y t para los espacios.
(ritshuko 2008-03-04 09:10:51)
se me olvidaba que tambien falta la libreria #include_windows.h_ para poder correr la funcion Sleep()... 8-)
(ritshuko 2008-03-04 14:32:12)
Muy interesante programa ya lo eh corregido con las indicaciones que mencionan, pero mi duda seria que si este mismo codigo podria servirme para realizar un puzzle 8 (3x3)??? eh intentado cambiar el valor al arreglo pero al ejecutarse el programa se bloquea!!
(salazar 2008-03-16 20:26:58)
undeclared identifier en sleep(400); checalo
(jinx 2008-04-28 07:43:02)
eso de faltar las barras invertidas es culpa del sistema de este sitio web. hay que ponerlas duplicadas \\
(irtusb 2008-06-28 17:51:10)
este script tiene varios errores por culpa de la web, los he solucionado todos , les dejo el codigo solucionado aqui : http://f2.net84.net/puzzle.rar
(chwc 2008-10-04 16:08:05)
no uses conio.h , tu codigo no es portable !!!
(polly 2008-12-11 06:01:13)
http://rapidshare.com/files/251613154/puzzle.cpp.html ahi esta con las correcciones que sugirieron arriba..
(skilltik 2009-07-03 15:02:21)
hola soy angel tengo problemas para correr este programa en turbo c ya que al introducir el nivel no corre se queda trabado el programa que puedo hace ayuda necesito ese progrma corriendo ya que tengo mas de dos semanas y no encuentro el problema el compilador no marca error solamente al correrlo se queda en introducir las flechas ayuda por favor estoy desesperado dejo mi correo por si alguien puede mandarme la solucin porfavor.......... angel_esquivel_muela@hotmail.com
(veneno88 2009-09-10 16:14:57)
gracias esta bueno solo hay que hacerle unas correcciones despues de eso compila bien
(juan manuel 2010-05-22 20:25:49)
hola necesito cierta ayuda quien quiera que este conectado ayúdeme en esta parte
(zombistroke 2012-12-01 12:25:50)

Para enviar comentarios debes estar registrado.

(c) ElRincondelC.com, 1999-2007

Un proyecto de Urlan Heat : proyectos de Internet y soporte para el comercio electrónico.