# data[].attributes.body
Para explicar mejor los procesos utilizados en el programa dejamos los siguientes videos

# data[].attributes.body
variables
  robot1,robot2,robot3,robot4: tipo1
  robot5,robot6: tipo2
  robot7:tipo3
  robot8:tipo4
comenzar
  AsignarArea(robot1,areaR1)
  AsignarArea(robot2,areaR2)
  AsignarArea(robot3,areaR3)
  AsignarArea(robot4,areaR4)
  AsignarArea(robot1,areaG)
  AsignarArea(robot2,areaG)
  AsignarArea(robot3,areaG)
  AsignarArea(robot4,areaG)
  AsignarArea(robot1,areaD)
  AsignarArea(robot2,areaD)
  AsignarArea(robot3,areaD)
  AsignarArea(robot4,areaD)
  AsignarArea(robot5,areaR5)
  AsignarArea(robot6,areaR6)
  AsignarArea(robot5,areaD)
  AsignarArea(robot6,areaD)
  AsignarArea(robot5,areaCa)
  AsignarArea(robot6,areaCa)
  AsignarArea(robot7,areaD)
  AsignarArea(robot7,areaC)
  AsignarArea(robot8,areaJ)
  Iniciar(robot1, 7, 8)
  Iniciar(robot2,9,8)
  Iniciar(robot3, 11, 8)
  Iniciar(robot4,13,8)
  Iniciar (robot5,100,99)
  Iniciar(robot6, 99, 99)
  Iniciar(robot7, 2, 1)
  Iniciar(robot8, 1, 1)
fin

# data[].attributes.body
Luego para terminar, debemos declarar la cantidad de robots de cada tipo y en el código principal asignar las áreas a cada 1 de los robots e iniciarlos par dar comienzo con sus rutinas.

# data[].attributes.body
areas
  areaJ : AreaP(1,1,1,1)
  areaC : AreaP(2,1,2,1)
  areaR1 : AreaP(7,8,7,8)
  areaR2 : AreaP(9,8,9,8)
  areaR3 : AreaP(11,8,11,8)
  areaR4 : AreaP(13,8,13,8)
  areaR5 : AreaP(100,99,100,99)
  areaR6: AreaP(99,99,99,99)
  areaG: AreaPC (10,10,40,30)
  areaD: AreaPC(100,50,100,50)
  areaCa: AreaPC (1,100,100,100)

# data[].attributes.body
Para definir las áreas los primero que hicimos fue dedicarla la esquina (1,1,1,1) solo para el robot coordinador, para el jefe le asignamos la (2,1,2,1) también solo para él. Luego para los decoradores marcamos sus posiciones de inicio 1 particular para cada uno de ellos y estas son: (7,8,7,8), (9,8,9,8), (11,8,11,8) y (13,8,13,8). Lo mismo para los decoradores en las esquinas (100,99,100,99) y (99,99,99,99). Después la siguiente área que se necesita declarar es la que compartirán parcialmente los robots recolectores para buscar papeles, la cual es un cuadrado definido por las esquinas (10,10,40,30). También definimos como parcialmente compartida 2 áreas más, la esquina (100,50,100,50) donde los tipo1 dejan los papeles que los tipo2 necesitan y la calle 100 donde los decoradores dejarán.

# data[].attributes.body
robot tipo4
  variables
    total,aux,cant5,cant6,quienes:numero
  comenzar
    total:=0
    repetir 4
      RecibirMensaje(aux,*)
      total:=total+aux
    Informar(total)
    EnviarMensaje(aux,robot7)
    repetir 2
      RecibirMensaje (quienes,*)
      si (quienes=5)
        RecibirMensaje(cant5,robot5)
      si (quienes=6)
        RecibirMensaje(cant6,robot6)
    max (cant5,cant6,5,6,aux)
    Informar(aux)
  fin

# data[].attributes.body
Al robot jefe lo definimos como robot tipo4 y al igual que coordinador, solo hay 1. La rutina del jefe comienza recibiendo por mensaje la cantidad de papeles juntada por los recolectores para poder saber el total e informarlo, luego le indica al robot coordinador que puede darle la señal de inicio a los decoradores. Una vez finalizada la rutina de estos últimos el robot jefe recibe quien y cuantos papeles depositaron los decoradores, calcula el máximo entre los 2 y lo informa.

