Quelques explications sur le programme
Au démarrage la calculatrice mélange le cube puis voici les touches à utiliser :
from kandinsky import * from time import sleep from random import choice from ion import * 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)) TOUCHES = (32,31,39,45,42,36,38,37,50,49,40,46,0,1,2,3) AIDE = ("1",20,20),("4",55,12),("8 9",140,10),("-",250,95),("/",280,105),\ (".",105,185),("^",135,205),("6",105,132),("5",135,143),("x",185,140),("+",215,130) COUL="RBWOVJ" RVB={"W":(235,235,235), "R":(180,30,40), "B":(44,100,200), "V":(40,175,40),"O":(240,100,0),"J":(240,210,0)} F, H, R = ((1,0,0),(0,0,-1),(-1,0,0)),((0,-1,0),(0,0,-1),(0,1,0)),((1,0,0),(0,-1,0),(-1,0,0)) FACES = ((0,0,0),H),((0,0,-1.1),H),((0,-1.1,0),H),((0,-1.1,-1.1),H), \ ((0,0,-2.15),R),((1.05,0,-2.15),R),((0,-1.1,-2.15),R),((1.05,-1.1,-2.15),R),\ ((0,0.1,0),F),((1.1,0.1,0),F),((0,0.1,-1.1),F),((1.1,0.1,-1.1),F), \ ((2.4,1,-2),H),((2.4,1,-3.1),H),((2.4,-.1,-2),H),((2.4,-.1,-3.1),H), \ ((-2.5,1,0),R),((-1.45,1,0),R),((-2.5,-.1,0),R),((-1.45,-.1,0),R), \ ((0,-4,0),F),((1.1,-4,0),F),((0,-4,-1.1),F),((1.1,-4,-1.1),F) def key(t): while True: for (i, k) in enumerate(t): if keydown(k): return i def inv(l): return [tuple(reversed(t)) for t in reversed(l)] def permu(mvt, pos): suiv = list(pos) for t in mvt: u = (t[-1],)+t for i,v in enumerate(t): suiv[v] = pos[u[i]] return suiv def fin(pos): c, nb = pos[0], 1 for v in pos: if v != c: c = v nb += 1 return nb != 6 def remplir(coul, *u): (ax,ay),(bx,by),(cx,cy),(dx,dy)=u[0] for col in range(min(ax,bx,cx,dx), max(ax,bx,cx,dx)-1,2): for lig in range(min(ay,by,cy,dy), max(ay,by,cy,dy)-1,2): xa,xb,xc,xd = ax-col,bx-col,cx-col,dx-col ya,yb,yc,yd = ay-lig,by-lig,cy-lig,dy-lig d1,d2,d3,d4 = xa*yb-ya*xb,xb*yc-yb*xc,xc*yd-yc*xd,xd*ya-yd*xa u,v,w,t = d1>=0,d2>=0,d3>=0,d4>=0 if u == v == w == t: fill_rect(col,222 - lig,2,2,coul) def face(n,coul): (x,y,z),dd = FACES[n] coord = (pos2D(x,y,z),) for d in dd: x,y,z = x+d[0],y+d[1],z+d[2] coord += (pos2D(x, y, z),) remplir(coul, coord) def pos2D(x, y, z): t = x+z+1*3*y w = 1200/(110+x+z) return (int(95+(x-z)*3*w), int(170+t*w)) def init(): cube = "" for c in COUL: cube += c * 4 for (t,x,y) in AIDE: draw_string(t,x,y,(255,)*3,(0,)*3) return list(cube) def aff(suiv,pos,force=0): for n,c in enumerate(suiv): if pos[n] != c or force: face(n,RVB[c]) def melange(): pos = init() for _ in range(20): pos = permu(choice(MVT), pos) aff(pos,pos,1) return pos def choix(k, pos): if k < 12: m = MVT[k//2] if k % 2: m = inv(m) return permu(m, pos) else: for v in ((0,4,4,4),(1,2,2,2),(1,1,1,2),(0,0,0,4))[k-12]: pos = permu(MVT[v], pos) return pos def arret(): while True: draw_string("BRAVO !",20,150,RVB['W'],RVB[choice(list(RVB)[1:])]) sleep(.2) if keydown(4): return while True: fill_rect(0,0,320,222,(0,)*3) pos, jouer = melange(), True while jouer: suiv = choix(key(TOUCHES), pos) aff(suiv,pos) pos = list(suiv) sleep(.2) jouer = fin(pos) arret()