Laberinto C++

Iniciado por JCanseco7, 25 Septiembre 2016, 08:03 AM

0 Miembros y 1 Visitante están viendo este tema.

JCanseco7

¿Alguien me podría ayudar con este código?

Necesito que se genere solo una entrada y una salida.
En el código actual se genera más de un camino a la vez y necesito que sea solo uno conectado con la entrada y salida.  :-\

Agrego: Estoy compilando en Borland C++

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <stdlib.h>
#include <time.h>

int lab[11][11];
int iniciocol=0, iniciofila=0, fincol=0, finfila=0, caminfila=0, camincol=0, decidir=0, pared=1, espacio=0;

main(){
/*se asignan paredes*/
  for(int i=0; i<12; i++){
   for(int j=0; j<12;j++){
lab[i][j] = pared;
        }
     }
   
 
/*se genera el inicio*/
  srand(time(NULL));
  iniciocol = (1+rand()%(11-1));
  if (iniciocol == 0) {
    iniciofila = (1+rand()%(11-1));
  } else {
    iniciofila = 0;
  }

  /*Asignamos la entrada y salida y declaramos para empezar a crear el camino*/
  lab[iniciofila][iniciocol] = espacio;
  caminfila = iniciofila++;
  camincol = iniciocol;
  lab[caminfila][camincol] = espacio;
 
  /*Creamos el camino*/
while(caminfila < 11 && camincol < 11){
decidir = rand()%4;
if (decidir == 0){ /*camino se fabrica a la izquierda*/
camincol = camincol-1;
lab[caminfila][camincol] = espacio;
} else if(decidir ==1 ) { /*camino para abajo*/
caminfila++;
lab[caminfila][camincol] = espacio; /*camino a la derecha*/
} else if (decidir == 2){
camincol++;
lab[caminfila][camincol];
}

}

  /*muestra el laberinto*/
  for(int i=0; i<12; i++){
    for(int j=0; j<12;j++){
if(lab[i][j] == pared){
cout<<"#";
cout<<" ";
} else {
cout<<".";
cout<<" ";
}
     }
  cout<<"\n";
  }
  getchar();
}

Nucleorion

No entiendo lo que haces.

A mi compilando tu codigo me da esto:

Citar# # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # .
. # # # . . . # # # # #

Cual es el resultado esperado? No veo ningun camino en el laberinto

MAFUS

Vale, muchas cosas:
No compruebas que estás en los bordes del laberinto, que significa que habrías salido. Solo haces una comprobación en el while(caminfila < 11 && camincol < 11) de que no estás fuera de las dimensiones de la tabla.

Las operaciones de inicio del camino están un poco mal. Tu dices:
iniciocol = (1+rand()%(11-1));
if (iniciocol == 0) {
    iniciofila = (1+rand()%(11-1));
} else {
    iniciofila = 0;
}


inicioco nunca valdrá 0 puesto que ese 1+... ya hace que el valor sea al menos 1, con lo que nunca se entrará en el else.
De igual forma 1+rand()%(11-1) puede darse el caso de que valga 11 con lo que estarías en la esquina del laberinto, y al poder moverte solamente Sur, Este, Oeste, cualquier movimiento que hicieras te dejaría a la salida del laberinto.

Realmente te sobran variables:
iniciocol, iniciofila, fincol, finfila están de más. Puedes empezar solo con camincol y caminfila e ir actualizándolas.

En 'Creamos el camino' la operación decidir = rand%4 está mal porqué después en la elección de opciones solo tienes en cuenta los números del 0 al 2, entonces debería ser decidir = rand%3

De igual forma ahí la estructura if - else la puedes sustituir por un switch y aclararás el código, además de usar la estructura correcta para el propósito que buscas.

En 'se asignan paredes' y 'muestra el laberinto' te sales de los límites de la tabla. Deberías moverte desde 0 hasta 10 y te mueves de 0 hasta 11, tanto en horizontal como en vertical.

JCanseco7

