Objectifs

  • Mettre en application toutes les compétences ALGO de première année.

Prérequis

  • Il est préférable d'avoir effectué les différents exercices précédents.

Exercices

Ferme
Exercice : Programmation de la logique interne d'un jeu de simulation de ferme.
  • 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.
StarQuestion 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.
StarStarQuestion 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 arguments Aire de type Float (en m2) et Animal de type T_Animal et qui renvoie un entier (en chbufs). Function Cout_EnclosCette 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. Procedure Ajoute_EnclosCette 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é (8 enclos en tout).
    PP..
    C...
    ....
    VMP.
    ....
    CM..
    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é.
StarQuestion 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).Procedure Bonus
  • 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.
Ferme
StarStarQuestion 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.Procedure Plus_de_canard
  • 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%
    Procedure Reproduction
  • 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.
  • Si nécessaire, cherchez sur internet comment se reproduisent vraiment les poules, canards, vaches et moutons.
StarStarQuestion 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.Function Lister
  • 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)
    Procedure Afficher_Liste
  • 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.
Ferme
StarStarQuestion 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.Function Min_Enclos
  • Testez en affichant l'enclos le moins peuplé du jeu. (Cela doit être un enclos peuplé de 2 poules).
StarStarQuestion 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.Function Rangee_Vide
  • Pour tester, vous devriez trouver que la première rangée vide est la troisième.
StarStarStarQuestion 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 : Animaux
    • 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
Solution utile si vous avez fait preuve de persévérance mission6.adb.

Acteurs utilisés

Bilan

  • Vous savez maintenant que vous êtes capables de représenter toutes sortes de données et de les exploiter de nombreuses manières (affichage, transformation, extraction d'information utile).
  • En particulier, vous êtes en mesure de programmer le noyau logique d'un jeu ou d'une simulation.