# data[].attributes.body
 robot tipo3
  variables
    miav,mica,sorteo,aux:numero
  comenzar
    miav:=PosAv
    mica:=PosCa
    BloquearEsquina(100,50)
    Pos(100,50)
    juntarP
    Pos(miav,mica)
    LiberarEsquina(100,50)
    repetir 10
      Random (sorteo,1,4)
      si sorteo=1
        EnviarMensaje (sorteo,robot1)
        RecibirMensaje (aux,robot1)
      si sorteo=2
        EnviarMensaje (sorteo,robot2)
        RecibirMensaje (aux,robot2)
      si sorteo=3
        EnviarMensaje (sorteo,robot3)
        RecibirMensaje (aux,robot3)
      si sorteo=4
        EnviarMensaje (sorteo,robot4)
        RecibirMensaje (aux,robot4)
    EnviarMensaje (0,robot1)
    EnviarMensaje (0,robot2)
    EnviarMensaje (0,robot3)
    EnviarMensaje (0,robot4)
    RecibirMensaje(aux,robot8)
    EnviarMensaje (5,robot5)
    EnviarMensaje(6,robot6)
  fin

# data[].attributes.body
Al robot coordinador lo definimos como tipo3 y solo hay uno. La labor de este robot es la siguiente. Primero lo que debe hacer es ir a la esquina donde los recolectores depositan los papeles(100,50) para asegurar que los decoradores coloquen la misma cantidad depositada por los recolectores .Despues de forma aleatoria debe elegir entre los robots recolectores para que hagan su rutina, esto lo repite 10 veces. Una vez terminado esto, debe enviarle un mensaje a cada robot recolector indicando que su rutina a acabado. Luego recibe un mensaje del robot 8 indicándole que los robots decoradores ya pueden iniciar su tarea entonces el coordinador se los indica.

# data[].attributes.body
robot tipo2
  variables
    miav,mica,cant,aux,av,quiensoy:numero
  comenzar
    aux:=1
    cant:=0
    miav:=PosAv
    mica:=PosCa
    RecibirMensaje(quiensoy,robot7)
    mientras (aux<>0)
      BloquearEsquina (100,50)
      Pos (100,50)
      si (HayPapelEnLaEsquina)
        tomarPapel
        cant:=cant+1
      sino
        aux:=0
      Pos(miav,mica)
      LiberarEsquina(100,50)
      si (aux<>0)
        Random (av,1,100)
        BloquearEsquina(av,100)
        Pos(av,100)
        depositarPapel
        Pos(miav,mica)
        LiberarEsquina(av,100)
    EnviarMensaje (quiensoy,robot8)
    EnviarMensaje (cant,robot8)
  fin

# data[].attributes.body
Los robots decoradores los definimos como tipo2 y hay 2 de ellos. Una vez que los robots recolectores finalizan su tarea lo comunican al robot coordinador para que les indique mediante un mensaje a los decoradores que pueden empezar su rutina. Lo que hacen es bloquear la esquina en la cual los tipo1 dejaron los papeles, ir hasta allí, tomar un papel (si es que hay), vuelve a su posición inicial y libera la esquina. Luego elige una avenida aleatoria sobre la calle 100 para depositar el papel. Esta rutina la repetirán los robots decoradores hasta que en la esquina (100,50) no haya más papeles, una vez ocurrido esto, le comunican por medio de un mensaje al robot jefe la cantidad de papeles que depositó cada uno de ellos.

# data[].attributes.body
robot tipo1
  variables
    miav,mica,ca,av,cantT,aux:numero
  comenzar
    aux:=1
    cantT:=0
    miav:=PosAv
    mica:=PosCa
    mientras (aux<>0)
      RecibirMensaje (aux,robot7)
      si (aux<>0)
        Random (av,10,40)
        Random (ca,10,30)
        BloquearEsquina(av,ca)
        Pos(av,ca)
        juntarPapeles (cantT)
        Pos (miav,mica)
        LiberarEsquina(av,ca)
        EnviarMensaje(aux,robot7)
    BloquearEsquina(100,50)
    Pos(100,50)
    DejarPapel(cantT)
    Pos(miav,mica)
    LiberarEsquina(100,50)
    EnviarMensaje(cantT,robot8)
  fin

# data[].attributes.body
Los robots recolectores los definimos como tipo1 y hay 4 de ellos. Su tarea se realiza por turnos donde aleatoriamente el robot coordinador elige 1 de los 4 para que haga su rutina. La misma comienza con el robot eligiendo una esquina aleatoriamente dentro del área designada (10,40,30,40), la bloquea se mueve hasta ella y levanta los papeles de la esquina (si es que hay) para después volver a su posición inicial y liberar la esquina. Luego de que se finalicen los 10 turnos los robots deberán dejar los papeles recolectados en la esquina (100,50), accediendo a ella 1 a la vez bloqueando y liberando la misma.

# data[].attributes.body
Nuestro enunciado plateaba el uso de 4 tipos de robots los recolectores, decoradores, coordinador y jefe.