# Exercice sur TOUT

- Copiez ce fichier : farm.ads et le programme mission1.adb (l'acteur n'a pas de fichier .adb car il ne contient que des définitions de types)
- Prenez le temps de bien lire l'acteur `Farm`.

### Question 1

- Écrire une procédure `Affiche_Base` qui reçoit un argument de type `T_Jeu` et qui affiche les informations contenues dans le type article comme ceci :

      Bienvenue dans Top-Farmer !

        Score  :  0
        Argent :  8000 chbufs.

        Aucun enclos.
      ou, le cas échéant :
        La ferme est composée de  8 enclos.

  La dernière ligne affichée est différente selon qu'il y a des enclos ou non.
- Pour tester, il faut définir trois variables juste avant le begin du programme principal :
  - Une variable `Enclos_Vide` de type T_Enclos, que vous initialisez directement avec les valeurs 100m2, l'animal de votre choix, et 0 bebêtes (l'enclos est effectivement vide).
  - Une variable `Plan_Initial` de type T_Plan représentant 6 rangées de 4 enclos et dont chaque case est initialisée avec l'enclos_vide (se rappeler la construction (others => (others => ...)) à retrouver dans le poly).
  - Et enfin, une variable `Jeu` de type T_Jeu, initialisée directement avec les valeurs Score : 0, Argent : 8000 chbufs, 0 enclos, et le plan initial.
  Vous pouvez maintenant tester votre procédure (dans le programme principal) et vérifier qu'elle affiche la même chose que ci-dessus.

### Question 2

- Écrire une procédure `Affiche_Plan` qui reçoit un argument de type `T_Plan` et qui affiche les rangées de la matrice de cette manière :

      PP..
      C...
      ....
      VMP.
      ....
      CM..

  Les enclos vides sont représentés par un point, les enclos à vache avec V, les enclos à poule avec P, etc.
  En cas de problème avec le type énuméré, utilisez un CASE plutôt qu'un IF.
  Si vous testez maintenant avec la variable Jeu, vous n'avez que des points (tous les enclos sont vides).
- Pour gagner du temps ensuite, écrivez une procédure `Affiche` qui reçoit en argument un jeu et qui affiche ses informations et son plan.
- Écrire une fonction `Cout_Enclos` qui reçoit deux argument `Aire` de type Float (en m2) et `Animal` de type T_Animal et qui renvoie un entier (en chbufs).
  Cette fonction renvoie le coût d'un enclos dont on indique la surface et le type d'animal hébergé, sachant que le coût par m2 est :
  - 1.5 chbufs/m2 pour les poules
  - 2.0 chbufs/m2 pour les canards
  - 4.0 chbufs/m2 pour les moutons
  - 6.0 chbufs/m2 pour les vaches
  Cette fonction sera testée plus tard.
- Écrire une procédure `Ajoute_Enclos` avec plein d'arguments : une aire (en m2), un type d'animaux, un jeu (de type T_Jeu, en mode in out), et un numéro de ligne et de colonne.
  Cette procédure calcule le coût d'un enclos de la surface indiquée. Si le joueur n'a pas assez d'argent, un message s'affiche : pas assez d'argent, l'enclos coûte tant de chbufs. Si le joueur a assez d'argent, on lui décompte le prix à payer, et un nouvel enclos est placé sur le plan aux coordonnées indiquées par ligne et colonne. L'enclos est peuplé avec huit animaux au départ. Un message s'affiche pour indiquer que l'enclos a été ajouté (avec son coût).
- Pour tester, ajouter des enclos de 100 ou 200m2 correspondant au plan affiché ci-dessus (8 enclos en tout). Ajoutez un dernier enclos aux coordonnées (6,4) de surface 5000m2. Comme il coûte trop cher, vous vérifiez qu'il n'est pas ajouté au plan, et que le message s'affiche bien.

## Auto-correction

- Le corps de la procédure Affiche tient en deux lignes.
- Dans Ajoute_Enclos, vous faites appel à la fonction Cout_Enclos, vous n'avez surtout pas recopié le calcul du coût.
- Dans Ajoute_Enclos, avez-vous pensé à incrémenter le nombre d'enclos ?
- Vous pouvez vérifier que les coûts affichés sont corrects (pour les surfaces que vous avez choisies), et que l'argent qui reste est correctement calculé.

