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 ;