TD n˚5 Le jeu des requins et des sardines
Transcription
TD n˚5 Le jeu des requins et des sardines
TD n˚5 Le jeu des requins et des sardines Florent Bouchez 10 janvier 2006 L’idée générale est tirée de http://graal.ens-lyon.fr/~lmarchal/algo-par/ dm05.pdf où l’on a oublié complétement l’aspect parallélisme pour ne garder que le côté ludique :-) 1 S’amuser avec l’écran L’écran dans lequel les programmes que vous écrivez racontent leur vie comporte exactement 80 colonnes et 25 lignes (normalement). Dans ce TD, nous allons voir qu’il est possible de se placer où l’on veut pour écrire et ça va être bien poilant. La déclaration uses crt ; au début d’un programme permet d’utiliser la bibliothèque de fonctions et procédures qui gère l’affichage à l’écran ; on y trouve par exemple clrcsr que vous connaissez bien. On y trouve également la procédure gotoxy qui place le curseur (petit machin qui clignotte) où l’on veut sur l’écran (vous remarquerez que le nom de la procédure se décompose en go-to-x-y, littéralement « aller à (x,y) »). Cette procédure a deux arguments qui sont les coordonnées (x,y) où placer le curseur. Attention : si l’abcisse n’est pas entre 1 et 80, ou que l’ordonnée n’est pas entre 1 et 24, le curseur est placé en (1,1), c’est à dire dans le coin en haut à gauche de l’écran. Question 1 Allez lire dans l’aide la partie sur crt et gotoxy. Entrainezvous à utiliser cette fonction en affichant dix astérisques “*” à des positions 1 aléatoires sur l’écran. Servons-nous maintenant du clavier. La fonction readkey est utilisée sans argument et bloque le programme jusqu’à ce qu’on appuie sur une touche. La valeur renvoyée par cette fonction est de type char dont les valeurs sont notées en pascal ’a’, ’x’, ’*’ . . . (et ainsi de suite pour toutes les touches). Les flèches du clavier : haut, bas, gauche, droite, correspondent respectivement aux caractères ’H’, ’P’, ’K’ et ’M’. Question 2 Faites un programme qui déplace le curseur quand on appuie sur les flèches et affiche “*” partout où il passe. Le programme doit s’arrêter si on appuie sur la touche espace.1 2 Le jeu des requins et des sardines Ce jeu se passe dans l’océan qu’on considère découpé en petites cases : on a une grille de taille la taille de l’écran et chaque case de la grille est soit vide, soit contient un poisson qui peut être un méchant requin ou une gentille sardine. Les poissons se déplacent, se reproduisent, mangent, meurent... Les règles sont les suivantes : – quand on met à jour un poisson, celui-ci veillit d’une unité de temps puis se déplace dans une des quatres directions au hasard ; – si la case d’arrivée n’est pas disponible (occupée par un poisson ou en dehors de la grille), le poisson ne se déplace pas ; – sauf si un requin arrive sur une case occupée par une sardine, dans ce cas il la mange∗ et prend sa place ; – si le poisson se déplace et a un atteint un âge supérieur à l’âge de reproduction (Asardine ou Arequin ), il laisse derrière lui un bébé poisson d’âge 1, et son âge est divisé par deux (il faut un certain temps avant de re-faire des bébés poissons) ; Le but de cette partie est de faire (petit à petit) un programme qui simule l’écosystème requins/sardines. Question 3 Avec notre ordinateur, on va se contenter d’un bout d’océan de taille 24 (on n’utilise pas la dernière ligne parce que je le veux) par 80. ∗ bouh le vilain requin 2 Définissez donc deux constantes L et C qui seront le nombre de lignes et le nombre de colonnes, ainsi qu’un tableau (à deux dimensions) var ocean : array [1..C, 1..L] of longint. Une case du tableau vaudra : – 0 si elle est vide ; – a s’il y a une sardine, avec a son âge ; – −a s’il y a un requin, avec a son âge ; Faites ensuite une procédure qui remplit le tableau avec S sardines et R requins à des positions aléatoires.2 Question 4 Écrivez une procédure affiche avec deux arguments x et y qui affiche l’état de l’océan sur la case (x, y) : – un espace si la case est vide ; – un ’.’ s’il y a une sardine ; – un ’O’ s’il y a un requin (pas beau). Utilisez cette procédure pour afficher entièrement l’océan de départ. Question 5 Maintenant, écrivez deplace, une procédure à deux arguments x et y qui regarde la case correspondante de l’océan, et s’il y a un poisson essaie de le déplacer selon les règles énoncées plus haut. Procédez étape par étape :3 – vérifiez s’il y a un poisson ; – choisir une direction au hasard ; – vérifiez s’il y a un poisson dans la case d’arrivée ; – déplacez le poisson. Ne vous occupez pas des requins qui mangent les sardines, ni de la reproduction pour l’instant. Question 6 Dans le corps du programme, faites une boucle qui appelle deplace sur toutes les cases de la grille jusqu’à ce qu’on appuie sur une touche.4 . † Maintenant vous avez des gentils poissons qui bougent dans leur baignoire... heu, océan. † Quel problème y a t’il à mettre à jour les cases dans cet ordre particulier ? On considère que c’est pas trop embêtant. 3 Question 7 Une fois que le déplacement fonctionne, ajoutez le fait que les requins mangent les sardines. Puis que les poissons se reproduisent. Vous constaterez que les requins finissent invariablement par contrôler tout l’océan, puisqu’ils ne meurent jamais. Nous allons donc rétablir un équilibre en décidant que si un requin n’a pas mangé depuis un temps Tf amine , il meurt de faim. Question 8 Utilisez un autre tableau à deux dimensions qui contient le temps qui s’est écoulé depuis que le requin correspondant a mangé une sardine. À chaque mise à jour d’un requin, ce temps augmente de 1. Si le requin arrive sur une sardine, ce compteur est remis à 0 ; sinon, si le compteur est supérieur à Tf amine , le requin meurt. Changez les constantes définissant les nombres initiaux de requins (malins) et sardines (coquines), les âges auxquels ils peuvent se reproduire, et le temps de famine des requins. Question supplémentaire 9 À chaque étape, comptez le nombre de sardines et requins, et affichez les sur la dernière ligne de l’écran le nombre total d’étapes et la moyenne d’âge de chaque catégorie. Question supplémentaire 10 Modifiez les couleurs de l’affichage en utilisant la procédure textcolor pour mettre des couleurs différentes en fonction de l’âge et la faim des poissons (par exemple en rouge les requins qui vont bientôt crier « Famine »). Indices 1 Vous pouvez utiliser la structure de boucle suivante : repeat instructions until condition ; qui répète toutes les instructions jusqu’à ce que la condition soit vraie (la différence avec la boucle while est que le test est effectué à la fin de la boucle et non au début ; en particulier, le corps de boucle est exécuté au moins une fois). 2 Définissez des constantes S et R pour pouvoir tester des valeurs différentes dans la suite. 3 Le mot-clé exit permet de sortir immédiatement d’une procédure. 4 la fonction keypressed renvoie True si une touche a été pressée, False sinon 4