|
Le signe © renvoie à la correction
Sérieusement, vous ne pensiez pas échapper à la version graphique des tours de Hanoï, non ? Eh bien, voilà. Un petit dessin vaut mieux quun long discours :
On saisit le nombre de disques souhaité dans le champ de texte en haut de la fenêtre. La frappe de la touche Entrée dans ce champ produit le dessin du nombre de disques « enfilés » dans le pieu le plus à gauche.
La pression du bouton, initialement étiqueté « Go », déclenche les opérations. Chaque mouvement dun disque est suivi de laffichage des tours et dune petite pause permettant à lutilisateur de voir le nouvel état.
Un curseur en bas de lécran, en agissant sur la durée de la pause, règle la vitesse des manipulations.
Indications. Il vous est suggéré décrire quatre classes :
largeur
du disque. Les autres caractéristiques
des disques (épaisseur, couleur, etc.) peuvent être définies
par des variables de classe, partagées par tous les disques.Tour
. Une tour est une pile de disques (on sen
serait douté !) Donc, elle a une unique variable dinstance,
de type Stack
, qui ne contiendra jamais que des objets
Disque
.void seDessiner(int xCentral,
int yBas, int yHaut, Graphics g)
provoque laffichage de la
tour à la position indiquée (xCentral
est,
par exemple, labscisse du milieu du pieu).JPanel
,
ce qui permettra de la « poser » sur un cadre ou un
autre composant. Bien entendu, un Plateau
possède
trois variable dinstance de type Tour
.public void paint(Graphics
g)
de lobjet plateau qui effectue le dessin visible à
lécran (cette méthode appelle les méthodes seDessiner
de chaque tour, lesquelles appellent les méthodes seDessiner
de chaque disque).Cadre
. Le cadre est la partie la plus extérieure
de linterface ; il porte la gadgetterie, à savoir :
le texte "Disques"
(un JLabel
),
un champ de saisie (JTextField
), un bouton (JButton
),
un jeu des tours de Hanoi (Plateau
) un autre texte "Vitesse"
et un curseur (JSlider
). JPanel
) avec des gestionnaires de disposition
ad hoc maintiennent bien placés les trois composants du haut
et les deux du bas.A propos de la méthode hanoi. Cette méthode bien connue fait des appels récursifs delle même et des appels non récursifs dune méthode auxiliaire déplacer qui, à chaque activation, modifie deux des trois piles. Il est évident que chaque appel de cette méthode doit saccompagner (a) du redessin du plateau, puisque un disque à changé de pile, et (b) dun temps dimmobilité, sinon lutilisateur ne verra quune image brouillée trop vite changeante.
Il faut donc que déplacer exécute sleep(delai) afin de ralentir de déroulement de hanoi. En même temps, ou veut que pendant que déplacer dort, un autre processus puisse se charger de redéssiner le plateau. Autrement dit, il faut faire lappel initial de hanoi dans un thread séparé.
Dautre part, pour faire que le curseur règle la vitesse de déroulement de hanoi il suffit de le faire agir sur la valeur du délai mentionné ci-dessus.
N.B. A lexécution on constatera que les valeurs nulles ou très petites de délai provoquent des cascades de messages davertissement. Cest que hanoi met dans la file des événements des messages paint et reprend la main avant que Java ait lancé le redessin. Quand la file est saturée ces messages se perdent et Java rouspète. Cela na pas dimportance (mais cest bien de comprendre ce qui se passe : mettre un délai de 0 cest presque comme tout faire dans le même thread ; cela ne peut pas bien marcher).