### Question 3

- Ajouter une procédure `Bonus` qui reçoit un Jeu en mode in out et qui augmente le score de 100 points par animal (en comptant bien tous les enclos).
- Testez, vous devriez avoir un score de 6400.

## Auto-correction

- La procédure Bonus n'affiche rien. Seules les procédures Afficher... affichent des messages.

### Question 4

- Le fermier s'est fait becqueter par un canard. Il a décidé de remplacer tous les enclos à canard par des enclos à poule.
  Écrire une procédure `Plus_de_canard` qui reçoit en argument un jeu en mode in out et qui remplace tous les enclos à canard par des enclos à poule, avec 1 seule poule.
- Pour tester cette procédure, il vous suffit d'ajouter deux lignes dans le programme principal.
- La nuit, des extra-terrestres passent dans les enclos et clonent les animaux avec un pistolet-cloneur.
  Écrire une procédure `Reproduction` qui reçoit en argument un jeu (in out) et qui augmente le nombre d'animaux dans chaque enclos avec les règles suivantes :
  - Le nombre de poules est augmenté de 100%
  - Le nombre de canards est augmenté de 80%
  - Le nombre de vaches est augmenté de 40%
  - Le nombre de moutons est augmenté de 60%
- Invoquer la procédure dans le corps du programme principal. Invoquer (une seconde fois) le calcul du bonus pour vérifier que vous obtenez 15100.

### Question 5

- Écrire une fonction `Lister` qui reçoit en argument un Jeu et qui renvoie la liste des enclos (non vides) du jeu. Cette liste est de type T_Liste_Enclos.
  Le nombre d'enclos est connu dès le départ. La liste est remplie en parcourant le plan case par case.
- Pour tester, écrire une procédure `Afficher_Liste` qui affiche les enclos de la liste de cette manière :

      Enclos  1 :  16 POULE(s)
      Enclos  2 :  16 POULE(s)
      Enclos  3 :  2 POULE(s)
      Enclos  4 :  11 VACHE(s)
      Enclos  5 :  12 MOUTON(s)
      Enclos  6 :  16 POULE(s)
      Enclos  7 :  2 POULE(s)
      Enclos  8 :  12 MOUTON(s)

  Pour simplifier la procédure, vous pouvez utiliser la fonction `T_Animal'Image`
- Testez (en une seule ligne) dans le programme principal. Vous devriez avoir la même chose que ci-dessus.
- Allez boire un coup.

### Question 6

- Écrire une fonction `Min_Enclos` qui reçoit en argument une liste d'enclos et renvoie la position dans la liste de l'enclos ayant le moins d'animaux.
- Testez en affichant l'enclos le moins peuplé du jeu. (Cela doit être un enclos peuplé de 2 poules).

### Question 7

- Écrire une fonction `Rangee_Vide` qui reçoit en argument un jeu et qui renvoie le numéro de la première rangée vide du plan (le numéro de ligne), ou -1 si aucune rangée n'est vide.La fonction doit arrêter son algorithme dès qu'une rangée vide est trouvée.
  Relisez la précision mentionnée à la fin de l'acteur Farm : vous en déduisez qu'une rangée est entièrement vide si et seulement si une certaine case de la rangée est vide.
- Pour tester, vous devriez trouver que la première rangée vide est la troisième.

### Question 8

- Une rangée est dite assortie lorsqu'elle contient les quatre types d'animaux (et aucun enclos de la rangée n'est vide).
  Le bonus dépend du nombre de rangées assorties :
  - 1 rangée assortie = 5 000 points
  - 2 rangées assorties = 20 000 points
  - 3 rangées assorties = 30 000 points
  - 4 rangées assorties = 50 000 points
  - 5 rangées assorties = 80 000 points
  - 6 rangées assorties = 100 000 points
- Écrire une procedure `Bonus_Assorti` qui prend un Jeu en mode in out et ajoute le bonus des rangées assorties.
- Écrire le test correspondant.

Solution utile si vous avez fait preuve de persévérance mission6.adb