POUR LE BINÔME ADULTE
Lignes avec - : retirées. Lignes avec + : ajoutées.
Les autres donnent le contexte. Ce fichier ne se lance pas.

--- rubiks_etape_07.py
+++ rubiks_etape_08.py
@@ -1,5 +1,5 @@
-"""Rubik's Cube — étape 07.
-Lancement : py rubiks_etape_07.py
+"""Rubik's Cube — étape 08.
+Lancement : py rubiks_etape_08.py
 Chaque fichier fonctionne seul. Lis aussi le carnet Word.
 """
 
@@ -92,16 +92,23 @@
     return 24 + colonne * pas, 85 + ligne * pas
 
 
+# À TOI : invente un titre et choisis ton mélange.
+TITRE = "Mon laboratoire de cubes"
+LONGUEUR_MELANGE = 20
+AFFICHER_LETTRES = True
+
+
 def main():
     pygame.init()
     fenetre = pygame.display.set_mode((1000, 700))
-    pygame.display.set_caption("Mon Rubik's Cube - Etape 7")
+    pygame.display.set_caption("Mon Rubik's Cube - Etape 8")
     horloge = pygame.time.Clock()
     police = pygame.font.Font(None, 25)
     petite = pygame.font.Font(None, 21)
     cube = creer_cube()
     compteur = 0
     message = "Prêt à jouer !"
+    historique = []
     # Un bouton contient un rectangle, un texte et une action.
     boutons = []
     for indice, face in enumerate("UDFBLR"):
@@ -111,6 +118,7 @@
                         face + "'", (face, True)))
     boutons.append((pygame.Rect(685, 420, 235, 38), "Mélanger", "melanger"))
     boutons.append((pygame.Rect(685, 467, 235, 38), "Remettre à zéro", "reset"))
+    boutons.append((pygame.Rect(685, 514, 235, 38), "Annuler un coup", "annuler"))
     en_marche = True
     while en_marche:
         action = None
@@ -131,29 +139,42 @@
                     action = "melanger"
                 if evenement.key == pygame.K_DELETE:
                     action = "reset"
+                if evenement.key == pygame.K_BACKSPACE:
+                    action = "annuler"
             if isinstance(action, tuple):
                 face, inverse = action
                 tourner(cube, face, inverse)
                 compteur += 1
                 message = face + ("'" if inverse else "")
+                historique.append(action)
             elif action == "reset":
                 cube = creer_cube()
                 compteur = 0
                 message = "Cube remis à zéro."
+                historique.clear()
             elif action == "melanger":
                 # On part du cube résolu et on lui applique de vrais mouvements.
                 cube = creer_cube()
                 precedente = None
-                for coup in range(20):
+                for coup in range(LONGUEUR_MELANGE):
                     choix = [face for face in COULEURS if face != precedente]
                     face = random.choice(choix)
                     tourner(cube, face, random.choice([False, True]))
                     precedente = face
                 compteur = 0
                 message = "Mélange prêt. À toi de jouer !"
+                historique.clear()
+            elif action == "annuler":
+                if historique:
+                    face, inverse = historique.pop()
+                    tourner(cube, face, not inverse)
+                    compteur -= 1
+                    message = "Dernier coup annulé."
+                else:
+                    message = "Aucun coup à annuler."
 
         fenetre.fill(FOND)
-        fenetre.blit(police.render("Mon Rubik's Cube", True, (245, 245, 245)), (24, 20))
+        fenetre.blit(police.render(TITRE, True, (245, 245, 245)), (24, 20))
         for face in POSITIONS:
             x, y = origine(face)
             fenetre.blit(petite.render(face, True, (240, 240, 240)), (x, y - 20))
@@ -164,6 +185,9 @@
                                             y + ligne * TAILLE_CASE,
                                             TAILLE_CASE - ECART, TAILLE_CASE - ECART)
                     pygame.draw.rect(fenetre, couleur, rectangle)
+                    if AFFICHER_LETTRES:
+                        etiquette = petite.render(cube[face][ligne][colonne], True, (15, 20, 30))
+                        fenetre.blit(etiquette, etiquette.get_rect(center=rectangle.center))
         legende = "U haut   D bas   F devant   B derrière   L gauche   R droite"
         fenetre.blit(petite.render(legende, True, (230, 230, 235)), (24, 590))
         for rectangle, texte, commande in boutons:
