Exercices en Java (06-Tableaux)

Sébastien ESTIENNE

Ce sixième chapitre concerne les tableaux.
Il comporte sept exercices. Le premier est un exercice sur le Tri bulle. Le deuxième exercice porte sur le jet de dés. Le troisième est sur la Tortue graphique. Le quatrième exercice porte sur le crible d'Eratosthène. Le cinquième et le sixième sont sur le tri par sélection et la recherche binaire. Le dernier exercice est sur le parcours de labyrinthe.

Les principales notions abordées sont les suivantes :

- Notion de tableau ;

- Déclaration de tableaux ;

- Allocation de la mémoire ;

- Initialisation des tableaux ;

- Accéder aux valeurs d'un tableau ;

- Utiliser des tableaux pour le stockage, le tri, la recherche ;

- Passer un tableau à une méthode ;

- Tableaux multidimensionnels.

Pour faire et comprendre ces exercices, vous aurez besoin d'un certain nombre de notions sur le Java en rapport avec le chapitre. Pour cela, vous pouvez consulter les tutoriels java de developpez à l'adresse suivante : https://java.developpez.com/cours/

La documentation de l'API sur le site de Sun est aussi une mine d'or : http://java.sun.com/javase/6/docs/api/ ♪

- Titre : Exercices en Java (06-Tableaux)

- Auteur : Sébastien ESTIENNE

- Parution : 22 juillet 2007

- Mise à jour : 23 décembre 2007

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2007 Sébastien ESTIENNE. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Tri Bulle

- I-1. Énoncé

- I-2. Aperçu

- I-3. Démonstration

- I-4. Solution

- II. Jet de dés

- II-1. Énoncé

- II-2. Aperçu

- II-3. Démonstration

- II-4. Solution

- III. Tortue Graphique

- III-1. Énoncé

- III-2. Aperçu

- III-3. Démonstration

- III-4. Solution

- IV. Crible d'Eratosthène

- IV-1. Énoncé

- IV-2. Aperçu

- IV-3. Démonstration

- IV-4. Solution

- V. Tri Par Sélection

- V-1. Énoncé

- V-2. Aperçu

- V-3. Démonstration

- V-4. Solution

- VI. Recherche binaire

- VI-1. Énoncé

- VI-2. Aperçu

- VI-3. Démonstration

- VI-4. Solution

- VII. Parcours de labyrinthe

- VII-1. Énoncé

- VII-2. Aperçu

- VII-3. Démonstration

- VII-4. Solution

- VIII. Remerciements

I - Tri Bulle

I-1 - Énoncé

