Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: erickgracia en 8 Agosto 2014, 17:18 pm



Título: Rompecabezas numerico
Publicado por: erickgracia 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;
}
}
}


Título: Re: Rompecabezas numerico
Publicado por: ivancea96 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;.


Título: Re: Rompecabezas numerico
Publicado por: erickgracia 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:)


Título: Re: Rompecabezas numerico
Publicado por: ivancea96 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)