Ejemplo Completo en PSeInt, vehículo que recorre un pasillo con curvas de 90°

Un vehículo autónomo debe recorrer un pasillo con curvas y regresar al punto de partida ,
para lograr su objetivo posee tres sensores que le indican si existe una pared a su izquierda,
adelante o a la derecha. Cuando dobla lo hace a 90º en el lugar y cuando avanza pasa a la
siguiente posición del pasillo.



SubProceso pasos <- menupasos ()
    Mostrar "Ingrese la cantidad de pasos que tendrá el pasillo, la cantidad debe ser entre 1 y 50"
    leer pasos
Fin SubProceso

SubProceso dirsel <- menucamino()
   
    // Menu uno
    Mostrar "Ingrese un valor numérico comprendido entre 1 y 2"
    Mostrar "1 de Norte a Sur \/"
    Mostrar "2 de Este a Oeste <"
    Mostrar "3 de Sur a Norte ^"
    Mostrar "4 de Oeste a Este >"
    leer dirsel
Fin SubProceso

SubProceso dirsel <- menucamino2()
    // Menu ir en horizontal
    Mostrar "Ingrese un valor numérico comprendido entre 1 y 2"
    Mostrar "1 de Este a Oeste <"
    Mostrar "2 de Oeste a Este >"
    leer dirsel
Fin SubProceso

SubProceso dirsel <- menucamino3()
    // Menu ir en vertical
    Mostrar "Ingrese un valor numérico comprendido entre 1 y 4"
    Mostrar "1 de Norte a Sur \/"
    Mostrar "2 de Sur a Norte ^"
    leer dirsel
Fin SubProceso

