Projet encadré porté sur le problème des Tours de Hanoï.
Pour faire fonctionner ce programme, il vous faut :
- Python 3.7 ou supérieur (le support n'est pas assuré pour les versions précédentes)
- Le module Turtle
Il ne vous reste plus qu'à lancer le fichier main.py
-
Toutes les parties ont été implémentées (de A à F, voir le fichier pdf).
-
Des améliorations, notamment graphiques ont étés ajoutées : En plus d'avoir un code efficace et une exécution rapide, un soin de l'UI / UX à été apporté (bien que l'interraction avec le jeu ne se fasse que dans la console python). En effet l'ajout de couleurs et de différents formattages au texte affiché dans la console python permettent à l'utilisateur de plus rapidement comprendre le programme (si il y a une erreur, si l'information est pertinente...). De plus les disques dans l'interface Turtle sont colorés (ordre des couleurs aléatoire à chaque partie) et possèdent un numéro (qui ne sera pas obstrué par la couleur du disque) qui permet à l'utilisateur d'identifier bien plus rapidement les disques et leurs taille sur le plateau de l'interface Turtle.
-
Le code ne contient pas de bugs (affirmation après de nombreux tests), de la gestion d'erreur a également été mise en place pour éviter toute erreur par l'utilisateur
Bien que ce projet soit beaucoup commenté, certaines fonctions ou certains passages sont un peu durs à comprendre, revenons dessus :
-
Une fonction très utilisée dans le projet est la fonction
rectangequi dessine un rectangle dans l'interface turtle aux coordonnées, longueur, largeur, couleur du contour, couleur intérieure et numéro passé en paramètres. On place simplement le curseur de turtle aux coordonnées (avec des coordonnées à l'origine définies par la variableplateau_ord_org) puis on trace le rectange et si besoin on écrit aux bonnes coordonnées (dans le milieu du rectangle) un numéro qui correspond au numéro du disque (même si la fonction ne sert pas qu'à tracer les disques). -
La fonction
dessinePlateausert à dessiner la base du plateau ainsi que les tours. La longueur du plateau est calculée avec la formule80 + 3*(40 + (n-1)*30),nétant le nombre de disques sur le plateau, la longueur 80 en début de formule sert à espacer correctement les disques, auquelle on ajoute 3 fois la longueur du plus gros disque sur le plateau, calculé avec40 + (n-1)*30). Les tours ont une hauteur de N+1 disques, ce qui leur permet de dépasser d'une hauteur de disque supplémentaire (20 pixels) lorsque tous les disques sont empilés sur une d'entre elle. Aussi leur position a été calculée de sorte à ce qu'elles soient centrées, ceci explique le "37" dans la formule du calcule des coordonnées des tours. -
La fonction
dessineDisqueest utilisée pour dessiner un disque spécifié par son numérondsur le plateau. Elle utilise 2 boucles pour parcourir le plateau et trouver la place de ce disque dans la configuration du plateau. Les coordonnées (x, y) et les dimensions (longueur, largeur) du rectangle représentant le disque sont calculées en fonction de sa position sur la tour. Ces calculs intègrent des paramètres prédéfinis tels que l'épaisseur du plateau, le diamètre du plus petit disque, et l'écart entre les tours. -
effaceDisqueest une fonction très similaire àdessineDisque: elle calcule les coordonnées du disque de la même manière puis l'efface et ensuite dessine la tour qui avait étée écrasée par le disque lors de son traçage dans l'interface tutrle. -
La fonction
solutionDeplacementsrésout le problème des Tours de Hanoï de manière récursive. Elle prend en compte le nombre de disques ainsi que les indices de trois tours (départ, intermédiaire, arrivée). À chaque étape, elle déplace n-1 disques de la tour de départ à la tour intermédiaire, et déplace le disque de la tour de départ à la tour d'arrivée. Puis elle déplace les n-1 disques de la tour intermédiaire à la tour d'arrivée. Ces déplacements sont stockés dans une liste, qui est renvoyée à la fin.