elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Rompecabezas numerico
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Rompecabezas numerico  (Leído 3,313 veces)
erickgracia

Desconectado Desconectado

Mensajes: 17


Ver Perfil
Rompecabezas numerico
« en: 8 Agosto 2014, 17:18 pm »

Hola buenos días, tardes... me encuentro armando un rompecabezas numericos, de eso que tienes que acomodar los numeros moviendolos de uno en uno. El problema que tengo es que al intentar hacer movimientos, al presionar las flechas de arriba o la flecha izquierda, esta funcion se repite hasta que recorre todos los números en esa fila/columna :huh: , creo que va a ser algo en las funciones de mover para  arriba o para abajo, que tienen en comun el "num-1", pero no se exactamente que hace eso o el porque... de antemano gracias y perdonen algunas anomalías en el codigo en caso de haber, soy prinicipante en esto de la programación  ;D

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


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Rompecabezas numerico
« Respuesta #1 en: 8 Agosto 2014, 19:32 pm »

No sales del bucle. En el switch, al acabarlo, los bucles siguen activados.
En vez de break;, pon return;.


En línea

erickgracia

Desconectado Desconectado

Mensajes: 17


Ver Perfil
Re: Rompecabezas numerico
« Respuesta #2 en: 9 Agosto 2014, 23:42 pm »

No sales del bucle. En el switch, al acabarlo, los bucles siguen activados.
En vez de break;, pon return;.


gracias :) , me funcionó  a la perfección, pero en sí cual es la diferencia entre el break; y el return; ? sería algo así como que el return en el switch ( o en cualquier otra función) la lleva a su fin mientras que break terminas un simple proceso?(que no  entiendo como aplicó en los bucles  :huh:)
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Rompecabezas numerico
« Respuesta #3 en: 9 Agosto 2014, 23:44 pm »

El break sale de bucles for, while, y sentencias switch.
El return, retorna al función. Es decir, sale de la función, y retorna el valor que sea (salvo que sea void)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Rompecabezas con el Sonido
Multimedia
LorD_QetzaL 6 4,579 Último mensaje 11 Noviembre 2009, 22:34 pm
por LorD_QetzaL
El rompecabezas de la Stasi
Noticias
wolfbcn 1 1,823 Último mensaje 21 Junio 2013, 10:30 am
por -- KiLiaN --
Dividir una imagen en piezas de rompecabezas
Java
trobador789 0 2,316 Último mensaje 19 Mayo 2013, 14:47 pm
por trobador789
Este espeluznante rompecabezas criptográfico inquieta a los internautas
Noticias
wolfbcn 3 2,371 Último mensaje 21 Octubre 2015, 14:22 pm
por Pablo Videla
Un nuevo rompecabezas surge en la Red: ¿Adónde escaparon las piernas de una ...
Noticias
wolfbcn 1 1,683 Último mensaje 28 Diciembre 2016, 16:19 pm
por Pirata LOL
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines