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