iniciar-programa
define-nueva-instruccion norte como mientras no-orientado-al-norte hacer gira-izquierda;
define-nueva-instruccion sur como mientras no-orientado-al-sur hacer gira-izquierda;
define-nueva-instruccion este como mientras no-orientado-al-este hacer gira-izquierda;
define-nueva-instruccion oeste como mientras no-orientado-al-oeste hacer gira-izquierda;
define-nueva-instruccion media-vuelta como repetir 2 veces gira-izquierda;

define-nueva-instruccion esquinaDerecha como
    inicio
        este;
    mientras frente-libre y no-orientado-al-oeste hacer
        inicio
        si derecha-libre o izquierda-libre entonces avanza sino
            inicio
                media-vuelta;
                avanza;
                norte;
            mientras frente-libre y no-orientado-al-oeste hacer
                inicio
                si derecha-libre o izquierda-libre entonces avanza sino
                    inicio
                        media-vuelta;
                        avanza;
                        oeste;
                    fin;
                fin;
            fin;
        fin;
    si no orientado-al-oeste entonces
        inicio
            norte;
        mientras frente-libre y no-orientado-al-oeste hacer
            inicio
            si derecha-libre o izquierda-libre entonces avanza sino
                    inicio
                        media-vuelta;
                        avanza;
                        oeste;
                    fin;
            fin;
            oeste;
        fin;
    fin;

define-nueva-instruccion orienta como
    inicio
    si junto-a-zumbador entonces
        inicio
            coge-zumbador;
        si junto-a-zumbador entonces
            inicio
                coge-zumbador;
            si junto-a-zumbador entonces
                inicio
                    coge-zumbador;
                si junto-a-zumbador entonces
                    inicio
                        coge-zumbador;
                        oeste;
                    fin sino sur;
                fin sino este;
            fin sino norte;
        fin;
    mientras frente-libre y (derecha-libre o izquierda-libre) hacer avanza;
    si izquierda-bloqueada y derecha-bloqueada entonces
        inicio
        mientras izquierda-bloqueada y derecha-bloqueada hacer avanza;
            esquinaDerecha;
        fin
    sino
        inicio
            gira-izquierda;
        mientras (derecha-bloqueada y izquierda-libre)  y frente-libre hacer avanza;
        si derecha-libre entonces
            inicio
                repetir 3 veces gira-izquierda;
                avanza;
            mientras derecha-bloqueada y izquierda-bloqueada hacer avanza;
                esquinaDerecha;
            fin
        sino
            inicio

                    media-vuelta;
                mientras izquierda-bloqueada y frente-libre hacer avanza;
                    gira-izquierda;
                    avanza;
                    mientras derecha-bloqueada y izquierda-bloqueada hacer avanza;
                    esquinaDerecha;

            fin;
        fin;
    fin;

define-nueva-instruccion busca como
    inicio
    mientras no orientado-al-sur hacer
        inicio
        si junto-a-zumbador entonces orienta;
        si frente-libre y (derecha-libre o izquierda-libre) entonces
            inicio
            si junto-a-zumbador entonces orienta sino
                inicio
                avanza;
                si junto-a-zumbador entonces orienta;
                fin;
            fin
        sino
            inicio
            si derecha-bloqueada y izquierda-bloqueada y orientado-al-oeste entonces
                inicio
                    este;
                    avanza;
                mientras frente-libre y (derecha-libre o izquierda-libre) hacer avanza;
                si derecha-bloqueada y izquierda-bloqueada entonces
                    inicio
                        oeste;
                        avanza;
                    fin;
                    sur;
                si frente-libre entonces
                    inicio
                        avanza;
                    si derecha-bloqueada y izquierda-bloqueada entonces
                        inicio
                            media-vuelta;
                            avanza;
                            esquinaDerecha;
                            apagate;
                        fin sino oeste;
                    fin
                sino
                    inicio
                        esquinaDerecha;
                        apagate;
                    fin;
                fin
            sino
                inicio
                    este;
                mientras frente-libre y (derecha-libre o izquierda-libre) hacer avanza;
                si derecha-bloqueada y izquierda-bloqueada entonces
                    inicio
                        media-vuelta;
                        avanza;
                    fin;
                    sur;
                si frente-libre entonces
                    inicio
                        avanza;
                    si derecha-bloqueada y izquierda-bloqueada entonces
                        inicio
                            media-vuelta;
                            avanza;
                            esquinaDerecha;
                            apagate;
                        fin
                    sino
                        inicio
                            repetir 3 veces gira-izquierda;
                        fin;
                    fin
                sino
                    inicio
                        esquinaDerecha;
                        apagate;
                    fin;
                fin;
            fin;
        fin;
    fin;

    inicia-ejecucion
        esquinaDerecha;
        repetir 100 veces busca;
        apagate;
    termina-ejecucion
finalizar-programa
