Master CCI
POO, langage Java
Henri Garreta 

Les tours de Hanoï ©

        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 qu’un 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 d’un disque est suivi de l’affichage des tours et d’une petite pause permettant à l’utilisateur 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 :

A propos de la méthode hanoi. Cette méthode bien connue fait des appels récursifs d’elle même et des appels non récursifs d’une méthode auxiliaire déplacer qui, à chaque activation, modifie deux des trois piles. Il est évident que chaque appel de cette méthode doit s’accompagner (a) du redessin du plateau, puisque un disque à changé de pile, et (b) d’un temps d’immobilité, sinon l’utilisateur ne verra qu’une 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 l’appel initial de hanoi dans un thread séparé.

D’autre 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 l’exécution on constatera que les valeurs nulles ou très petites de délai provoquent des cascades de messages d’avertissement. C’est 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 n’a pas d’importance (mais c’est bien de comprendre ce qui se passe : mettre un délai de 0 c’est presque comme tout faire dans le même thread ; cela ne peut pas bien marcher).