Bueno, gracias por la ayuda, hice varias modificaciones y ahora ya consigo que me genere un camino, pero ahora que lo ejecuto no me muestra automáticamente la solución.
Código (cpp) [Seleccionar]
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <stdlib.h>
#include <time.h>

int lab[12][12];
int iniciocol=0, iniciofila=0, caminfila=0, camincol=1, decidir=0, pared=1, espacio=0, yapaso=2, novolver=3;

main(){
/*se asignan paredes*/
   for(int i=0; i<12; i++){
    for(int j=0; j<12;j++){
lab[i][j] = pared;
         }
      }

/*se genera el inicio*/
srand(time(NULL));
iniciofila = (1+rand()%(6-1));

/*Asignamos la entrada y declaramos el pasillo de entrada*/
lab[iniciofila][iniciocol] = espacio;
caminfila = iniciofila;
lab[caminfila][camincol] = espacio;

   /*Creamos el camino*/
while(caminfila < 11 && camincol < 11){
decidir = rand()%3;
if (decidir == 0){ /*camino se fabrica a la izquierda*/
camincol = camincol-1;
if(camincol < 1){
camincol = camincol+1;
} else {
lab[caminfila][camincol] = espacio;
camincol++;
}
}

     if(decidir ==1 ) { /*camino para abajo*/
caminfila++;
lab[caminfila][camincol] = espacio;
} else if (decidir == 2){   /*camino a la derecha*/
camincol++;
lab[caminfila][camincol] = espacio;
}

}

/*Se crean caminos falsos*/
for(int i=1; i<11; i++){
for(int j=1;j<11;j++){
if (lab[i][j] != espacio) {
decidir = rand()%2;
if(decidir==0){
lab[i][j] = espacio;
}
}
}
}

/*Se resuelve el laberinto*/
lab[iniciofila][iniciocol] = yapaso;
caminfila = iniciofila;
camincol = iniciocol;
while(caminfila<12){
if(lab[caminfila+1][camincol] == espacio){
caminfila++;
lab[caminfila][camincol] = yapaso;
} else if(lab[caminfila][camincol+1] == espacio){
camincol++;
lab[caminfila][camincol] = yapaso;
} else if(lab[caminfila-1][camincol] == espacio){
caminfila--;
lab[caminfila][camincol] = yapaso;

} else if(lab[caminfila][camincol-1] == espacio){
camincol--;
lab[caminfila][camincol] = yapaso;
} else if((lab[caminfila+1][camincol] != espacio) && (lab[caminfila][camincol+1] != espacio) && (lab[caminfila-1][camincol] != espacio)){
lab[caminfila][camincol] = novolver;
camincol--;
} else if((lab[caminfila+1][camincol] != espacio) && (lab[caminfila][camincol+1] != espacio) && (lab[caminfila][camincol-1] != espacio)){
lab[caminfila][camincol] = novolver;
caminfila--;
} else if((lab[caminfila+1][camincol] != espacio) && (lab[caminfila][camincol+1] != espacio) && (lab[caminfila-1][camincol] != espacio)){
lab[caminfila][camincol] = novolver;
camincol++;
} else if((lab[caminfila-1][camincol] != espacio) && (lab[caminfila][camincol+1] != espacio) && (lab[caminfila-1][camincol] != espacio)){
lab[caminfila][camincol] = novolver;
caminfila++;
}
}


   /*muestra el laberinto*/
   for(int i=0; i<12; i++){
    for(int j=0; j<12;j++){
if(lab[i][j] == pared){
cout<<"#";
cout<<" ";
} else if((lab[i][j] == espacio) || lab(lab[i][j] == novolver)) {
cout<<".";
cout<<" ";
} else if (lab[i][j] == yapaso){
cout<<"X";
cout<<" ";
}
  }
    cout<<"\n";
   }
   getchar();
}

Nucleorion

El la linea 102 tienes:

Código (cpp) [Seleccionar]
} else if((lab[i][j] == espacio) || lab(lab[i][j] == novolver)) {

Deberia ser:

Código (cpp) [Seleccionar]
} else if((lab[i][j] == espacio) || (lab[i][j] == novolver)) {

No?