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_06.py
+++ rubiks_etape_07.py
@@ -1,9 +1,10 @@
-"""Rubik's Cube — étape 06.
-Lancement : py rubiks_etape_06.py
+"""Rubik's Cube — étape 07.
+Lancement : py rubiks_etape_07.py
 Chaque fichier fonctionne seul. Lis aussi le carnet Word.
 """
 
 import pygame
+import random
 
 # Les lettres sont celles de la notation internationale du cube.
 # U haut, D bas, F devant, B derrière, L gauche, R droite.
@@ -94,11 +95,13 @@
 def main():
     pygame.init()
     fenetre = pygame.display.set_mode((1000, 700))
-    pygame.display.set_caption("Mon Rubik's Cube - Etape 6")
+    pygame.display.set_caption("Mon Rubik's Cube - Etape 7")
     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 !"
     # Un bouton contient un rectangle, un texte et une action.
     boutons = []
     for indice, face in enumerate("UDFBLR"):
@@ -106,6 +109,8 @@
                         face, (face, False)))
         boutons.append((pygame.Rect(810, 110 + indice * 47, 110, 37),
                         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"))
     en_marche = True
     while en_marche:
         action = None
@@ -122,12 +127,33 @@
                 if lettre in COULEURS:
                     inverse = bool(evenement.mod & pygame.KMOD_SHIFT)
                     action = (lettre, inverse)
+                if evenement.key == pygame.K_SPACE:
+                    action = "melanger"
+                if evenement.key == pygame.K_DELETE:
+                    action = "reset"
             if isinstance(action, tuple):
                 face, inverse = action
                 tourner(cube, face, inverse)
+                compteur += 1
+                message = face + ("'" if inverse else "")
+            elif action == "reset":
+                cube = creer_cube()
+                compteur = 0
+                message = "Cube remis à zéro."
+            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):
+                    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 !"
 
         fenetre.fill(FOND)
-        fenetre.blit(police.render('Je commande les six faces', True, (245, 245, 245)), (24, 20))
+        fenetre.blit(police.render("Mon Rubik's Cube", 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))
@@ -148,6 +174,10 @@
         fenetre.blit(petite.render("Apostrophe = tour inverse", True, (235, 235, 240)), (685, 82))
         aide = "Clavier : U D F B L R. Maintiens Maj pour le sens inverse."
         fenetre.blit(petite.render(aide, True, (235, 235, 240)), (24, 625))
+        etat = "Cube résolu !" if est_resolu(cube) else "Cube en cours"
+        fenetre.blit(police.render(etat, True, (255, 220, 90)), (685, 580))
+        fenetre.blit(petite.render(f"Tes coups : {compteur}", True, (245,245,245)), (685, 610))
+        fenetre.blit(petite.render(message, True, (240,240,240)), (24, 660))
         pygame.display.flip()
         horloge.tick(60)
     pygame.quit()
