Rubik’s Cube 2x2x2

Voici quelques explications sur le script Python proposé pour la NUMWORKS

Numérotation des vignettes :

Ce qui permet de définir les différents mouvements possibles :

MVT = ((8,9,11,10),(4,0,17,13),(5,1,16,12)),((4,5,7,6),(3,10,13,23),(1,11,15,22)), \
      ((17,16,18,19),(9,0,20,14),(8,2,21,12)),((0,1,3,2),(8,4,22,18),(10,6,20,16)), \
      ((20,22,23,21),(2,6,15,19),(3,7,14,18)),((13,12,14,15),(7,11,17,21),(5,9,19,23))

Par exemple tourner la face du haut (U = Up) revient à mettre la vignette 8 en 9, la vignette 9 en 11, la vignette 11 en 10 et la vignette 10 en 8, ce qui est est noté (8,9,11,10). Mais cela bougera également les vignettes (4,0,17,13) et (5,1,16,12). Le principe est le même pour les mouvements R (Right), L (Left), D (Down) et P (Arrière).

Remplissage des faces :

H = ((1,0,0),(0,0,-1),(-1,0,0))
FACES = ((0,0,0),H),((0,0,-1.1),H),((0,-1.1,0),H),((0,-1.1,-1.1),H)
Etapes pour dessiner la vignette n°8

Exemple avec la vignette n°8 : On part du point de coordonnées (0,0,0) puis on ajoute successivement les vecteurs qu’il y a dans H, on obtient (1,0,0) puis (1,0,-1) et (0,0,-1). Nous avons les 4 coins de la vignette.

Les fonctions face, pos2D et remplir permettent alors de remplir cette surface avec la couleur voulue (pos2D transforme les coordonnées 3D en coordonnées à l’écran)

Le ,2 que l’on voit sur les 2 lignes ci-dessous permet de remplir plus rapidement la zone. Essayez avec ,3 et ,1 pour voir la différence.

for col in range( ... ,2):
 for lig in range( ... ,2):

La fonction permu transforme la position du cube (liste de 24 nombres) en une nouvelle liste suivant le choix du mouvement. La nouvelle position est mise dans la variable suiv, ce qui permet lors de la mise à jour de l’affichage de ne remplir que les vignettes qui ont changé de couleur :

def aff(suiv,pos,force=0):
 for n, c in enumerate(suiv):
  if pos[n] != c: face(n,RVB[c])  # Changement de couleur ?

Rotation du cube entier :

Pour faire tourner le cube avec les 4 flèches, on applique plusieurs mouvements, par exemple avec la flèche du haut on applique les 4 mouvements 1,2,2,2. Répéter 3 fois le mouvement n°2 revient à appliquer 2 à l’envers (ce que l’on note souvent avec , par exemple R’)

Cube terminé ?

L’idée est de parcourir les vignettes n°0, 1… 23 et de compter combien de fois on a changé de couleurs. Si ce nombre correspond à 6, le cube est terminé :

def fin(pos):
 c, nb = pos[0], 1
 for v in pos:
  if v != c: 
    c = v
    nb += 1
 return nb != 6

Programme principal :

while True:
  fill_rect(0,0,320,222,(0,)*3)       # Fond noir
  pos, jouer = melange(), True        # mélange du cube
  while jouer:
    suiv = choix(key(TOUCHES), pos)   # Future position du cube
    aff(suiv,pos)                     # Affichage de la position
    pos = list(suiv)                  # C'est la nouvelle position
    sleep(.2)
    jouer = fin(pos)                  # Le cube est-il fini ?