Buenas que tal!
Eh mejorado un poco el código
Lo eh echo auto suficiente jaja
Este se busca la salida solo XD
Puedes cambiar el mapa a gusto.
Es algo ineficiente aun, lo estoy puliendo cosillas como cuando encuentra una calle sin salida, le tarda algo en volver al camino, pero lo encuentra.
Aquí le dejo el rollo, jaja me eh reído un montón con el código jaja
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <time.h>
using namespace std;
int rand2 (){
srand(time(NULL));
int n = (0 + rand() % 2);
return n;
}
int rand3 (){
srand(time(NULL));
int n = (0 + rand() % 3);
return n;
}
int rand4 (){
srand(time(NULL));
int n = (0 + rand() % 4);
return n;
}
void mostrar(char mapa[29][29]){
system ("cls");
for(int y=0;y<29;y++)
{
for(int x=0;x<29;x++)
{
printf("%c",mapa[y][x]);
//Sleep(5);
}
printf("\n");
//Sleep(5);
}
}
// GO ONE
void go_arriba( char mapa[29][29], int &x, int &y ){
mapa [y][x]='1';
y--;
mapa [y][x]='X';
}
void go_izquierda( char mapa[29][29], int &x, int &y ){
mapa [y][x]='1';
x--;
mapa [y][x]='X';
}
void go_derecha( char mapa[29][29], int &x, int &y ){
mapa [y][x]='1';
x++;
mapa [y][x]='X';
}
void go_abajo( char mapa[29][29], int &x, int &y ){
mapa [y][x]='1';
y++;
mapa [y][x]='X';
}
// DECIDE 2
void decide_arriba_izquierda ( char mapa[29][29], int &x, int &y ){
switch ( rand2() ){
case 0:
go_arriba( mapa, x, y );
break;
case 1:
go_izquierda( mapa, x, y );
break;
default:
cout << "error:decide_arriba_izquierda"<<endl;
cin.ignore();
break;
}
}
void decide_arriba_derecha ( char mapa[29][29], int &x, int &y ){
switch ( rand2() ){
case 0:
go_arriba ( mapa, x, y );
break;
case 1:
go_derecha ( mapa, x, y );
break;
default:
cout << "error:decide_arriba_derecha"<<endl;
cin.ignore();
break;
}
}
void decide_arriba_abajo ( char mapa[29][29], int &x, int &y ){
switch ( rand2() ){
case 0:
go_arriba( mapa, x, y );
break;
case 1:
go_abajo( mapa, x, y );
break;
default:
cout << "decide_arriba_abajo"<<endl;
cin.ignore();
break;
}
}
void decide_izquierda_derecha ( char mapa[29][29], int &x, int &y ){
switch ( rand2() ){
case 0:
go_izquierda( mapa, x, y );
break;
case 1:
go_derecha( mapa, x, y );
break;
default:
cout << "error:decide_izquierda_derecha"<<endl;
cin.ignore();
break;
}
}
void decide_izquierda_abajo ( char mapa[29][29], int &x, int &y ){
switch ( rand2() ){
case 0:
go_izquierda( mapa, x, y );
break;
case 1:
go_abajo( mapa, x, y );
break;
default:
cout << "error:decide_izquierda_abajo"<<endl;
cin.ignore();
break;
}
}
void decide_derecha_abajo ( char mapa[29][29], int &x, int &y ){
switch ( rand2() ){
case 0:
go_derecha( mapa, x, y );
break;
case 1:
go_abajo( mapa, x, y );
break;
default:
cout << "error:decide_derecha_abajo"<<endl;
cin.ignore();
break;
}
}
// DECIDE 3
void decide_arriba_izquierda_derecha ( char mapa[29][29], int &x, int &y ){
switch ( rand3() ){
case 0:
go_arriba( mapa, x, y );
break;
case 1:
go_izquierda( mapa, x, y );
break;
case 2:
go_derecha( mapa, x, y );
break;
default:
cout << "error:decide_arriba_izquierda_derecha"<<endl;
cin.ignore();
break;
}
}
void decide_arriba_izquierda_abajo ( char mapa[29][29], int &x, int &y ){
switch ( rand3() ){
case 0:
go_arriba( mapa, x, y );
break;
case 1:
go_izquierda( mapa, x, y );
break;
case 2:
go_abajo( mapa, x, y );
break;
default:
cout << "error:decide_arriba_izquierda_abajo"<<endl;
cin.ignore();
break;
}
}
void decide_arriba_derecha_abajo ( char mapa[29][29], int &x, int &y ){
switch ( rand3() ){
case 0:
go_arriba( mapa, x, y );
break;
case 1:
go_derecha( mapa, x, y );
break;
case 2:
go_abajo( mapa, x, y );
break;
default:
cout << "error:decide_arriba_derecha_abajo"<<endl;
cin.ignore();
break;
}
}
void decide_izquierda_derecha_abajo ( char mapa[29][29], int &x, int &y ){
switch ( rand3() ){
case 0:
go_izquierda( mapa, x, y );
break;
case 1:
go_derecha( mapa, x, y );
break;
case 2:
go_abajo( mapa, x, y );
break;
default:
cout << "error:decide_izquierda_derecha_abajo"<<endl;
cin.ignore();
break;
}
}
// DECIDE 4
void decide_arriba_izquierda_derecha_abajo ( char mapa[29][29], int &x, int &y ){
switch ( rand4() ){
case 0:
go_arriba( mapa, x, y );
break;
case 1:
go_izquierda( mapa, x, y );
break;
case 2:
go_derecha( mapa, x, y );
break;
case 3:
go_abajo( mapa, x, y );
break;
default:
cout << "error:decide_arriba_izquierda_derecha_abajo"<<endl;
cin.ignore();
break;
}
}
// ESPECIAL CASES
//MAIN_MAIN_MAIN_MAIN_MAIN_MAIN_MAIN_MAIN_MAIN_MAIN_MAIN_MAIN_MAIN_MAIN_MAINMAIN_MAIN_MAIN
int main (){
//MAPA DE TIPO CHAR, MAS ADELANTE HACEMOS UN CAST PARA INT
char mapa[29][29]={
"000000000000000000000000000",
"0X0222222222222222222222220",
"020200000000000000000000020",
"020222222222222200000000020",
"020200000000000000000000020",
"020222222222222200022222220",
"020000000000000200020000020",
"020222222222200200000000020",
"020200000000200222222222020",
"020222222200200000000002020",
"020000000200222222222222020",
"022222220200000000000000020",
"000000020200222222222222220",
"000000022200200000000000000",
"000000000000200222222222220",
"022222222222200200000000020",
"020000000000000222222202020",
"020000000000000200000202020",
"022222222222222200000202020",
"000000000000000000000202220",
"022222222222222222222200000",
"020000000000000000000000000",
"02222222222222222222222FIN0",
"000000000000000000000000000"
};
//VARIABLES LOCALES
int n;
cout << "velocidad de busqueda?" << endl;
cin >> n;
//POSICION INICIAL (CORRDENADAS)
int x = 1;
int y = 1;
//CONVERTIMOS EN INT LOS POCIBLES CAMINOS A TOMAR
int arriba = (int (mapa [ y - 1] [ x ])-48);
int izquierda = (int (mapa [ y ] [ x -1 ])-48);
int derecha = (int (mapa [ y ] [ x + 1 ])-48);
int abajo = (int (mapa [ y + 1] [ x ])-48);
//CONDICION DEL BUCLE PRINCIPAL: SI NO SE ENCUENTRA EL FIN DEL MAPA SIEMPRE SERA FALSO.
bool fin = false;
//BUCLE PRINCIPAL: COMPRUEBA QUE NO ENCONTREMOS LA SALIDA.
while ( !fin ){
//Valores de los pocibles caminos
arriba = (int (mapa [ y - 1] [ x ]-48));
izquierda = (int (mapa [ y ] [ x -1 ]-48));
derecha = (int (mapa [ y ] [ x + 1 ]-48));
abajo = (int (mapa [ y + 1] [ x ]-48));
//CASOS
if ( arriba == 0 && izquierda == 0 && derecha == 0 && abajo == 0 ){//(0,0,0,0)*
//NO SE elige NADA
}
if ( arriba == 0 && izquierda == 0 && derecha == 0 && abajo == 1 ){//(0,0,0,1)*
//abajo
go_abajo(mapa, x, y);
}
if ( arriba == 0 && izquierda == 0 && derecha == 0 && abajo == 2 ){//(0,0,0,2)*
//abajo
go_abajo(mapa, x, y);
}
if ( arriba == 0 && izquierda == 0 && derecha == 1 && abajo == 0 ) {//(0,0,1,0)*
//derecha
go_derecha(mapa, x, y);
}
if ( arriba == 0 && izquierda == 0 && derecha == 1 && abajo == 1 ){//(0,0,1,1)*
//derecha || abajo
decide_derecha_abajo ( mapa, x, y );
}
if ( arriba == 0 && izquierda == 0 && derecha == 1 && abajo == 2 ){//(0,0,1,2)*
//abajo
go_abajo(mapa, x, y);
}
if ( arriba == 0 && izquierda == 0 && derecha == 2 && abajo == 0 ){//(0,0,2,0)*
//derecha
go_derecha(mapa, x, y);
}
if ( arriba == 0 && izquierda == 0 && derecha == 2 && abajo == 1 ){//(0,0,2,1)*
//derecha
go_derecha(mapa, x, y);
}
if ( arriba == 0 && izquierda == 0 && derecha == 2 && abajo == 2 ){//(0,0,2,2)*
//derecha || abajo
decide_derecha_abajo ( mapa, x, y );
}
if ( arriba == 0 && izquierda == 1 && derecha == 0 && abajo == 0 ){//(0,1,0,0)*
//izquierda
go_izquierda(mapa, x, y);
}
if ( arriba == 0 && izquierda == 1 && derecha == 0 && abajo == 1 ){//(0,1,0,1)*
//izquierda || abajo
decide_izquierda_abajo ( mapa, x, y );
}
if ( arriba == 0 && izquierda == 1 && derecha == 0 && abajo == 2 ){//(0,1,0,2)*
//abajo
go_abajo(mapa, x, y);
}
if ( arriba == 0 && izquierda == 1 && derecha == 1 && abajo == 0 ){//(0,1,1,0)*
//izquierda || derecha
decide_izquierda_derecha ( mapa, x, y );
}
if ( arriba == 0 && izquierda == 1 && derecha == 1 && abajo == 1 ){//(0,1,1,1)*
//izquierda || derecha || abajo
decide_izquierda_derecha_abajo ( mapa, x, y );
}
if ( arriba == 0 && izquierda == 1 && derecha == 1 && abajo == 2 ){//(0,1,1,2)*
//abajo
go_abajo(mapa, x, y);
}
if ( arriba == 0 && izquierda == 1 && derecha == 2 && abajo == 0 ){//(0,1,2,0)*
//derecha
go_derecha(mapa, x, y);
}
if ( arriba == 0 && izquierda == 1 && derecha == 2 && abajo == 1 ){//(0,1,2,1)*
//derecha
go_derecha(mapa, x, y);
}
if ( arriba == 0 && izquierda == 1 && derecha == 2 && abajo == 2 ){//(0,1,2,2)*
//derecha || abajo
decide_derecha_abajo ( mapa, x, y );
}
if ( arriba == 0 && izquierda == 2 && derecha == 0 && abajo == 0 ){//(0,2,0,0)*
//izquierda
go_izquierda(mapa, x, y);
}
if ( arriba == 0 && izquierda == 2 && derecha == 0 && abajo == 1 ){//(0,2,0,1)*
//izquierda
go_izquierda(mapa, x, y);
}
if ( arriba == 0 && izquierda == 2 && derecha == 0 && abajo == 2 ){//(0,2,0,2)*
//izquierda || abajo
decide_izquierda_abajo ( mapa, x, y );
}
if ( arriba == 0 && izquierda == 2 && derecha == 1 && abajo == 0 ){//(0,2,1,0)*
//izquierda
go_izquierda(mapa, x, y);
}
if ( arriba == 0 && izquierda == 2 && derecha == 1 && abajo == 1 ){//(0,2,1,1)*
//izquierda
go_izquierda(mapa, x, y);
}
if ( arriba == 0 && izquierda == 2 && derecha == 1 && abajo == 2 ){//(0,2,1,2)*
//izquierda || abajo
decide_izquierda_abajo ( mapa, x, y );
}
if ( arriba == 0 && izquierda == 2 && derecha == 2 && abajo == 0 ){//(0,2,2,0)*
//izquierda || derecha
decide_izquierda_derecha ( mapa, x, y );
}
if ( arriba == 0 && izquierda == 2 && derecha == 2 && abajo == 1 ){//(0,2,2,1)*
//izquierda || derecha
decide_izquierda_derecha ( mapa, x, y );
}
if ( arriba == 0 && izquierda == 2 && derecha == 2 && abajo == 2 ){//(0,2,2,2)*
//izquierda || derecha || abajo
decide_izquierda_derecha_abajo ( mapa, x, y );
}
if ( arriba == 1 && izquierda == 0 && derecha == 0 && abajo == 0 ){//(1,0,0,0)*
//arriba
go_arriba(mapa, x, y);
}
if ( arriba == 1 && izquierda == 0 && derecha == 0 && abajo == 1 ){//(1,0,0,1)*ESPECIAL
//arriba || abajo
decide_arriba_abajo ( mapa, x, y );
}
if ( arriba == 1 && izquierda == 0 && derecha == 0 && abajo == 2 ){//(1,0,0,2)*
//abajo
go_abajo(mapa, x, y);
}
if ( arriba == 1 && izquierda == 0 && derecha == 1 && abajo == 0 ){//(1,0,1,0)*
//arriba || derecha
decide_arriba_derecha ( mapa, x, y );
}
if ( arriba == 1 && izquierda == 0 && derecha == 1 && abajo == 1 ){//(1,0,1,1)*
//arriba || derecha || abajo
decide_arriba_derecha_abajo ( mapa, x, y );
}
if ( arriba == 1 && izquierda == 0 && derecha == 1 && abajo == 2 ){//(1,0,1,2)*
//abajo
go_abajo(mapa, x, y);
}
if ( arriba == 1 && izquierda == 0 && derecha == 2 && abajo == 0 ){//(1,0,2,0)*
//derecha
go_derecha(mapa, x, y);
}
if ( arriba == 1 && izquierda == 0 && derecha == 2 && abajo == 1 ){//(1,0,2,1)*
//derecha
go_derecha(mapa, x, y);
}
if ( arriba == 1 && izquierda == 0 && derecha == 2 && abajo == 2 ){//(1,0,2,2)*
//derecha || abajo
decide_derecha_abajo ( mapa, x, y );
}
if ( arriba == 1 && izquierda == 1 && derecha == 0 && abajo == 0 ){//(1,1,0,0)*
//arriba || izquierda
decide_arriba_izquierda ( mapa, x, y );
}
if ( arriba == 1 && izquierda == 1 && derecha == 0 && abajo == 1 ){//(1,1,0,1)*
//arriba || izquierda || abajo
decide_arriba_izquierda_abajo ( mapa, x, y );
}
if ( arriba == 1 && izquierda == 1 && derecha == 0 && abajo == 2 ){//(1,1,0,2)*
//abajo
go_abajo(mapa, x, y);
}
if ( arriba == 1 && izquierda == 1 && derecha == 1 && abajo == 0 ){//(1,1,1,0)*
//arriba || izquierda || derecha
}
if ( arriba == 1 && izquierda == 1 && derecha == 1 && abajo == 1 ){//(1,1,1,1)
//arriba || izquierda || derecha || abajo
decide_arriba_izquierda_derecha_abajo ( mapa, x, y );
}
if ( arriba == 1 && izquierda == 1 && derecha == 1 && abajo == 2 ){//(1,1,1,2)*
//abajo
go_abajo(mapa, x, y);
}
if ( arriba == 1 && izquierda == 1 && derecha == 2 && abajo == 0 ){//(1,1,2,0)*
//derecha
go_derecha(mapa, x, y);
}
if ( arriba == 1 && izquierda == 1 && derecha == 2 && abajo == 1 ){//(1,1,2,1)*
//derecha
go_derecha(mapa, x, y);
}
if ( arriba == 1 && izquierda == 1 && derecha == 2 && abajo == 2 ){//(1,1,2,2)*
//derecha || abajo
decide_derecha_abajo ( mapa, x, y );
}
if ( arriba == 1 && izquierda == 2 && derecha == 0 && abajo == 0 ){//(1,2,0,0)*
//izquierda
go_izquierda(mapa, x, y);
}
if ( arriba == 1 && izquierda == 2 && derecha == 0 && abajo == 1 ){//(1,2,0,1)*
//izquierda
go_izquierda(mapa, x, y);
}
if ( arriba == 1 && izquierda == 2 && derecha == 0 && abajo == 2 ){//(1,2,0,2)*
//izquierda || abajo
decide_izquierda_abajo ( mapa, x, y );
}
if ( arriba == 1 && izquierda == 2 && derecha == 1 && abajo == 0 ){//(1,2,1,0)*
//izquierda
go_izquierda(mapa, x, y);
}
if ( arriba == 1 && izquierda == 2 && derecha == 1 && abajo == 1 ){//(1,2,1,1)*
//izquierda
go_izquierda(mapa, x, y);
}
if ( arriba == 1 && izquierda == 2 && derecha == 1 && abajo == 2 ){//(1,2,1,2)*
//izquierda || abajo
decide_izquierda_abajo ( mapa, x, y );
}
if ( arriba == 1 && izquierda == 2 && derecha == 2 && abajo == 0 ){//(1,2,2,0)*
//izquierda || derecha
decide_izquierda_derecha ( mapa, x, y );
}
if ( arriba == 1 && izquierda == 2 && derecha == 2 && abajo == 1 ){//(1,2,2,1)*
//izquierda || derecha
decide_izquierda_derecha ( mapa, x, y );
}
if ( arriba == 1 && izquierda == 2 && derecha == 2 && abajo == 2 ){//(1,2,2,2)
//izquierda || derecha || abajo
decide_izquierda_derecha_abajo ( mapa, x, y );
}
if ( arriba == 2 && izquierda == 0 && derecha == 0 && abajo == 0 ){//(2,0,0,0)
//arriba
go_arriba(mapa, x, y);
}
if ( arriba == 2 && izquierda == 0 && derecha == 0 && abajo == 1 ){//(2,0,0,1)
//arriba
go_arriba(mapa, x, y);
}
if ( arriba == 2 && izquierda == 0 && derecha == 0 && abajo == 2 ){//(2,0,0,2)
//arriba || abajo
decide_arriba_abajo ( mapa, x, y );
}
if ( arriba == 2 && izquierda == 0 && derecha == 1 && abajo == 0 ){//(2,0,1,0)
//arriba
go_arriba(mapa, x, y);
}
if ( arriba == 2 && izquierda == 0 && derecha == 1 && abajo == 1 ){//(2,0,1,1)
//arriba
go_arriba(mapa, x, y);
}
if ( arriba == 2 && izquierda == 0 && derecha == 1 && abajo == 2 ){//(2,0,1,2)
//arriba || abajo
decide_arriba_abajo ( mapa, x, y );
}
if ( arriba == 2 && izquierda == 0 && derecha == 2 && abajo == 0 ){//(2,0,2,0)
//arriba || derecha
decide_arriba_derecha ( mapa, x, y );
}
if ( arriba == 2 && izquierda == 0 && derecha == 2 && abajo == 1 ){//(2,0,2,1)
//arriba || derecha
decide_arriba_derecha ( mapa, x, y );
}
if ( arriba == 2 && izquierda == 0 && derecha == 2 && abajo == 2 ){//(2,0,2,2)
//arriba || derecha || abajo
decide_arriba_derecha_abajo ( mapa, x, y );
}
if ( arriba == 2 && izquierda == 1 && derecha == 0 && abajo == 0 ){//(2,1,0,0)
//arriba
go_arriba(mapa, x, y);
}
if ( arriba == 2 && izquierda == 1 && derecha == 0 && abajo == 1 ){//(2,1,0,1)
//arriba
go_arriba(mapa, x, y);
}
if ( arriba == 2 && izquierda == 1 && derecha == 0 && abajo == 2 ){//(2,1,0,2)
//arriba || abajo
decide_arriba_abajo ( mapa, x, y );
}
if ( arriba == 2 && izquierda == 1 && derecha == 1 && abajo == 0 ){//(2,1,1,0)
//arriba
go_arriba(mapa, x, y);
}
if ( arriba == 2 && izquierda == 1 && derecha == 1 && abajo == 1 ){//(2,1,1,1)
//arriba
go_arriba(mapa, x, y);
}
if ( arriba == 2 && izquierda == 1 && derecha == 1 && abajo == 2 ){//(2,1,1,2)
//arriba || abajo
decide_arriba_abajo ( mapa, x, y );
}
if ( arriba == 2 && izquierda == 1 && derecha == 2 && abajo == 0 ){//(2,1,2,0)
//arriba || derecha
decide_arriba_derecha ( mapa, x, y );
}
if ( arriba == 2 && izquierda == 1 && derecha == 2 && abajo == 1 ){//(2,1,2,1)
//arriba || derecha
decide_arriba_derecha ( mapa, x, y );
}
if ( arriba == 2 && izquierda == 1 && derecha == 2 && abajo == 2 ){//(2,1,2,2)
//arriba || derecha || abajo
decide_arriba_derecha_abajo ( mapa, x, y );
}
if ( arriba == 2 && izquierda == 2 && derecha == 0 && abajo == 0 ){//(2,2,0,0)
//arriba || izquierda
decide_arriba_izquierda ( mapa, x, y );
}
if ( arriba == 2 && izquierda == 2 && derecha == 0 && abajo == 1 ){//(2,2,0,1)
//arriba || izquierda
decide_arriba_izquierda ( mapa, x, y );
}
if ( arriba == 2 && izquierda == 2 && derecha == 0 && abajo == 0 ){//(2,2,0,0)
//arriba || izquierda
decide_arriba_izquierda ( mapa, x, y );
}
if ( arriba == 2 && izquierda == 2 && derecha == 0 && abajo == 2 ){//(2,2,0,2)
//arriba || izquierda || abajo
decide_arriba_izquierda_abajo ( mapa, x, y );
}
if ( arriba == 2 && izquierda == 2 && derecha == 1 && abajo == 0 ){//(2,2,1,0)
//arriba || izquierda
decide_arriba_izquierda ( mapa, x, y );
}
if ( arriba == 2 && izquierda == 2 && derecha == 1 && abajo == 1 ){//(2,2,1,1)
//arriba || izquierda
decide_arriba_izquierda ( mapa, x, y );
}
if ( arriba == 2 && izquierda == 2 && derecha == 1 && abajo == 2 ){//(2,2,1,2)
//arriba || izquierda || abajo
decide_arriba_izquierda_abajo ( mapa, x, y );
}
if ( arriba == 2 && izquierda == 2 && derecha == 2 && abajo == 0 ){//(2,2,2,0)
//arriba || izquierda || derecha
decide_arriba_izquierda_derecha ( mapa, x, y );
}
if ( arriba == 2 && izquierda == 2 && derecha == 2 && abajo == 1 ){//(2,2,2,1)
//arriba || izquierda || derecha
decide_arriba_izquierda_derecha ( mapa, x, y );
}
if ( arriba == 2 && izquierda == 2 && derecha == 2 && abajo == 2 ){//(2,2,2,2)
//arriba || izquierda || derecha || abajo
decide_arriba_izquierda_derecha_abajo ( mapa, x, y );
}
// ON SCREEN PRINT
mostrar (mapa);
Sleep(n);
//system("pause");
}
return 0;
}
Esta echo en dev cpp orwell
Pronto subo la 2.0 o mejor lo mejoren vosotros si quieren
Se debe de poner 0 en los bordes o puede ser bug
La X va buscando el 2, si no hay remedio busca 1 y el 0 es como pared.
Debe tener 0 en todo el lado externo.
Tomar el 0 como pared y rodear todo el mapa.