# ecorobot.ads

    --
    -- Pilotage des robots
    --
    package EcoRobot is

       -- Renvoie le nombre de robots de la grille
       -- Les robots sont numérotés de 1 à N.
       function Nombre_Robots return Integer ;

       -- Attend que l'utilisateur appuie sur "entrée"
       -- (L'utilisation de cette procédure est purement facultatif)
       procedure Attendre_Entree ;

       -- Indique si le robot NUM a atteint la cible.
       function Robot_Content (Num : Integer) return Boolean ;

       -- Indique le nombre de robots ayant atteint la cible
       function Nb_Robots_Contents return Integer ;

       -- Renvoie l'abscisse (X) du robot NUM
       function Abscisse (Num : Integer) return Integer ;

       -- Renvoie l'ordonnée (Y) du robot NUM
       function Ordonnee (Num : Integer) return Integer ;

       --
       -- Demande au robot NUM de se déplacer vers la case indiquée,
       -- qui doit être une case adjacente à celle du robot,
       -- horizontalement ou verticalement. (Le robot ne se déplace
       -- pas en diagonale).
       --
       -- La case (0,0) est en haut à gauche.
       -- L'axe des Y est croissant vers le bas.
       --
       procedure Step (Num : Integer ; X, Y : Integer) ;

       -- Liste des directions (à utiliser dans la mission 1)
       Nord      : constant Integer := 1 ;
       Est       : constant Integer := 2 ;
       Sud       : constant Integer := 3 ;
       Ouest     : constant Integer := 4 ;

       -- Liste des objets
       Rien      : constant Character := 'Z' ;
       Billets   : constant Character := 'B' ;
       Cible     : constant Character := 'C' ;
       Robot     : constant Character := 'R' ;
       -- Dehors signifie que la case est en dehors des limites du plateau
       Dehors    : constant Character := 'X' ;

       --
       -- Renvoie le code de l'objet (selon la liste ci-dessus)
       -- qui se situe sur la case indiquée.
       --
       function Scan (X, Y : Integer) return Character ;

       ---------------------------------------------------------
       --  La suite n'est utile que pour les missions 2 et 3  --
       ---------------------------------------------------------

       --
       -- Chaque robot a une préférence pour effectuer sa chorégraphie
       -- de la mission 2.
       --
       -- Le type T_Preference contient 4 attributs entiers dont les valeurs
       -- sont toujours de 1 à 4.
       -- Par exemple, si Bord_Sud vaut 1 et Bord_Ouest vaut 2, cela signifie que
       -- la chorégraphie doit commencer par le bord sud puis aller ensuite au
       -- bord ouest (puis le bord ayant la valeur 3 et enfin celui ayant la valeur 4).
       --
       -- Tous les robots n'ont pas les mêmes préférences. Voir la fonction ci-dessous.
       --
       type T_Preference is record
          Bord_Nord  : Integer ;
          Bord_Sud   : Integer ;
          Bord_Est   : Integer ;
          Bord_Ouest : Integer ;
       end record ;

       -- Renvoie les préférences du robot NUM.
       function Preferences (Num : Integer) return T_Preference ;

       --------------------------------------------------
       --  La suite n'est utile que pour la mission 3  --
       --------------------------------------------------

       --
       -- Le robot peut maintenant laisser des post-it sur son passage.
       -- Mais il ne peut laisser qu'un seul post-it sur chaque case.
       --
       -- Le post-it peut contenir quatre booléens, un entier et un caractère.
       --

       type T_PostIt is record
          BooA : Boolean ;
          BooB : Boolean ;
          BooC : Boolean ;
          BooD : Boolean ;
          IVal : Integer ;
          CVal : Character ;
       end record ;

       -- Au début, toutes les cases contiennent un post-it
       -- (False, False, False, False, 0, '0')

       -- Dépose un post-it sur la case où se trouve le robot NUM.
       -- Détruit le post-it présent précédemment.
       procedure Depose_PostIt (Num : Integer ; PostIt : T_PostIt) ;

       -- Lit le post-it présent sur la case du robot NUM
       function Lit_PostIt (Num : Integer) return T_PostIt ;

    end EcoRobot ;