Update/compression of https://my.numworks.com/python/schraf/j2048v2
from kandinsky import fill_rect as F,draw_string as D;from random import*;from time import*;from ion import keydown as K;v=[0]*16;chiffres=[31599,18724,29671,31207,18925,31183,31695,18727,31727,31215];sco=0 def aff(n,x,y): if n>0: for k,c in enumerate(str(n)): for i in range(16): if chiffres[int(c)]>>i&1==1:F(x+12*k+(i%3)*3,y+(i//3)*3,3,3,(110,110,90)) def ajout(): vides=[i for i,x in enumerate(v)if x==0] if len(vides):v[choice(vides)]=choice([2,2,2,4]) def gauche(r):return([x for x in r if x]+[0]*4)[:4] def simp(r): global sco;r=gauche(r);l=[r] for i in(1,2,3): if r[i]==r[i-1]:l.append(i);r[i-1]*=2;r[i]=0;sco+=r[i-1] return gauche(r),l def calcul(ligne,pas): v2,m=[],[] for i in v:v2.append(i) for i in range(4): pos,l=simp([v[ligne[k]+pas*i]for k in range(4)]) for k in range(4):v[ligne[k]+pas*i]=pos[k] m.append(l) if v!=v2: # anim(m); ajout();return 0 return 1 def plateau(): global sco;F(3,6,208,208,(190,170,160)) for i in range(16):g=max(0,int(-v[i]/2+255));F(5+50*(i%4),8+50*(i//4),47,47,(g,)*3);aff(v[i],7+50*(i%4)+24-6*len(str(v[i])),25+50*(i//4)) D(("0000"+str(sco))[-5:],250,10);D(("0000"+str(best))[-5:],250,125) def anim(l): a=[] for i in l: r=i[0] for j in i[1:]:0 def go(r=0): global sco,best,nbest,v if r:sco=0;v=[0]*16 ajout();plateau() while 1: while(K(0)|K(1)|K(2)|K(3))^1:1 for i in range(4): if K(i):calcul([[0,1,2,3],[0,4,8,12],[12,8,4,0],[3,2,1,0]][i],[4,1][i%3>0]) while K(0)|K(1)|K(2)|K(3):1 if sco>best:best,nbest=sco,1 plateau();vs,move,scos=[],[0,0,0,0],sco for i in v:vs.append(i) for i in range(4):move[i]=calcul([[0,1,2,3],[0,4,8,12],[12,8,4,0],[3,2,1,0]][i],[4,1][i%3>0]) if sum(move)==4:break v,sco=vs,scos try:from best2048 import* except:best=0 q,nbest=0,0 try: while 1: go(q);D("GAME OVER",220,60);D("Press [OK]",218,90) while K(4)^1:1 D(" "*9,220,60);D(" "*10,218,90);q+=1 except KeyboardInterrupt:print(("New Best!\n"if nbest else"")+"best=%s"%best)