Le tri de données est un problème qui revient souvent. Le tri bulle est un tri simple qui n'est pas fait pour de grands tableaux. Écrivez l'algorithme du tri à bulle. (Cet algorithme consiste à comparer les différentes valeurs adjacentes d'un tableau et à les échanger si besoin est. À chaque passage du tableau, un élément supplémentaire est trié. Le nombre de passages nécessaires pour trier le tableau dans son intégralité est donc de la taille du tableau moins un.)
Améliorez-le ensuite sachant qu'à chaque passage supplémentaire une valeur de plus est triée à la fin du tableau. Ainsi à chaque passage le nombre de comparaisons nécessaires diminue de 1.
Il est possible que le tableau soit trié avant que tous les passages du tableau ne soient effectués. La deuxième amélioration consiste donc à vérifier que si aucune permutation n'a été faite, d'arrêter l'algorithme de tri.

Note : ce tri est à titre d'exemple. La bibliothèque Java fournit une classe Arrays qui offre différentes fonctions dont une recherche binaire et un de tri performant basé sur le tri rapide.

Classes de l'API utilisées :

- java.awt.BorderLayout

- java.awt.Container

- javax.swing.JFrame

- javax.swing.JScrollPane

- javax.swing.JTextArea

I-2 - Aperçu

Aperçu du résultat.

I-3 - Démonstration

Lancer avec Java Web Start

Note : javaws -viewer (accessible aussi dans le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

I-4 - Solution

TriBulle.java

1. /*

2. * Fichier: TriBulle.java

3. * Crée le: 13 décembre 2006.

4. * Modifié: 7 juillet 2007.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre6;

27. import java.awt.BorderLayout;

28. import java.awt.Container;

30. import javax.swing.JFrame;

31. import javax.swing.JScrollPane;

32. import javax.swing.JTextArea;

36. /**

37. * <p>Tri bulle amélioré.</p>

38. * @author Sébastien ESTIENNE.

39. */

40. public class TriBulle extends JFrame

41. {

42. /**

43. * <p>Serial version UID.</p>

44. */

45. private static final long serialVersionUID = 1L;

48. /**

49. * <p>Construction de l'application.</p>

50. */

51. public TriBulle()

52. {

53. // Appel du constructeur de la classe JFrame.

54. super("Tri Bulle");

56. // Obtenir le panneau de contenu et changer son layout en un FlowLayout.

57. Container conteneur = getContentPane();

58. conteneur.setLayout(new BorderLayout());

60. // Zone de texte de sortie.

61. JTextArea zoneSortie = new JTextArea();

62. zoneSortie.setEditable(false);

64. // Ajoute la zone de sortie au conteneur.

65. conteneur.add(new JScrollPane(zoneSortie));

67. // Tableau des valeurs à trier.

68. int[] tableau = {5, 56, 34, 43, 17, 25, 8, 65, 31, 52};

70. // Chaine de caractère de sortie.

71. StringBuilder sortie = new StringBuilder();

73. // Ajoute à la chaine de sortie les valeurs de départ du tableau.

74. sortie.append("Valeurs de départ du tableau:\n");

75. for(int i = 0; i < tableau.length; i++)

76. {

77. sortie.append("  ").append(tableau[i]);

78. }

80. // Trie le tableau.

81. triBulle(tableau);

83. // Ajoute à la chaine de sortie les valeurs triées du tableau.

84. sortie.append("\n\n");

85. sortie.append("Valeurs triées du tableau:\n");

86. for(int i = 0; i < tableau.length; i++)

87. {

88. sortie.append("  ").append(tableau[i]);

89. }

91. // Met à jour la zone de sortie.

92. zoneSortie.setText(sortie.toString());

94. // Modifie les propriétés de la fenêtre.

95. setSize(300, 150);

96. setLocation(100, 100);

97. setVisible(true);

98. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

99. }

102. /**

103. * <p>Effectue un tri bulle.</p>

104. * @param tableau Les valeurs à trier.

105. */

106. public void triBulle(int[] tableau)

107. {

108. // Nombre de passages nécessaires pour trier le tableau d'entiers.

109. for(int i = 1; i < tableau.length; i++)

110. {

111. // Indique s'il faut continuer le tri ou non.

112. boolean continuer = false;

114. // Un passage dans le tableau permettant de trier un élément.

115. for(int j = 0; j < tableau.length - i; j++)

116. {

117. // Compare une paire d'éléments et les permute si le premier est supérieur au second.

118. if(tableau[j] > tableau[j + 1])

119. {

120. permuter(tableau, j, j + 1);

121. continuer = true;

122. }

123. }

125. // Si aucune permutation n'a été effectuée, alors le tableau est déjà trié.

126. if(!continuer)

127. {

128. break;

129. }

130. }

131. }

134. /**

135. * <p>Permutte deux éléments d'un tableau.</p>

136. * @param tableau Le tableau concerné.

137. * @param i L'indice du premier élément.

138. * @param j L'indice du second élément.

139. */

140. public void permuter(int[] tableau, int i, int j)

141. {

142. // Variable temporaire pour la permutation.

143. int temp;

145. temp = tableau[i];

146. tableau[i] = tableau[j];

147. tableau[j] = temp;

148. }

151. /**

152. * <p>Lance l'application.</p>

153. * @param args Les paramètres de la ligne de commande.

154. */

155. public static void main(String[] args)

156. {

157. new TriBulle();

158. }

159. }

II - Jet de dés

II-1 - Énoncé

Écrivez une application qui simule grâce à des nombres aléatoires un lancer de deux dés. Il existe 36 combinaisons et la somme des deux dés est comprise entre 2 et 12 avec certaines sommes plus fréquentes que d'autres. Simulez 36000 lancers et stockez la fréquence de chaque somme dans un tableau. Affichez ensuite les résultats dans une zone de texte et vérifiez que les fréquences sont correctes.
Ajoutez aussi un bouton afin de pouvoir effectuer de nouvelles séries de lancers de dés.

Fréquence des possibilités :

- 2: 1

- 3: 2

- 4: 3

- 5: 4

- 6: 5

- 7: 6

- 8: 5

- 9: 4

- 10: 3

- 11: 2

- 12: 1

Classes de l'API utilisées :

- java.awt.BorderLayout

- java.awt.Container

- java.awt.event.ActionEvent

- java.awt.event.ActionListener

- javax.swing.JButton

- javax.swing.JFrame

- javax.swing.JScrollPane

- javax.swing.JTextArea

II-2 - Aperçu

Aperçu du résultat.

II-3 - Démonstration

Lancer avec Java Web Start

Note : javaws -viewer (accessible aussi dans le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

II-4 - Solution

JetDeDes.java

1. /*

2. * Fichier: JetDeDes.java

3. * Crée le: 17 décembre 2006.

4. * Modifié: 7 juillet 2007.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre6;

27. import java.awt.BorderLayout;

28. import java.awt.Container;

29. import java.awt.event.ActionEvent;

30. import java.awt.event.ActionListener;

32. import javax.swing.JButton;

33. import javax.swing.JFrame;

34. import javax.swing.JScrollPane;

35. import javax.swing.JTextArea;

39. /**

40. * <p>Calcule la fréquence de la somme de lancers de deux dés.</p>

41. * @author Sébastien ESTIENNE.

42. */

43. public class JetDeDes extends JFrame implements ActionListener

44. {

45. /**

46. * <p>Serial version UID.</p>

47. */

48. private static final long serialVersionUID = 1L;

50. /** Nombre de lancers. */

51. private static final int NB_LANCERS = 36000;

53. /** Tableau de fréquence des sommes des lancers de dés. */

54. private int[] tableau = new int[13];

56. /** Zone de texte de sortie. */

57. private JTextArea zoneSortie;

59. /** Bouton permettant d'effectuer une série de lancers. */

60. private JButton boutonLancer;

63. /**

64. * <p>Construction de l'application.</p>

65. */

66. public JetDeDes()

67. {

68. // Appel du constructeur de la classe JFrame.

69. super("Jet de dés");

71. // Création de la zone de sortie.

72. this.zoneSortie = new JTextArea();

73. this.zoneSortie.setEditable(false);

75. // Création du bouton de lancement.

76. this.boutonLancer = new JButton("Lancer");

78. // Ajoute une action sur le bouton.

79. this.boutonLancer.addActionListener(this);

81. // Conteneur.

82. Container conteneur = getContentPane();

84. // Ajoute les composants au conteneur.

85. conteneur.add(new JScrollPane(this.zoneSortie), BorderLayout.CENTER);

86. conteneur.add(this.boutonLancer, BorderLayout.SOUTH);

88. // Modifie les propriétés de la fenêtre.

89. setSize(300, 200);

90. setLocation(100, 100);

91. setVisible(true);

92. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

93. }

96. /**

97. * <p>Traite une série de lancers de dés.</p>

98. * @param actionEvent Un événement sémantique qui indique qu'une action s'est produite dans le

99. *        composant concerné.

100. */

101. public void actionPerformed(ActionEvent actionEvent)

102. {

103. // Effectue la série de lancers.

104. lancer();

106. // Initialise le texte de sortie.

107. StringBuilder sortie = new StringBuilder("Fréquence des résultats des lancers de dés:\n");

108. for(int i = 2; i < this.tableau.length; i++)

109. {

110. sortie.append(i).append(" : ").append(this.tableau[i]).append('\n');

111. }

113. // Met à jour la zone de sortie.

114. this.zoneSortie.setText(sortie.toString());

115. }

118. /**

119. * <p>Effectue une série de lancers de dés.</p>

120. */

121. public void lancer()

122. {

123. // Résultats des lancers de dés.

124. int d1, d2;

126. // Initialise le tableau.

127. for(int i = 0; i < this.tableau.length; i++)

128. {

129. this.tableau[i] = 0;

130. }

132. // Effectue les lancers.

133. for(int i = 0; i < JetDeDes.NB_LANCERS; i++)

134. {

135. // Lance les dés.

136. d1 = 1 + (int) (Math.random() * 6);

137. d2 = 1 + (int) (Math.random() * 6);

139. // Ajoute le résultat du lancer.

140. this.tableau[d1 + d2]++;

141. }

142. }

145. /**

146. * <p>Lance l'application.</p>

147. * @param args Les paramètres de la ligne de commande.

148. */

149. public static void main(String[] args)

150. {

151. new JetDeDes();

152. }

153. }

III - Tortue Graphique

III-1 - Énoncé

Le langage Logo est connu pour le concept de la tortue graphique. Elle permet de dessiner sur une feuille. La tortue a deux états : relevée et descendue.
Lorsque celle-ci est relevée, elle peut se déplacer librement et quand elle est descendue, elle laisse une trace de ses mouvements.
Écrivez un applet avec les fonctionnalités suivantes :
La feuille de dessin est représentée par un tableau de 20 par 20. La position de la tortue et de son état sont conservés dans des variables. Au départ la tortue est sur la case 0,0 et relevée. Les commandes de déplacement de la tortue sont stockées dans un tableau.

La liste des commandes est :

- 1 : Relever la tortue ;

- 2 : Abaisser la tortue ;

- 3 : Tourner vers la droite ;

- 4 : Tourner vers la gauche ;

- 5,n : Avancer de n cases ;

- 6 : Afficher la feuille de dessin.

Quand la tortue fait une trace sur une case, la valeur de la case dans le tableau est ajustée à 1. Pour l'affichage de la feuille, utilisez des astérisques ( '* ' ) et des points ( '. ' ) à police de caractères fixe (monospaced) dans un JTextArea.
Voici un exemple de programme simple :
5, 3, 3, 5, 8, 2, 5, 8, 4, 5, 8, 4, 5, 8, 4, 5, 8, 1, 3, 5, 5, 3, 5, 5, 2, 5, 8, 3, 5, 8, 3, 5, 8, 3, 5, 8, 1

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . * * * * * * * * * . . .
. . . . . . . . * . . . . . . . * . . .
. . . . . . . . * . . . . . . . * . . .
. . . . . . . . * . . . . . . . * . . .
. . . . . . . . * . . . . . . . * . . .
. . . * * * * * * * * * . . . . * . . .
. . . * . . . . * . . * . . . . * . . .
. . . * . . . . * . . * . . . . * . . .
. . . * . . . . * * * * * * * * * . . .
. . . * . . . . . . . * . . . . . . . .
. . . * . . . . . . . * . . . . . . . .
. . . * . . . . . . . * . . . . . . . .
. . . * . . . . . . . * . . . . . . . .
. . . * * * * * * * * * . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .

Classes de l'API utilisées :

- java.awt.Container

- java.awt.Font

- javax.swing.JFrame

- javax.swing.JScrollPane

- javax.swing.JTextArea

III-2 - Aperçu

Aperçu du résultat.

III-3 - Démonstration

Lancer avec Java Web Start

Note : javaws -viewer (accessible aussi dans le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

III-4 - Solution

TortueGraphique.java

1. /*

2. * Fichier: TortueGraphique.java

3. * Crée le: 18 décembre 2006.

4. * Modifié: 7 juillet 2007.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre6;

27. import java.awt.Container;

28. import java.awt.Font;

30. import javax.swing.JFrame;

31. import javax.swing.JScrollPane;

32. import javax.swing.JTextArea;

36. /**

37. * <p>Simulation de la tortue graphique.</p>

38. * @author Sébastien ESTIENNE.

39. */

40. public class TortueGraphique extends JFrame

41. {

42. /**

43. * <p>Serial version UID.</p>

44. */

45. private static final long serialVersionUID = 1L;

47. /** Taille de la feuille de dessin. */

48. private static final int TAILLE = 20;

50. /** Direction : vers la droite. */

51. private static final int DROITE = 0;

53. /** Direction : vers le haut. */

54. private static final int HAUT = 1;

56. /** Direction : vers la gauche. */

57. private static final int GAUCHE = 2;

59. /** Direction : vers le bas. */

60. private static final int BAS = 3;

62. /** État de la tortue : Relevée. */

63. private static final int RELEVE = 0;

65. /** État de la tortue : Abaissée. */

66. private static final int ABAISSE = 1;

68. /** Tableau représentant la feuille de dessin. */

69. private boolean[][] feuille;

71. /** Position de la tortue. */

72. private int px = 0, py = 0;

74. /** État de la tortue. */

75. private int etat = TortueGraphique.RELEVE;

77. /** Direction de la tortue. */

78. private int direction = TortueGraphique.DROITE;

80. /** Zone de texte de sortie. */

81. private JTextArea zoneSortie;

84. /**

85. * <p>Construction de l'application.</p>

86. */

87. public TortueGraphique()

88. {

89. // Appel du constructeur de la classe JFrame.

90. super("Tortue Graphique");

92. // Initialise la zone de texte de sortie.

93. this.zoneSortie = new JTextArea();

94. this.zoneSortie.setEditable(false);

95. this.zoneSortie.setFont(new Font("Monospaced", Font.BOLD, 10));

97. // Conteneur.

98. Container conteneur = getContentPane();

100. // Ajoute les composants au conteneur.

101. conteneur.add(new JScrollPane(this.zoneSortie));

103. // Initialisation.

104. this.feuille = new boolean[TortueGraphique.TAILLE][TortueGraphique.TAILLE];

105. this.px = 0;

106. this.py = 0;

107. this.etat = TortueGraphique.RELEVE;

108. this.direction = TortueGraphique.DROITE;

110. // Programme.

111. int[] pgm = {5, 3, 3, 5, 8, 2, 5, 8, 4, 5, 8, 4, 5, 8, 4, 5, 8, 1, 3, 5, 5, 3, 5, 5, 2, 5, 8,

112. 3, 5, 8, 3, 5, 8, 3, 5, 8, 1, 6};

114. // Lance un programme.

115. lancer(pgm);

117. // Modifie les propriétés de la fenêtre.

118. setSize(280, 340);

119. setLocation(100, 100);

120. setVisible(true);

121. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

122. }

125. /**

126. * <p>Lance un programme de contrôle de tortue graphique.</p>

127. * @param programme Le programme à lancer.

128. */

129. public void lancer(int[] programme)

130. {

131. int i = 0;

132. while(i < programme.length)

133. {

134. switch(programme[i])

135. {

136. // Relever la tortue.

137. case 1:

138. this.etat = TortueGraphique.RELEVE;

139. break;

140. // Abaisser la tortue.

141. case 2:

142. this.etat = TortueGraphique.ABAISSE;

143. this.feuille[this.py][this.px] = true;

144. break;

145. // Tourner vers la droite.

146. case 3:

147. this.direction = (this.direction + 3) % 4;

148. break;

149. // Tourner vers la gauche.

150. case 4:

151. this.direction = (this.direction + 1) % 4;

152. break;

153. // Avancer de n cases.

154. case 5:

155. if(i < programme.length - 1)

156. {

157. tracer(programme[++i]);

158. }

159. break;

160. // Affiche la feuille de dessin.

161. case 6:

162. this.zoneSortie.setText(representerFeuille());

163. break;

164. default:

165. break;

166. }

167. i++;

168. }

169. }

172. /**

173. * <p>Trace un trait de la longueur indiquée suivant la direction courante.</p> <p>L'algorithme

174. * pourrait être optimisé.</p>

175. * @param nb Le nombre de cases.

176. */

177. public void tracer(int nb)

178. {

179. for(int i = 0; i < nb; i++)

180. {

181. switch(this.direction)

182. {

183. case TortueGraphique.DROITE:

184. if(this.px < TortueGraphique.TAILLE - 1)

185. {

186. this.px++;

187. }

188. break;

189. case TortueGraphique.HAUT:

190. if(this.py > 0)

191. {

192. this.py--;

193. }

194. break;

195. case TortueGraphique.GAUCHE:

196. if(this.px > 0)

197. {

198. this.px--;

199. }

200. break;

201. case TortueGraphique.BAS:

202. if(this.py < TortueGraphique.TAILLE - 1)

203. {

204. this.py++;

205. }

206. break;

207. default:

208. break;

209. }

211. if(this.etat == TortueGraphique.ABAISSE)

212. {

213. this.feuille[this.py][this.px] = true;

214. }

215. }

216. }

219. /**

220. * <p>Construit une représentation de la feuille de dessin.</p>

221. * @return Retourne une représentation de la feuille de dessin.

222. */

223. public String representerFeuille()

224. {

225. StringBuilder sortie = new StringBuilder();

227. // Construit la représentation de la feuille de dessin.

228. for(int i = 0; i < this.feuille.length; i++)

229. {

230. for(int j = 0; j < this.feuille[0].length; j++)

231. {

232. if(this.feuille[i][j])

233. {

234. sortie.append("* ");

235. }

236. else

237. {

238. sortie.append(". ");

239. }

240. }

241. sortie.append('\n');

242. }

244. return sortie.toString();

245. }

248. /**

249. * <p>Lance l'application.</p>

250. * @param args Les paramètres de la ligne de commande.

251. */

252. public static void main(String[] args)

253. {

254. new TortueGraphique();

255. }

256. }

IV - Crible d'Eratosthène

IV-1 - Énoncé

Le crible d'Eratosthène permet de trouver les nombres premiers. Un nombre premier est un entier naturel strictement supérieur à 1 qui n'admet que deux diviseurs distincts : 1 et lui-même. Son fonctionnement est le suivant :

- utilisez un tableau de booléens où les indices correspondent aux nombres. Une valeur à true indique que c'est un nombre premier, à false que non ;

- parcourez ce tableau en commençant à l'indice 2. Si l'indice courant est à true alors mettez à false tous les éléments à true multiples de l'indice.

Écrivez un programme qui affiche tous les nombres premiers entre 1 et 1000.

Classes de l'API utilisées :

- java.awt.BorderLayout

- java.awt.Container

- javax.swing.JFrame

- javax.swing.JScrollPane

- javax.swing.JTextArea

IV-2 - Aperçu

Aperçu du résultat.

IV-3 - Démonstration

Lancer avec Java Web Start

Note : javaws -viewer (accessible aussi dans le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

IV-4 - Solution

CribleEratosthene.java

1. /*

2. * Fichier: CribleEratosthene.java

3. * Crée le: 04 janvier 2007.

4. * Modifié: 7 juillet 2007.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre6;

27. import java.awt.BorderLayout;

28. import java.awt.Container;

30. import javax.swing.JFrame;

31. import javax.swing.JScrollPane;

32. import javax.swing.JTextArea;

36. /**

37. * <p>Trouve des nombres premiers avec le crible d'Eratosthène.</p>

38. * @author Sébastien ESTIENNE.

39. */

40. public class CribleEratosthene extends JFrame

41. {

42. /**

43. * <p>Serial version UID.</p>

44. */

45. private static final long serialVersionUID = 1L;

47. /** Taille du tableau. */

48. private static final int TAILLE = 1000;

51. /**

52. * <p>Construction de l'application.</p>

53. */

54. public CribleEratosthene()

55. {

56. // Appel du constructeur de la classe JFrame.

57. super("Crible d'Eratosthène");

59. // Conteneur.

60. Container conteneur = getContentPane();

62. // Ajoute les composants au conteneur.

63. JTextArea zoneSortie = new JTextArea();

64. zoneSortie.setEditable(false);

65. conteneur.add(new JScrollPane(zoneSortie), BorderLayout.CENTER);

67. // Initialisation du tableau d'indication de nombres premiers.

68. boolean[] tableau = new boolean[CribleEratosthene.TAILLE];

69. for(int i = 0; i < tableau.length; i++)

70. {

71. tableau[i] = true;

72. }

74. // Crible d'ératosthène.

75. // Parcours du tableau.

76. for(int i = 2; i < tableau.length; i++)

77. {

78. // Vérifie que l'élément est un nombre premier.

79. if(tableau[i])

80. {

81. // Parcours du reste du tableau.

82. for(int j = i + 1; j < tableau.length; j++)

83. {

84. // Teste si l'indice est un nombre premier.

85. if(tableau[j] && j % i == 0)

86. {

87. tableau[j] = false;

88. }

89. }

90. }

91. }

93. // Enregistrement du résultat.

94. StringBuilder sortie = new StringBuilder();

95. for(int i = 2; i < tableau.length; i++)

96. {

97. if(tableau[i])

98. {

99. sortie.append(i).append("\n");

100. }

101. }

103. // Met à jour la zone de sortie.

104. zoneSortie.setText(sortie.toString());

106. // Modifie les propriétés de la fenêtre.

107. setSize(250, 200);

108. setLocation(100, 100);

109. setVisible(true);

110. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

111. }

114. /**

115. * <p>Lance l'application.</p>

116. * @param args Les paramètres de la ligne de commande.

117. */

118. public static void main(String[] args)

119. {

120. new CribleEratosthene();

121. }

122. }

V - Tri Par Sélection

V-1 - Énoncé

Le tri par sélection recherche l'élément le plus petit du tableau et l'échange avec le premier élément. Ensuite, on recommence cette opération avec le sous tableau commençant par le deuxième élément. Le tableau est entièrement trié lorsque le sous tableau ne contient plus qu'un seul sous élément.
Écrivez un tel algorithme.

Note : ce tri est à titre d'exemple. La bibliothèque Java fournit une classe Arrays qui offre différentes fonctions dont une recherche binaire et un de tri performant basé sur le tri rapide.

Classes de l'API utilisées :

- java.awt.Container

- javax.swing.JFrame

- javax.swing.JScrollPane

- javax.swing.JTextArea

V-2 - Aperçu

Aperçu du résultat.

V-3 - Démonstration

Lancer avec Java Web Start

Note : javaws -viewer (accessible aussi dans le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

V-4 - Solution

TriParSelection.java

1. /*

2. * Fichier: TriParSelection.java

3. * Crée le: 04 janvier 2007.

4. * Modifié: 7 juillet 2007.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre6;

27. import java.awt.Container;

29. import javax.swing.JFrame;

30. import javax.swing.JScrollPane;

31. import javax.swing.JTextArea;

35. /**

36. * <p>Effectue un tri par sélection.</p>

37. * @author Sébastien ESTIENNE.

38. */

39. public class TriParSelection extends JFrame

40. {

41. /**

42. * <p>Serial version UID.</p>

43. */

44. private static final long serialVersionUID = 1L;

47. /**

48. * <p>Construction de l'application.</p>

49. */

50. public TriParSelection()

51. {

52. // Appel du constructeur de la classe JFrame.

53. super("Tri Par Sélection");

55. // Zone de texte de sortie.

56. JTextArea zoneSortie = new JTextArea();

57. zoneSortie.setEditable(false);

59. // Conteneur.

60. Container conteneur = getContentPane();

62. // Ajoute la zone de sortie au conteneur.

63. conteneur.add(new JScrollPane(zoneSortie));

65. // Tableau des valeurs à trier.

66. int[] tableau = {5, 56, 34, 43, 17, 25, 8, 65, 31, 52};

68. // Chaine de caractère de sortie.

69. StringBuilder sortie = new StringBuilder();

71. // Ajoute à la chaine de sortie les valeurs de départ du tableau.

72. sortie.append("Valeurs de départ du tableau:\n");

73. for(int i = 0; i < tableau.length; i++)

74. {

75. sortie.append("  ").append(tableau[i]);

76. }

78. // Trie le tableau.

79. triParSelection(tableau);

81. // Ajoute à la chaine de sortie les valeurs triées du tableau.

82. sortie.append("\n\n");

83. sortie.append("Valeurs triées du tableau:\n");

84. for(int i = 0; i < tableau.length; i++)

85. {

86. sortie.append("  ").append(tableau[i]);

87. }

89. // Met à jour la zone de sortie.

90. zoneSortie.setText(sortie.toString());

92. // Modifie les propriétés de la fenêtre.

93. setSize(300, 150);

94. setLocation(100, 100);

95. setVisible(true);

96. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

97. }

100. /**

101. * <p>Effectue un tri par sélection.</p>

102. * @param tableau Les valeurs à trier.

103. */

104. public void triParSelection(int[] tableau)

105. {

106. // Parcours du tableau.

107. for(int i = 0; i < tableau.length - 1; i++)

108. {

109. int min = i;

111. // Recherche de l'indice minimum.

112. for(int j = i + 1; j < tableau.length; j++)

113. {

114. if(tableau[j] < tableau[min])

115. {

116. min = j;

117. }

118. }

120. // Permutation.

121. if(i != min)

122. {

123. permuter(tableau, i, min);

124. }

125. }

126. }

129. /**

130. * <p>Permutte deux éléments d'un tableau.</p>

131. * @param tableau Le tableau concerné.

132. * @param i L'indice du premier élément.

133. * @param j L'indice du second élément.

134. */

135. public void permuter(int[] tableau, int i, int j)

136. {

137. // Variable temporaire pour la permutation.

138. int temp;

140. temp = tableau[i];

141. tableau[i] = tableau[j];

142. tableau[j] = temp;

143. }

146. /**

147. * <p>Lance l'application.</p>

148. * @param args Les paramètres de la ligne de commande.

149. */

150. public static void main(String[] args)

151. {

152. new TriParSelection();

153. }

154. }

VI - Recherche binaire

VI-1 - Énoncé

La recherche binaire fonctionne sur un tableau trié. L'algorithme compare à la clé recherchée la valeur de l'élément au milieu du tableau. Si les deux valeurs sont égales alors on renvoie l'indice sinon on continue la recherche avec la moitié du tableau correspondant au résultat de la comparaison des deux valeurs. La recherche continue jusqu'à ce que l'on trouve l'élément ou jusqu'à ce que le sous tableau ne contienne plus qu'un seul élément différent de la clé, indiquant que celle-ci n'est pas dans le tableau.
Écrivez un tel programme.

Classes de l'API utilisées :

- java.awt.Container

- javax.swing.JFrame

- javax.swing.JScrollPane

- javax.swing.JTextArea

VI-2 - Aperçu

Aperçu du résultat.

VI-3 - Démonstration

Lancer avec Java Web Start

Note : javaws -viewer (accessible aussi dans le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

VI-4 - Solution

RechercheBinaire.java

1. /*

2. * Fichier: RechercheBinaire.java

3. * Crée le: 04 janvier 2007.

4. * Modifié: 7 juillet 2007.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre6;

27. import java.awt.Container;

29. import javax.swing.JFrame;

30. import javax.swing.JScrollPane;

31. import javax.swing.JTextArea;

35. /**

36. * <p>Effectue une recherche binaire avec un tableau trié.</p>

37. * @author Sébastien ESTIENNE.

38. */

39. public class RechercheBinaire extends JFrame

40. {

41. /**

42. * <p>Serial version UID.</p>

43. */

44. private static final long serialVersionUID = 1L;

47. /**

48. * <p>Construction de l'application.</p>

49. */

50. public RechercheBinaire()

51. {

52. // Appel du constructeur de la classe JFrame.

53. super("Recherche Binaire");

55. // Zone de texte de sortie.

56. JTextArea zoneSortie = new JTextArea();

57. zoneSortie.setEditable(false);

59. // Conteneur.

60. Container conteneur = getContentPane();

62. // Ajoute la zone de sortie au conteneur.

63. conteneur.add(new JScrollPane(zoneSortie));

65. // Tableau des valeurs à trier.

66. int[] tableau = {5, 8, 17, 25, 31, 34, 43, 52, 56, 65};

68. // Chaine de caractère de sortie.

69. StringBuilder sortie = new StringBuilder();

71. // Ajoute à la chaine de sortie les valeurs du tableau.

72. sortie.append("Valeurs du tableau:\n");

73. for(int i = 0; i < tableau.length; i++)

74. {

75. sortie.append("  ").append(tableau[i]);

76. }

77. sortie.append("\n\n");

79. // Effectue une recherche binaire.

80. int valeur = 17;

81. int element = rechercheBinaire(tableau, valeur);

82. if(element != -1)

83. {

84. sortie.append("Valeur ").append(valeur).append(" trouvée à l'élément ").append(element)

85. .append("\n");

86. }

87. else

88. {

89. sortie.append("Valeur ").append(valeur).append(" introuvable!\n");

90. }

92. // Met à jour la zone de sortie.

93. zoneSortie.setText(sortie.toString());

95. // Modifie les propriétés de la fenêtre.

96. setSize(300, 150);

97. setLocation(100, 100);

98. setVisible(true);

99. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

100. }

103. /**

104. * <p>Effectue une recherche binaire.</p>

105. * @param tableau Le tableau de valeurs.

106. * @param cle L'élément à rechercher.

107. * @return L'indice de la clé ou -1 si elle n'a pas été trouvée.

108. */

109. public int rechercheBinaire(int[] tableau, int cle)

110. {

111. // Indice de l'élément du bas.

112. int bas = 0;

114. // Indice de l'élément du haut.

115. int haut = tableau.length - 1;

117. // Indice de l'élément du milieu.

118. int milieu;

120. // Parcours jusqu'à l'indice haut.

121. while(bas <= haut)

122. {

123. // Calcule l'élément du milieu.

124. milieu = (bas + haut) / 2;

126. // La clé a été trouvée.

127. if(cle == tableau[milieu])

128. {

129. return milieu;

130. }

132. // Modifie l'indice du haut du tableau.

133. if(cle < tableau[milieu])

134. {

135. haut = milieu - 1;

136. }

137. // Modifie l'indice du bas du tableau.

138. else

139. {

140. bas = milieu + 1;

141. }

142. }

144. // Clé introuvable.

145. return -1;

146. }

149. /**

150. * <p>Lance l'application.</p>

151. * @param args Les paramètres de la ligne de commande.

152. */

153. public static void main(String[] args)

154. {

155. new RechercheBinaire();

156. }

157. }

VII - Parcours de labyrinthe

VII-1 - Énoncé

L'algorithme le plus simple qui permet de trouver la sortie d'un labyrinthe (si elle existe), est de garder toujours sa main droite le long du mur en suivant les changements de direction avec cette même main. Évidemment ce n'est certainement pas le plus court… mais on trouve la sortie ainsi.
Écrivez une méthode récursive qui implémente cet algorithme. Utilisez aussi un JTextArea pour afficher une représentation du labyrinthe et ajoutez un bouton permettant de suivre étape par étape le parcours dans le labyrinthe.

# # # # # # # # # # # #
# . . . # . . . . . . #
. . # . # . # # # # . #
# # # . # . . . . # . #
# . . . . # # # . # . .
# # # # . # . # . # . #
# . . # . # . # . # . #
# # . # . # . # . # . #
# . . . . . . . . # . #
# # # # # # . # # # . #
# . . . . . . # . . . #
# # # # # # # # # # # #

Classes de l'API utilisées :

- java.awt.BorderLayout

- java.awt.Container

- java.awt.Font

- java.awt.event.ActionEvent

- java.awt.event.ActionListener

- javax.swing.JButton

- javax.swing.JFrame

- javax.swing.JTextArea

VII-2 - Aperçu

Aperçu du résultat.

VII-3 - Démonstration

Lancer avec Java Web Start

Note : javaws -viewer (accessible aussi dans le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

VII-4 - Solution

ParcoursLabyrinthe.java

1. /*

2. * Fichier: ParcoursLabyrinthe.java

3. * Crée le: 04 janvier 2007.

4. * Modifié: 7 juillet 2007.

5. * Auteurs: Sébastien ESTIENNE.

6. * SiteWeb: http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre6;

27. import java.awt.BorderLayout;

28. import java.awt.Container;

29. import java.awt.Font;

30. import java.awt.event.ActionEvent;

31. import java.awt.event.ActionListener;

33. import javax.swing.JButton;

34. import javax.swing.JFrame;

35. import javax.swing.JTextArea;

39. /**

40. * <p>Effectue une recherche binaire avec un tableau trié.</p>

41. * @author Sébastien ESTIENNE.

42. */

43. public class ParcoursLabyrinthe extends JFrame

44. {

45. /**

46. * <p>Serial version UID.</p>

47. */

48. private static final long serialVersionUID = 1L;

50. /** Le labyrinthe. */

51. private boolean[][] labyrinthe = {

52. {false, false, false, false, false, false, false, false, false, false, false, false},

53. {false, true, true, true, false, true, true, true, true, true, true, false},

54. {true, true, false, true, false, true, false, false, false, false, true, false},

55. {false, false, false, true, false, true, true, true, true, false, true, false},

56. {false, true, true, true, true, false, false, false, true, false, true, true},

57. {false, false, false, false, true, false, true, false, true, false, true, false},

58. {false, true, true, false, true, false, true, false, true, false, true, false},

59. {false, false, true, false, true, false, true, false, true, false, true, false},

60. {false, true, true, true, true, true, true, true, true, false, true, false},

61. {false, false, false, false, false, false, true, false, false, false, true, false},

62. {false, true, true, true, true, true, true, false, true, true, true, false},

63. {false, false, false, false, false, false, false, false, false, false, false, false}};

65. /** Position courante en x dans le labyrinthe. */

66. private int x = 0;

68. /** Position courante en y dans le labyrinthe. */

69. private int y = 0;

71. /** Position de départ en x dans le labyrinthe. */

72. private final int xd = 0;

74. /** Position de départ en y dans le labyrinthe. */

75. private final int yd = 2;

77. /** Direction : vers la droite. */

78. private static final int DROITE = 0;

80. /** Direction : vers le bas. */

81. private static final int BAS = 1;

83. /** Direction : vers la gauche. */

84. private static final int GAUCHE = 2;

86. /** Direction : vers le haut. */

87. private static final int HAUT = 3;

89. /** La direction courante. */

90. private int direction = ParcoursLabyrinthe.DROITE;

92. /** Zone de texte de sortie. */

93. private JTextArea zoneSortie;

95. /** Bouton de parcours du labyrinthe. */

96. private JButton boutonSuite;

99. /**

100. * <p>Construction de l'application.</p>

101. */

102. public ParcoursLabyrinthe()

103. {

104. // Appel du constructeur de la classe JFrame.

105. super("Parcours Labyrinthe");

107. // Initialisation.

108. this.x = 0;

109. this.y = 2;

110. this.direction = ParcoursLabyrinthe.DROITE;

112. // Initialisation de la zone de sortie.

113. this.zoneSortie = new JTextArea();

114. this.zoneSortie.setFont(new Font("Monospaced", Font.BOLD, 10));

115. this.zoneSortie.setEditable(false);

116. mettreAJourLabyrinthe();

118. // Initialisation du bouton.

119. this.boutonSuite = new JButton("Suite");

120. this.boutonSuite.addActionListener(new ActionListener()

121. {

122. /**

123. * Invoqué lorsqu'une action se produit.

124. * @param e

125. */

126. public void actionPerformed(ActionEvent e)

127. {

128. avancer();

129. mettreAJourLabyrinthe();

130. }

131. });

133. // Conteneur.

134. Container conteneur = getContentPane();

136. // Ajoute les composants au conteneur.

137. conteneur.add(this.zoneSortie, BorderLayout.CENTER);

138. conteneur.add(this.boutonSuite, BorderLayout.SOUTH);

140. // Modifie les propriétés de la fenêtre.

141. setSize(200, 240);

142. setLocation(100, 100);

143. setVisible(true);

144. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

145. }

148. /**

149. * <p>Algorithme permettant d'avancer dans le labyrinthe.</p>

150. */

151. public void avancer()

152. {

153. // Vérification de terminaison.

154. if(this.x == this.xd && this.y == this.yd || this.x > 0 && this.y > 0

155. && this.x < this.labyrinthe[0].length && this.y < this.labyrinthe.length)

156. {

157. switch(this.direction)

158. {

159. // Direction de déplacement : Droite.

160. case ParcoursLabyrinthe.DROITE:

161. // Pas de mur sur la droite : dans un angle.

162. if(this.y + 1 < this.labyrinthe.length && this.labyrinthe[this.y + 1][this.x])

163. {

164. this.direction = ParcoursLabyrinthe.BAS;

165. this.y++;

166. }

167. // Un mur selon la direction de déplacement.

168. else if(this.x + 1 < this.labyrinthe[0].length && !this.labyrinthe[this.y][this.x + 1])

169. {

170. // Changement de direction suivant le mur.

171. if(this.y - 1 >= 0 && this.labyrinthe[this.y - 1][this.x])

172. {

173. this.direction = ParcoursLabyrinthe.HAUT;

174. this.y--;

175. }

176. // Impasse : demi-tour.

177. else

178. {

179. this.direction = ParcoursLabyrinthe.GAUCHE;

180. this.x--;

181. }

182. }

183. // Case libre devant : déplacement selon la direction.

184. else if(this.x + 1 < this.labyrinthe[0].length)

185. {

186. this.x++;

187. }

188. break;

189. // Direction de déplacement : Bas.

190. case ParcoursLabyrinthe.BAS:

191. // Pas de mur sur la droite : dans un angle.

192. if(this.x - 1 >= 0 && this.labyrinthe[this.y][this.x - 1])

193. {

194. this.direction = ParcoursLabyrinthe.GAUCHE;

195. this.x--;

196. }

197. // Un mur selon la direction de déplacement.

198. else if(this.y + 1 < this.labyrinthe.length && !this.labyrinthe[this.y + 1][this.x])

199. {

200. // Changement de direction suivant le mur.

201. if(this.x + 1 < this.labyrinthe[0].length && this.labyrinthe[this.y][this.x + 1])

202. {

203. this.direction = ParcoursLabyrinthe.DROITE;

204. this.x++;

205. }

206. // Impasse : demi-tour.

207. else

208. {

209. this.direction = ParcoursLabyrinthe.HAUT;

210. this.y--;

211. }

212. }

213. // Case libre devant : déplacement selon la direction.

214. else if(this.y + 1 < this.labyrinthe.length)

215. {

216. this.y++;

217. }

218. break;

219. // Direction de déplacement : Gauche.

220. case ParcoursLabyrinthe.GAUCHE:

221. // Pas de mur sur la droite : dans un angle.

222. if(this.y - 1 >= 0 && this.labyrinthe[this.y - 1][this.x])

223. {

224. this.direction = ParcoursLabyrinthe.HAUT;

225. this.y--;

226. }

227. // Un mur selon la direction de déplacement.

228. else if(this.x - 1 >= 0 && !this.labyrinthe[this.y][this.x - 1])

229. {

230. // Changement de direction suivant le mur.

231. if(this.y + 1 < this.labyrinthe[0].length && this.labyrinthe[this.y + 1][this.x])

232. {

233. this.direction = ParcoursLabyrinthe.BAS;

234. this.y++;

235. }

236. // Impasse : demi-tour.

237. else

238. {

239. this.direction = ParcoursLabyrinthe.DROITE;

240. this.x++;

241. }

242. }

243. // Case libre devant : déplacement selon la direction.

244. else if(this.x - 1 >= 0)

245. {

246. this.x--;

247. }

248. break;

249. // Direction de déplacement : Haut.

250. case ParcoursLabyrinthe.HAUT:

251. // Pas de mur sur la droite : dans un angle.

252. if(this.x + 1 < this.labyrinthe.length && this.labyrinthe[this.y][this.x + 1])

253. {

254. this.direction = ParcoursLabyrinthe.DROITE;

255. this.x++;

256. }

257. // Un mur selon la direction de déplacement.

258. else if(this.y - 1 >= 0 && !this.labyrinthe[this.y - 1][this.x])

259. {

260. // Changement de direction suivant le mur.

261. if(this.x - 1 >= 0 && this.labyrinthe[this.y][this.x - 1])

262. {

263. this.direction = ParcoursLabyrinthe.GAUCHE;

264. this.x--;

265. }

266. // Impasse : demi-tour.

267. else

268. {

269. this.direction = ParcoursLabyrinthe.BAS;

270. this.y++;

271. }

272. }

273. // Case libre devant : déplacement selon la direction.

274. else if(this.y - 1 >= 0)

275. {

276. this.y--;

277. }

278. break;

279. default:

280. break;

281. }

282. }

283. }

286. /**

287. * <p>Met à jour le labyrinthe.</p>

288. */

289. public void mettreAJourLabyrinthe()

290. {

291. StringBuilder sortie = new StringBuilder();

293. // Parcours le labyrinthe.

294. for(int i = 0; i < this.labyrinthe.length; i++)

295. {

296. for(int j = 0; j < this.labyrinthe.length; j++)

297. {

298. // Position courante dans le labyrinthe.

299. if(i == this.y && j == this.x)

300. {

301. sortie.append("X ");

302. }

303. // Case libre.

304. else if(this.labyrinthe[i][j])

305. {

306. sortie.append(". ");

307. }

308. // Mur.

309. else

310. {

311. sortie.append("# ");

312. }

313. }

314. sortie.append("\n");

315. }

317. // Mise à jour.

318. this.zoneSortie.setText(sortie.toString());

319. }

322. /**

323. * <p>Lance l'application.</p>

324. * @param args Les paramètres de la ligne de commande.

325. */

326. public static void main(String[] args)

327. {

328. new ParcoursLabyrinthe();

329. }

330. }

VIII - Remerciements

Je tiens à remercier Ricky81, Hikage pour les conseils, remarques et relectures.
Je remercie aussi www.developpez.com me permettant de publier cet article et Nono40 pour ses outils.