INF220 - TP Séance 6
Durée : 2h00
Objectifs
- Réviser les boucles.
- Réviser la récursivité.
- Faire un dessin de labyrinthe.
- Faire un parcours de labyrinthe.
Au menu
- Consignes
- Dessin du labyrinthe
- Parcours du labyrinthe
Lisez attentivement cet énoncé de TP
en suivant les instructions.
En cas d'interrogation,
faites appel à moi,
que ce soit pour en savoir plus sur un des points abordés pendant le TP, ou
pour savoir comment effectuer une des tâches demandées (numérotées pour pouvoir
y faire référence simplement).
Surtout
ne restez pas bloqué(e) sur une des questions.
Entre parenthèses, à côté des titres de sous-sections, est indiqué
le temps que vous avez dû passer à effectuer les étapes précédentes.
On cherche à dessiner le labyrinthe montré dans le dessin ci-dessous.
Ce labyrinthe a été codé comme un tableau de tableaux d'entiers appelé laby :
- chaque case du labyrinthe est un carré de 10 pixels de côté, et le labyrinthe est dessiné en haut à gauche, à partir du point
de coordonnées (0,0)
- chaque case du tableau laby est un tableau d'entiers qui correspond à une ligne de cases du labyrinthe
- dans ce tableau d'entiers qui correspond à une ligne, le 0 signifie qu'on doit dessiner une case blanche, le 1
qu'on doit dessiner une case noire, le 2 qu'on doit dessiner une case verte (point de départ), et le 3
qu'on doit dessiner une case rouge (point d'arrivée)
question(); ?>Téléchargez et compilez le fichier
INF220TP6.java.
question(); ?>Allez voir dans le code de la fonction
paint comment le tableau de tableaux d'entiers laby est créé.
On va écrire une fonction
dessineLigneLabyrinthe qui va permettre
de dessiner une ligne de cases du labyrinthe. Cette fonction prend en entrée
un objet Graphics
g, un tableau d'entiers
tab (qui contient des 0, des 1,
des 2 ou des 3), et un entier
hauteur, qui indique à quelle hauteur se situe la ligne à dessiner.
Elle ne renvoie rien en sortie.
question(); ?>Écrivez la ligne de déclaration de la fonction
dessineLigneLabyrinthe.
Pour savoir ce que doit faire la fonction
dessineLigneLabyrinthe, prenons un exemple : si l'on veut dessiner la
quatrième ligne du labyrinthe (voir copie d'écran ci-dessous), comme les cases d'un tableau sont numérotées à
partir de 0 en Java, il faut donner en paramètre de
dessineLigneLabyrinthe (pour le paramètre
tab)
la case numéro 3 du tableau de tableaux
laby,
c'est-à-dire
laby[3] (
laby[3] est le tableau d'entiers {1,0,1,0,0,0,0,1}).
Comme les cases font 10 pixels de haut, la case la plus à gauche de cette ligne
sera dessinée à l'abscisse 0 et à l'ordonnée 30 : le paramètre d'entrée
hauteur
aura donc la valeur 30 dans ce cas.
question(); ?>Ecrivez la fonction
dessineLigneLabyrinthe en vous aidant des réponses que vous venez d'écrire dans le
formulaire ci-dessus.
On rappelle les fonctions utiles pour ce TP :
- dessineRectanglePlein(Graphics g, int abscisseCoin, int ordonneeCoin, int largeur, int hauteur, Color couleur),
qui dessine sur l'objet g un rectangle dont l'intérieur est coloré de la même couleur
couleur que la bordure, dont le coin en haut à gauche a pour coordonnées (abscisseCoin,ordonneeCoin),
et qui a pour largeur largeur et pour hauteur hauteur
- couleurRGB(int r,int g,int b) qui renvoie une couleur, de type Color,
qui est une combinaison de rouge, vert et bleu, ces trois couleurs correspondant
aux variables d'entrée r, g et b qui sont des entiers entre
0 et 255.
question(); ?>Ecrivez dans la fonction paint
un appel de la fonction dessineLigneLabyrinthe afin de dessiner la troisième ligne du labyrinthe.
question(); ?>Modifiez le code de la fonction
paint pour dessiner toutes les lignes du labyrinthe.
Indication : comme vous avez besoin de répéter le dessin d'une
ligne du labyrinthe, il faut utiliser une boucle, et à chaque fois
appeler dessineLigneLabyrinthe avec les bons paramètres.
L'objectif de cette partie est de parcourir le labyrinthe en partant des cases
vertes en haut à gauche, jusqu'à atteindre la case rouge en bas à droite.
A chaque fois qu'une case est parcourue, on la colore d'une couleur
verte qui tend de plus en plus vers le rouge. L'objectif est donc
d'aboutir à l'image suivante, qui montre le parcours du labyrinthe :
Pour cela, vous allez créer une fonction récursive
parcourtLabyrinthe
qui prend en entrée un objet Graphics
g, un tableau
de tableaux d'entiers
laby, deux entiers
numeroHorizontal
et
numeroVertical qui indiquent sur quelle case du labyrinthe on se trouve
(au début, on se trouve sur la case blanche juste à droite de la case verte du
bas, c'est-à-dire que
numeroHorizontal vaut 1, et
numeroVertical vaut 1),
et enfin un entier
energie, qui va permettre de choisir la bonne couleur
(vert au début, et rouge à la fin :
energie vaudra 255 au début du parcours
du labyrinthe, et sera diminué progressivement au fur et à mesure du parcours).
Le principe de cette fonction est le suivant :
- dès qu'on arrive sur une case, on commence par vérifier (selon les
valeurs de numeroHorizontal et de numeroVertical
qu'elle est bien dans le labyrinthe,
et qu'on est pas sorti par erreur du labyrinthe.
- on passe le contenu de la case à 2 dans le tableau de tableaux d'entiers laby, pour dire qu'on l'a visitée
- on dessine un petit carré à son emplacement. La couleur de ce petit carré est composée
de la manière suivante : 0 bleu, energie vert, 255-energie rouge (ainsi
les cases seront vertes au début et tendront vers le rouge au fur et à mesure du parcours)
- on appelle récursivement l'algorithme parcourtLabyrinthe pour visiter :
- la case juste en haut,
- la case juste en bas,
- la case juste à gauche,
- la case juste à droite,
seulement dans le cas où cette case n'a pas encore été visitée (et que ce n'est
pas un mur du labyrinthe), c'est-à-dire que pour cette case,
le tableau de tableaux d'entiers laby contient la valeur 0.
- en s'arrêtant dès qu'on tombe sur la case rouge finale, c'est-à-dire la case pour laquelle
le tableau de tableaux d'entiers laby contient la valeur 3.
question(); ?>Ecrivez le code de l'algorithme parcourtLabyrinthe.
question(); ?>Appelez-le depuis la fonction paint pour obtenir l'image attendue.