Projet BAC spécialité ISN

Eloi Demolis - T°S1


Objectifs Réalisation Illustrations

Cadre de travail

Pour ce projet, j'utilise le langage python complété de 3 bibliothèques (comprises de base dans python) :

  1. Tkinter : pour l'interface graphique
  2. math : pour les calculs trigonométriques
  3. random : pour l'aléatoire du mélange
L'utilisation de la bibliothéque Tkinter pour l'interface graphique a un inconvénient majeur : elle ne permet pas de créer une interface 3D. Mon premier problème a donc été de créer une fonction qui puisse transposer un Rubik's cube "numérique" en une représentation graphique 2D (que Tkinter puisse prendre en charge). L'intégralité de ce projet tient dans un fichier python que vous pouvez télécharger ci-dessous :

Afficher un Rubik's cube en 3D

C'est la première étape, et non la moindre. Grâce aux matrices de rotation 3D, il est possible de faire varier l'orientation du Rubik's cube dans l'espace avec la souris. En ne retenant que 2 des 3 coordonnées calculées dans l'espace, on obtient la projection en 2 dimensions d'un Rubik's cube de 3 dimensions. Ce procédé de représentation paraît assez simple... Mais c'est sans compter la gestion de l'opacité des faces qui nécessite la mise en place d'une priorisation des plans visualisés. Il faut définir la place de chaque face sur l'axe de la profondeur. Ce point a été assez long à résoudre et a nécessité le développement de deux versions complétement différentes du code, la première n'étant pas satisfaisante.

Permettre à l'utilisateur de manipuler le Rubik's cube

Cet aspect du projet peut paraître trivial au premier abord, mais il m'a posé longtemps problème. Non pas en ce qui concerne le code, mais réellement d'un point de vue ergonomie. Il est difficile de mettre en place un système intuitif et pleinement satisfaisant qui permette à l'utilisateur une manipulation facile de toutes les faces et dans tous les sens. Finalement, le système retenu se réduit à 3 boutons :

  1. clic gauche maintenu glissé : oriente le Rubik's cube selon les 2 axes de visualisation
  2. clic droit : tourne la face selectionnée dans le sens horaire
  3. clic milieu : tourne la face selectionnée dans le sens anti-horaire
Cette partie contient également le fonctionnement des rotations des faces dans l'espace. Les fonctions qui gèrent ce point sont utilisées lors des rotations par l'utilisateur mais aussi par l'ordinateur lorsqu'il mélange ou résoud le Rubik's cube. Ce point a également était difficile à traiter notamment à cause de la non commutativité des rotations dans l'espace et de la gestion de l'actualisation de l'écran par Tkinter (ce qui a rendu plus difficile l'animation des rotations).

Créer une IA capable de résoudre le Rubik's cube

Il s'agit de la partie la plus longue du programme (70% des lignes de code). L'IA (Intelligence Artificielle) est capable de résoudre n'importe quelle situation d'un Rubik's cube 3*3*3 en utilisant les méthodes "couche par couche" et "Jessica Fridrish". Il faut environ 150 coups à l'IA pour résoudre le Rubik's cube. Pour information, il faut environ 50 coups pour les record-men du monde en la matière (temps de résolution de l'ordre de 5 secondes). La théorie du Rubik's cube semble indiquer qu'il est possible de résoudre n'importe quelle configuration en une vingtaine de rotations.