Proceso Principal_pasillos
    // Primera parte. El usuario diseña los pasillos
    // ********************************************************************
   
    Mostrar "Bienvenido!!!"
    Mostrar "Comenzaremos diseñando los tres pasillos, se le solicitará que ingrese datos para cada uno"
    Mostrar "****************************************************************************************"
   
    Mostrar "Presione ENTER para continuar..."
    Leer teclacualquiera
    Limpiar Pantalla
   
    dimension vector_creacion[6]
    // Vector que acumula los datos para la creación de los pasillos
    // referencias de contenido:
    // Celdas impares
    // 1 de Norte a Sur \/
    // 2 de Este a Oeste <
    // 3 de Sur a Norte ^
    // 4 de Oeste a Este >
    //
    // Celdas pares
    // Cantidad de pasos de 1 a 50
   
    Mostrar "Vamos a diseñar el primer pasillo"
   
    //Pedimos orientación del pasillo, llamamos a la función
    dirsel <- menucamino()
   
    // Control del ingreso
    Mientras (dirsel >= 1 y dirsel <= 4 ) = Falso
        Limpiar Pantalla
        Mostrar "Ingreso incorrecto"
        dirsel <- menucamino()
    FinMientras
   
    // asignamos el dato al vector
    vector_creacion[1] <- dirsel
   
    Mostrar "Excelente!!! ahora la cantidad de pasos que tendrá"
   
    pasos <- menupasos ()
   
    // Control del ingreso
   
    Mientras (pasos >= 1 y pasos <= 50 ) = Falso
        Limpiar Pantalla
        Mostrar "Ingreso incorrecto"
        pasos <- menupasos ()
    FinMientras
   
    // asignamos el dato al vector
    vector_creacion[2] <- pasos
   
    Limpiar Pantalla
    Mostrar "Genial!!! ya tenemos los datos del primer pasillo"
    Mostrar "vamos a ingresar los del segundo"
   
    qmenu <- 0
    // Si el primer camino es un desplazamiento vertical
    Si (vector_creacion[1] = 1 o vector_creacion[1] = 3) = verdadero entonces
        // Seleccionar uno horizontal
        dirsel <- menucamino2()
        qmenu <- 2 // guarda elección
    Sino // Seleccionar uno vertical
        dirsel <- menucamino3()
        qmenu <- 3 // guarda elección
    FinSi
   
    // Control de ingreso
    Mientras (dirsel = 1 o dirsel = 2) = Falso
        Segun qmenu
            2: dirsel <- menucamino2() // llama al Menu desplazamiento horizontal
            3: dirsel <- menucamino3() // llama al Menu desplazamiento vertical
        FinSegun
    FinMientras
   
    // Guardar datos en el vector
    Segun qmenu
        2: // en el camino horizontal
            Si dirsel = 1 entonces // si se eligió de este a oeste
                vector_creacion[3] <- 2 // guardar segun el menú original de 4 opciones
            Sino
                vector_creacion[3] <- 4
            FinSi
        3:
            Si dirsel = 1 entonces // si se eligió de Norte a sur
                vector_creacion[3] <- 1 // guardar segun el menú original de 4 opciones
            Sino
                vector_creacion[3] <- 3
            FinSi
    FinSegun
   
    Mostrar "Excelente!!! ahora la cantidad de pasos que tendrá"
   
    pasos <- menupasos ()
   
    // Control del ingreso
    Mientras (pasos >= 1 y pasos <= 50 ) = Falso
        Limpiar Pantalla
        Mostrar "Ingreso incorrecto"
        pasos <- menupasos ()
    FinMientras
   
    // asignamos el dato al vector
    vector_creacion[4] <- pasos
   
    Limpiar Pantalla
    Mostrar "Buenísimo!!! ya tenemos los datos del segundo pasillo"
    Mostrar "vamos a ingresar los datos del último"
   
    qmenu <- 0
    // Si el segunda vez camino es un desplazamiento vertical
    Si (vector_creacion[3] = 1 o vector_creacion[3] = 3) = verdadero entonces
        // Seleccionar uno horizontal
        dirsel <- menucamino2()
        qmenu <- 2 // guarda elección
    Sino // Seleccionar uno vertical
        dirsel <- menucamino3()
        qmenu <- 3 // guarda elección
    FinSi
   
    // Control de ingreso
    Mientras (dirsel = 1 o dirsel = 2) = Falso
        Segun qmenu
            2: dirsel <- menucamino2() // llama al Menu desplazamiento horizontal
            3: dirsel <- menucamino3() // llama al Menu desplazamiento vertical
        FinSegun
    FinMientras
   
    // Guardar datos en el vector
    Segun qmenu
        2: // en el camino horizontal
            Si dirsel = 1 entonces // si se eligió de este a oeste
                vector_creacion[5] <- 2 // guardar segun el menú original de 4 opciones
            Sino
                vector_creacion[5] <- 4
            FinSi
        3:
            Si dirsel = 1 entonces // si se eligió de Norte a sur
                vector_creacion[5] <- 1 // guardar segun el menú original de 4 opciones
            Sino
                vector_creacion[5] <- 3
            FinSi
    FinSegun
   
    Mostrar "Excelente!!! ahora la cantidad de pasos que tendrá"
   
    pasos <- menupasos ()
   
    // Control del ingreso
    Mientras (pasos >= 1 y pasos <= 50 ) = Falso
        Limpiar Pantalla
        Mostrar "Ingreso incorrecto"
        pasos <- menupasos ()
    FinMientras
   
    // asignamos el dato al vector
    vector_creacion[6] <- pasos
   
    Limpiar Pantalla
    Mostrar "Mejor imposible!!! ya están todos los datos necesarios"
   
    Mostrar Sin Saltar "El primer pasillo ira de "
   
    Segun vector_creacion[1]
        1: Mostrar sin saltar "Norte a Sur "
        2: Mostrar sin saltar "Este a Oeste "
        3: Mostrar sin saltar "Sur a Norte "
        4: Mostrar sin saltar "Oeste a Este "
    FinSegun
    Mostrar Sin Saltar "con " , vector_creacion[2], " pasos, seguido, el pasillo 2 irá de "
    Segun vector_creacion[3]
        1: Mostrar sin saltar "Norte a Sur "
        2: Mostrar sin saltar "Este a Oeste "
        3: Mostrar sin saltar "Sur a Norte "
        4: Mostrar sin saltar "Oeste a Este "
    FinSegun
    Mostrar Sin Saltar "con " vector_creacion[4], " pasos, y finalmente el pasillo 3 irá de "
    Segun vector_creacion[5]
        1: Mostrar sin saltar "Norte a Sur "
        2: Mostrar sin saltar "Este a Oeste "
        3: Mostrar sin saltar "Sur a Norte "
        4: Mostrar sin saltar "Oeste a Este "
    FinSegun
    Mostrar Sin Saltar "con " , vector_creacion[6], " pasos"
   
    Mostrar " "
   
    Mostrar "Presione ENTER para continuar..."
    Leer teclacualquiera
    Limpiar Pantalla
   
    // Segunda Parte. Creando pasillos
    // ********************************************************************
   
    // 3 vectores correspondientes a cada pasillo
    Dimension pasillo1[51]
    Dimension pasillo2[51]
    Dimension pasillo3[51]
   
    // Creando pista del pasillo 1
    Para i <- 1 hasta vector_creacion[2] con paso 1
        pasillo1[i] <- "101"
    FinPara
   
    // Creando curva del pasillo 1
   
    //var aux
    voy_de_a <- vector_creacion[1] // en el vector 1
    giro_de_a <- vector_creacion[3] // en el vector 2
    pos_curva <- vector_creacion[2] + 1 // Indicando posición de la curva
   
    Si voy_de_a = 1 entonces // Norte a Sur
        si giro_de_a = 2 Entonces // a la derecha
            pasillo1[pos_curva] <- "110"
        sino // a la izquierda
            pasillo1[pos_curva] <- "011"
        FinSi
    FinSi
   
    Si voy_de_a = 2 entonces // Este a Oeste
        si giro_de_a = 3 Entonces // a la derecha
            pasillo1[pos_curva] <- "110"
        sino // a la izquierda
            pasillo1[pos_curva] <- "011"
        FinSi
    FinSi   
   
    Si voy_de_a = 3 entonces // Sur a Norte
        si giro_de_a = 4 Entonces // a la derecha
            pasillo1[pos_curva] <- "110"
        sino // a la izquierda
            pasillo1[pos_curva] <- "011"
        FinSi
    FinSi
   
    Si voy_de_a = 4 entonces // Norte a Sur
        si giro_de_a = 1 Entonces // a la derecha
            pasillo1[pos_curva] <- "110"
        sino // a la izquierda
            pasillo1[pos_curva] <- "011"
        FinSi
    FinSi
   
    Mostrar "Primer pasillo creado..."
   
    // Creando pista del pasillo 2
    Para i <- 1 hasta vector_creacion[4] con paso 1
        pasillo2[i] <- "101"
    FinPara
   
    // Creando curva del pasillo 2
   
    //var aux
    voy_de_a <- vector_creacion[3] // en el vector 2
    giro_de_a <- vector_creacion[5] // en el vector 3
    pos_curva <- vector_creacion[4] + 1 // Indicando posición de la curva
   
    Si voy_de_a = 1 entonces // Norte a Sur
        si giro_de_a = 2 Entonces // a la derecha
            pasillo2[pos_curva] <- "110"
        sino // a la izquierda
            pasillo2[pos_curva] <- "011"
        FinSi
    FinSi
   
    Si voy_de_a = 2 entonces // Este a Oeste
        si giro_de_a = 3 Entonces // a la derecha
            pasillo2[pos_curva] <- "110"
        sino // a la izquierda
            pasillo2[pos_curva] <- "011"
        FinSi
    FinSi   
   
    Si voy_de_a = 3 entonces // Sur a Norte
        si giro_de_a = 4 Entonces // a la derecha
            pasillo2[pos_curva] <- "110"
        sino // a la izquierda
            pasillo2[pos_curva] <- "011"
        FinSi
    FinSi
   
    Si voy_de_a = 4 entonces // Norte a Sur
        si giro_de_a = 1 Entonces // a la derecha
            pasillo2[pos_curva] <- "110"
        sino // a la izquierda
            pasillo2[pos_curva] <- "011"
        FinSi
    FinSi
   
    Mostrar "Segundo pasillo creado..."
   
    // Creando pista del pasillo 3
    Para i <- 1 hasta vector_creacion[6] con paso 1
        pasillo3[i] <- "101"
    FinPara
   
    // Creando fin del pasillo 3
   
    finrec <- vector_creacion[6] + 1
   
    pasillo3[finrec] <- "111"
   
    Mostrar "Tercer pasillo creado..."
   
    Mostrar "---"
    Mostrar "Todo los pasillos se han creado correctamente"
    Mostrar "Presione ENTER para continuar..."
    Leer teclacualquiera
    Limpiar Pantalla
   
    // Tercera parte. El programa recorre los pasillos de ida y de vuelta
    // ********************************************************************
   
    Mostrar "Iniciando el recorrido por los pasillos"
   
    // Vector que tomará los datos para el recorrido de ida y de vuelta por los pasillos
    Dimension reg_recorrido[6]
   
    Segun vector_creacion[1]
        1:
            direccion <- "Sur"
        2:
            direccion <- "Oeste"
        3:
            direccion <- "Norte"
        4:
            direccion <- "Este"
    FinSegun
   
    // Recorriendo el pasillo 1
    i <- 0
    p1 <- 0
    Mientras p1 = 0
        i <- i +1
        Si pasillo1[i] = "101"
            Mostrar "Estamos recorriendo el Pasillo N° 1, el camino es recto, vamos por el paso ", i , " en dirección ", direccion
        Sino
            Mostrar Sin Saltar "Los sensores han detectado una curva hacia la "
            Segun pasillo1[i]
                "110": Mostrar "DERECHA" ;
                    reg_recorrido[2] <- 1 // grabando regreso a la izquierda
                "011": Mostrar "IZQUIERDA"
                    reg_recorrido[2] <- 2 // grabando regreso a la Derecha
            FinSegun
            Mostrar "Presione ENTER para continuar en este nuevo pasillo"
            Leer teclacualquiera
            p1 = 1 // yendo al pasillo 2
            Mostrar "Hemos tomado una curva..."
            reg_recorrido[1] <- i-1
        FinSi
    FinMientras
   
    // Recorriendo el pasillo 2
    // detectando la dirección
    Segun vector_creacion[3]
        1:
            direccion <- "Sur"
        2:
            direccion <- "Oeste"
        3:
            direccion <- "Norte"
        4:
            direccion <- "Este"
    FinSegun
   
    i <- 0
    p2 <- 0
    Mientras p2 = 0
        i <- i +1
        Si pasillo2[i] = "101"
            Mostrar "Estamos recorriendo el Pasillo N° 2, el camino es recto, vamos por el paso ", i , " en dirección ", direccion , " son ", reg_recorrido[1] + i " pasos en total"
        Sino
            Mostrar Sin Saltar "Los sensores han detectado una curva hacia la "
            Segun pasillo2[i]
                "110": Mostrar "DERECHA" ;
                    reg_recorrido[4] <- 1 // grabando regreso a la izquierda
                "011": Mostrar "IZQUIERDA"
                    reg_recorrido[4] <- 2 // grabando regreso a la Derecha
            FinSegun
            Mostrar "Presione ENTER para continuar en este nuevo pasillo"
            Leer teclacualquiera
            p2 = 1 // yendo al pasillo 3
            Mostrar "Hemos tomado una curva..."
            reg_recorrido[3] <- i-1
        FinSi
    FinMientras
   
    // Recorriendo el pasillo 3
    // detectando la dirección
    Segun vector_creacion[5]
        1:
            direccion <- "Sur"
        2:
            direccion <- "Oeste"
        3:
            direccion <- "Norte"
        4:
            direccion <- "Este"
    FinSegun
   
    i <- 0
    p3 <- 0
    Mientras p3 = 0
        i <- i +1
        Si pasillo3[i] = "101"
            Mostrar "Estamos recorriendo el Pasillo N° 3, el camino es recto, vamos por el paso ", i , " en dirección ", direccion , " son ", reg_recorrido[1] + reg_recorrido[3] + i " pasos en total"
        Sino
            si pasillo3[i] = "111"
                Mostrar "Los sensores han detectado el fin del recorrido a los ", i-1 , " pasos del pasillo 3 y a los " , reg_recorrido[1] + reg_recorrido[3] + i-1, " pasos totales"
                Mostrar "Presione ENTER para continuar"
                Leer teclacualquiera
                p3 = 1 // Fin del recorrido
                reg_recorrido[5] <- i-1
            FinSi
        FinSi
    FinMientras
   
    // Iniciando el recorrido de regreso
    segun reg_recorrido[4]
        1: curva1 <- "Izquierda"
        2: curva1 <- "Derecha"
    FinSegun
   
    segun reg_recorrido[2]
        1: curva2 <- "Izquierda"
        2: curva2 <- "Derecha"
    FinSegun
   
    Mostrar "El sistema ha tomado un registro del recorrido, los datos para el regreso son:"
    Mostrar "ahora giramos 180°, luego avanzamos ", reg_recorrido[5], " pasos. Curva a la " , curva1, " luego ", reg_recorrido[3], " pasos, luego curva a la ", curva2, " y finalmente ", reg_recorrido[1], " pasos"
    Mostrar "Presione ENTER para continuar"
    Leer teclacualquiera
    Mostrar "Iniciando el recorrido de regreso"
   
    // Regresando por el camino 3
    Para i <- reg_recorrido[5] Hasta 1 con paso -1
        Si pasillo3[i] = "101" entonces
            Mostrar "Estamos de regreso por el pasillo n° 3 son ", reg_recorrido[5], " pasos en total del mismo, ahora recorriendo el paso n° " , i
        FinSi
    FinPara
   
   
    Mostrar "ahora giramos a la ", curva1
   
 // Regresando por el camino 2
    Para i <- reg_recorrido[3] Hasta 1 con paso -1
        Si pasillo2[i] = "101" entonces
            Mostrar "Estamos de regreso por el pasillo n° 2 son ", reg_recorrido[3], " pasos en total del mismo ahora recorriendo el paso n° " , i
        FinSi
    FinPara
   
    Mostrar "ahora giramos a la ", curva2
   
    // Regresando por el camino 1
    Para i <- reg_recorrido[1] Hasta 1 con paso -1
        Si pasillo1[i] = "101" entonces
            Mostrar "Estamos de regreso por el pasillo n° 1 son ", reg_recorrido[1], " pasos en total del mismo, ahora recorriendo el paso n° " , i
        FinSi
    FinPara
   
    Mostrar "Hemos vuelto al inicio del camino!!!"
    Mostrar "Fin del Programa"   
FinProceso


En caso de que aparezca un mensaje que dice ERROR 302: Subindice (6) fuera de rango (0...5)
Configurar el programa para que funcione correctamente:
1_Clic en Configurar
2_Clic en Opciones del Lenguaje...
3_Clic en Personalizar
4_Clic en Utilizar indices en arreglos y cadenas en base 0
5_Clic en Aceptar
6_Clic en Aceptar