iniciar-programa
define-nueva-instruccion gira-derecha como repetir 3 veces gira-izquierda;
define-nueva-instruccion media-vuelta como repetir 2 veces gira-izquierda;

define-nueva-instruccion verifica(n) como inicio

  si no orientado-al-oeste entonces inicio
  si frente-libre entonces inicio
  avanza
  fin
  sino inicio
  gira-derecha;
  verifica(n);
  sal-de-instruccion;
  fin;
   si junto-a-zumbador entonces inicio
    media-vuelta;
    avanza;
    gira-izquierda;
    verifica(n);
   fin
   sino
   si no junto-a-zumbador entonces inicio
    media-vuelta;
    avanza;
    gira-izquierda;
    verifica(sucede(n));
   fin;
  fin
  sino
 si orientado-al-oeste y frente-libre entonces inicio
  avanza;
   si junto-a-zumbador entonces inicio
    media-vuelta;
    avanza;
    mientras no orientado-al-norte hacer gira-izquierda;
    si si-es-cero(n) entonces coge-zumbador;
    repetir n veces gira-izquierda;
   fin
   sino inicio
    media-vuelta;
    avanza;
    mientras no orientado-al-norte hacer gira-izquierda;
    gira-izquierda;
    si si-es-cero(n) entonces coge-zumbador;
    repetir n veces gira-izquierda;
   fin;
 fin
 sino si orientado-al-oeste y frente-bloqueado entonces inicio
 mientras no orientado-al-norte hacer gira-izquierda;
 repetir n veces gira-izquierda;
 si si-es-cero(n) entonces coge-zumbador;
 fin;
 fin;

 define-nueva-instruccion bloqueado(n) como inicio
 si frente-bloqueado entonces inicio
  media-vuelta;
  mientras frente-libre hacer avanza;
  gira-izquierda;
  si frente-libre entonces inicio
  avanza;
  gira-izquierda;

  fin
  sino inicio
  media-vuelta;
  mientras frente-libre hacer avanza;
  mientras junto-a-zumbador hacer coge-zumbador;
  repetir n veces deja-zumbador;
  apagate;
  fin;
  fin;
 fin;


define-nueva-instruccion avanzar(n) como inicio
 mientras frente-libre y no junto-a-zumbador hacer inicio
  avanza;
  avanzar(n);
 fin;

 si junto-a-zumbador entonces inicio
  verifica(0);


  si orientado-al-oeste entonces inicio
  si no junto-a-zumbador entonces deja-zumbador;
  mientras no orientado-al-norte hacer gira-izquierda;
  si frente-libre entonces inicio
  avanza;
  fin
  sino
  si frente-bloqueado y junto-a-zumbador entonces
  si derecha-libre entonces bloqueado(n) sino bloqueado(sucede(n));
  avanzar(sucede(n));
  fin
  sino si orientado-al-sur entonces inicio
  mientras no orientado-al-norte hacer gira-izquierda;
  si frente-libre entonces inicio
  avanza;
  fin
  sino
  si frente-bloqueado y junto-a-zumbador entonces
  bloqueado(n);
  avanzar(sucede(sucede(n)));
  fin
  sino si orientado-al-este entonces inicio
  mientras no orientado-al-norte hacer gira-izquierda;
  si frente-libre entonces inicio
  avanza;
  fin
  sino
  si frente-bloqueado y junto-a-zumbador entonces
  bloqueado(n);
  avanzar(sucede(sucede(sucede(n))));
  fin
  sino si orientado-al-norte entonces inicio

  si junto-a-zumbador entonces inicio
  si frente-libre entonces inicio
  avanza;
  fin
  sino
  si frente-bloqueado y junto-a-zumbador entonces
  bloqueado(n);
  avanzar(sucede(sucede(sucede(sucede(n)))));
  fin
  sino inicio
  deja-zumbador;
  si frente-libre entonces inicio
  avanza;
  fin
   sino
  si frente-bloqueado y junto-a-zumbador entonces
  bloqueado(n);

  avanzar(n);
  fin;
  fin;
 fin;

 si frente-bloqueado y no junto-a-zumbador entonces inicio
  media-vuelta;
  mientras frente-libre hacer avanza;
  gira-izquierda;
  si frente-libre entonces inicio
  avanza;
  gira-izquierda;
  avanzar(n);
  fin
  sino inicio
  media-vuelta;
  mientras frente-libre hacer avanza;
  mientras junto-a-zumbador hacer coge-zumbador;
  repetir n veces deja-zumbador;
  apagate;
  fin;
  fin;
fin;


 inicia-ejecucion
 mientras no orientado-al-oeste hacer gira-izquierda;
 mientras frente-libre hacer avanza;
 gira-izquierda;
 mientras frente-libre hacer avanza;
 media-vuelta;
 avanzar(0);
       apagate;
    termina-ejecucion
finalizar-programa
