rubika.py

Created by schraf

Created on January 18, 2021

1.48 KB

Explications en vidéo

Pour lancer le jeu, faire go() tout seul ou go avec un paramètre pour augmenter ou diminuer la difficulté, par exemple go(2) pour avoir un jeu dont la solution est possible en 2 coups.

Le jeu d’origine pour la HP 41


from ion import *
from random import choice
from kandinsky import fill_rect,draw_string
from time import sleep

BTS = [42,43,44,36,37,38,30,31,32,5,48,45]
GAGNE = list(range(16))
ROT='89DC9AEDABFE459856A967BA015412652376'
COUL = [(250,20,0),(255,255,0),(20,140,225),(20,190,90)]
POS='0011001122332233'

def aff(j):
  for i in range(16):
    c = COUL[int(POS[j[i]])]
    x, y = 60 + 45 * (i % 4), 10 + 45 * (i // 4)
    fill_rect(x, y, 43, 43, c)
    draw_string(str(j[i]+1), x + 15, y + 15, (0,0,0), c)
  for i in range(9):
    x, y = 100 + 45 * (i % 3), 135 - 45 * (i // 3)
    draw_string(str(i+1), x , y, (0,0,0), (255,255,255))
  for i in range(4):
    x, y = 270 + 10 * (i % 2), 90 + 10 * (i // 2)
    fill_rect(x, y, 8, 8, COUL[i])   
  
def touche():
 while True:
  for i in BTS:
   if keydown(i): 
     sleep(.2)
     return BTS.index(i)

def melange(j,d):
  l, s = list(j), ""
  for j in range(d):
    t = choice(range(9))
    s = str(t+1) + s
    for k in range(3): l = joue(l,t)
  return [l,s]

def joue(j,t):
  l = list(j)
  for i in range(4):
    a = int("0x"+ROT[4 * t + (i + 1) % 4])
    d = int("0x"+ROT[4 * t + i])
    l[a] = j[d]
  return l
  
def fin():
 draw_string("GAGNE",125,90,(255,255,255),(0,0,0))  

def go(d=3):
  [jeu, sol] = melange(GAGNE,d)
  depart = list(jeu)
  while True:
    aff(jeu)
    if jeu == GAGNE: break
    t = touche()
    if t == 9: return
    if t == 10: jeu = depart
    elif t == 11: draw_string(sol, 10, 200)  
    else: jeu = joue(jeu,t)
  fin()  

go()