| README.md | Loading last commit info... | |
| kube.py | ||
| kube_prototype.py | ||
| main.py |
Kube
Une implémentation du célébre Rubik's Cube.
Structure générale
Le code implémente une représentation complète d'un Rubik's Cube de 3x3x3 en Python. L'implémentation offre une API intuitive pour manipuler le cube.
Composants principaux
Énumérations
Face: Les 6 faces du cube (UP, LEFT, FRONT, RIGHT, BACK, DOWN)Rotation: Types de rotations (CLOCKWISE, COUNTERCLOCKWISE, HALF_TURN)Color: Les 6 couleurs standard (YELLOW, RED, BLUE, GREEN, ORANGE, WHITE) + 1 couleur de test/debugAxis: Axes de rotation (X, Y, Z)
Classes
RubiksCube: Classe principale représentant le cube_Face(classe interne): Représente une face individuelle du cube
Fonctionnalités
-
Représentation de l'état du cube:
- Structure de données 3D (6 faces × 3 lignes × 3 colonnes)
- Chaque cellule contient une valeur entière représentant une couleur
-
Manipulation du cube:
- Rotation de faces individuelles (
rotate_face()) - Changement d'orientation du cube (
set_front()ourotate()) - Mélange aléatoire (
shuffle())
- Rotation de faces individuelles (
-
Interface utilisateur:
- Affichage en couleur dans le terminal
- Accès aux faces par position (UP, LEFT, etc.)
- Accès aux faces par couleur (YELLOW, RED, etc.)
- Vérification de l'état résolu (
is_solved())
Points d'amélioration
- Documentation limitée: Certaines méthodes manquent de docstrings explicites
- Optimisations possibles: Les opérations de copie pourraient être optimisées
- Tests: Absence de tests unitaires pour valider le comportement opérations
Complexité technique
La partie la plus complexe concerne les rotations de faces, qui nécessitent:
- La rotation de la face elle-même
- La mise à jour des bordures des faces adjacentes
Cette compléxité a été surmontée graçe, notamment, à la classe interne _Face et ses methodes, __getitem__ et __setitem__, permettant la rotation des bandes tout en conservant un code claire.
# Extrait pour la rotation horaire de la face FRONT
self.UP[2], self.RIGHT[:, 0], self.DOWN[0, ::-1], self.LEFT[::-1, 2] = \
self.LEFT[::-1, 2], self.UP[2], self.RIGHT[:, 0], self.DOWN[0, ::-1]
La première ligne identifie les quatre bordures qui doivent être échangées ainsi que leur orientation (avec ::-1 pour indiquer une bande en sens inverse).
Ces quatre bordures se voient assigner leures valeurs après avoir subi une rotation (UP->RIGHT->DOWN->LEFT->UP), le tout en une seule opération grâce au déballage de tuples (tuple unpacking) de Python.