from kandinsky import draw_string,set_pixel,fill_rect from random import randint from ion import * def menu(chaine,var,dec,mode,choix1,choix2): draw_string(chaine,10,v,'orange') draw_string("<"+" "*(5+dec)+">",10+len(chaine)*10,v,'blue') while not (keydown(KEY_EXE) or keydown(KEY_OK)): # if keydown(KEY_LEFT) or keydown(KEY_RIGHT): if mode=="nombre": var = (var-mini+keydown(KEY_RIGHT)-keydown(KEY_LEFT))%(maxi-mini+1)+mini draw_string(" "+str(var)+" px ",10+(len(chaine)+1)*10+5*dec-5*len(str(var)),v,'purple') else:#mode booléen draw_string(choix1*var+choix2*(1-var),10+(len(chaine)+2)*10,v,'purple') if keydown(KEY_LEFT) or keydown(KEY_RIGHT): var = not var while keydown(KEY_LEFT) or keydown(KEY_RIGHT):True while keydown(KEY_EXE) or keydown(KEY_OK):True return var def curseur(couleur): for pos in [0,1]: fill_rect(dg+d*col+pos*(c+(s==3))+(s==1)+(s==2)-(s==3),dh+d*lig-2*(s==0)+5*(s==1)+(s==2)-(s==3),1,c+(s==3),couleur) fill_rect(dg+d*col+(s==1)+(s==2)-(s==3),dh+d*lig+pos*(c-(s==1)+(s==3))-2*(s==0)+5*(s==1)+(s==2)-(s==3),1+c+(s==3),1,couleur) return None def carre(i,j,couleur): if rapide: for u in D: for v in D: set_pixel(dg+d*j+u,dh+d*i+v,couleur) else: fill_rect(dg+d*j,dh+d*i,c,c,couleur) v=20 S = ['o',chr(215),chr(176),' '] s = 0 draw_string("Choix du symbole : ",10,v,'orange') draw_string("< >",10+19*10,v,'blue') draw_string(S[s],10+21*10,v,'purple') while not (keydown(KEY_EXE) or keydown(KEY_OK)): if keydown(KEY_LEFT) or keydown(KEY_RIGHT): s = (s+keydown(KEY_RIGHT)-keydown(KEY_LEFT))%len(S) draw_string(S[s],10+21*10,v+4*(s==2),'purple') if s == 3: fill_rect(10+21*10+3,v+7,4,4,'purple') while keydown(KEY_LEFT) or keydown(KEY_RIGHT):True while keydown(KEY_EXE) or keydown(KEY_OK):True c=9-2*s mini=(s+2)%4+1 if s == 3: v+=20 rapide=True #ajouter menu de choix de vitesse rapide=menu("Execution : ",rapide,3,"booleen","rapide","fluide") v+=20 c=3 mini=1 maxi=15 c=menu("Taille des cellules : ",c,2,"nombre","","") mini=max(0,5-c) #espacement mini maxi=9 v+=20 e = 5 e=menu("Espacement : ",e,1,"nombre","","") v+=20 alea = True alea=menu("Initialisation : ",alea,6,"booleen","aléatoire","à choisir") v+=20 clr = True clr=menu("Vieillissement : ",clr,7,"booleen","en couleur","monochrome") Naissance = [3] Survie = [2,3] for etape in [Naissance,Survie]: v+=20 draw_string("Voisins pour "+"une naissance : "*(etape==Naissance)+"la survie : "*(etape==Survie),10,v,'orange') for n in range(9): draw_string(str(n),30+30*n,v+15,'purple'*(n in etape)+'grey'*(n not in etape)) pos = 3 while not (keydown(KEY_EXE) or keydown(KEY_OK)): if keydown(KEY_LEFT) or keydown(KEY_RIGHT): for k in [-1,1]: draw_string(" ",30+30*pos+10*k,v+15) pos = (pos+(keydown(KEY_RIGHT)-keydown(KEY_LEFT)))%9 draw_string("[",30+30*pos-10,v+15,'blue') draw_string("]",30+30*pos+10,v+15,'blue') #while keydown(KEY_LEFT) or keydown(KEY_RIGHT):True if keydown(KEY_UP) or keydown(KEY_DOWN): if pos in etape: etape.remove(pos) else: etape.append(pos) draw_string(str(pos),30+30*pos,v+15,'purple'*(pos in etape)+'grey'*(pos not in etape)) while keydown(KEY_UP) or keydown(KEY_DOWN):True while keydown(KEY_EXE) or keydown(KEY_OK):True etape.sort() etape.reverse() v+=20 v+=20 N = 10 draw_string("Nombre de cycles : ",10,v,'orange') draw_string("<"+5*" "+">",10+19*10,v,'blue') draw_string(str(N),10+21*10,v,'purple') while not (keydown(KEY_EXE) or keydown(KEY_OK)): if keydown(KEY_LEFT) or keydown(KEY_RIGHT) or keydown(KEY_UP) or keydown(KEY_DOWN): N = (N-1+(10*keydown(KEY_RIGHT)-10*keydown(KEY_LEFT)+keydown(KEY_UP)-keydown(KEY_DOWN)))%999+1 draw_string(" "+str(N)+" ",10+20*10+5*(3-len(str(N))),v,'purple') while keydown(KEY_EXE) or keydown(KEY_OK):True d = c+e D = range(d-e) a = 222//d #222//6=36 b = 320//d #320//6=53 A = range(a) B = range(b) dg = (320-b*d+e)//2-2*(s==1)-(s==2) dh = (222-a*d+e)//2-5*(s==1)-(s==2)+(s==0) Liste = [[0 for col in B] for lig in A] fill_rect(1,1,320,222,'white') if alea: for lig in A: for col in B: Liste[lig][col] = 2*randint(0,1) if Liste[lig][col] == 2: if s<3: draw_string(S[s],dg+d*col,(dh+d*lig)*(1-2*(s==0))+207*(s==0),'blue') else: carre(lig,col,'blue') else: col = b//2 lig = a//2 while not keydown(KEY_SHIFT): curseur('orange') if keydown(KEY_RIGHT) or keydown(KEY_LEFT) or keydown(KEY_UP) or keydown(KEY_DOWN): curseur('white') lig = (lig+keydown(KEY_DOWN)-keydown(KEY_UP))%a col = (col+keydown(KEY_RIGHT)-keydown(KEY_LEFT))%b if s==3 and e==0: for rangl in [-2,-1,0,1,2]: for rangc in [-2,-1,0,1,2]: if Liste[(lig+rangl)%a][(col+rangc)%b]>0: carre(lig+rangl,col+rangc,'blue') if keydown(KEY_EXE): if s == 0: Liste[a-1-lig][col] = 2-Liste[a-1-lig][col] couleur = 'white'*(Liste[a-1-lig][col] == 0)+'blue'*(Liste[a-1-lig][col] > 0) else: Liste[lig][col] = 2-Liste[lig][col] couleur = 'white'*(Liste[lig][col] == 0)+'blue'*(Liste[lig][col] > 0) if s<3: draw_string(S[s],dg+d*col,dh+d*lig-7*(s==0),couleur) if s == 0 and e<5 and lig>0: for rang in range(a-lig,a): if Liste[rang][col]==0:break draw_string(S[s],dg+d*col,dh+d*(a-rang-1)-7*(s==0),'blue') if s == 1 and e<5: for rang in range(lig+1,a): if Liste[rang][col]==0:break draw_string(S[s],dg+d*col,dh+d*rang,'blue') if s == 2: if e<3: for rangc in range(col,a): for rangl in range(lig,a): if Liste[rangl][rangc]>0: draw_string(S[s],dg+d*rangc,dh+d*rangl,'blue') else: for rang in range(lig+1,a): if Liste[rang][col]>0: draw_string(S[s],dg+d*col,dh+d*rang,'blue') else: carre(lig,col,couleur) while keydown(KEY_EXE):True curseur('white') for gen in range(N): for i in A: for j in B: Voisins = 0 for k in [-1,0,1]: for l in [-1,0,1]: if [k,l] != [0,0] and Liste[(i+k)%a][(j+l)%b]**2 > 3: Voisins += 1 if (Liste[i][j]==0 and Voisins in Naissance) or ( Liste[i][j] > 0 and Voisins in Survie ): Liste[i][j] += 1 couleur = (clr*min(25*Liste[i][j]-25,255),0,max(0,255+clr*(25-25*Liste[i][j]))) else: Liste[i][j] *= -1 couleur = 'white' if Liste[i][j] != 0: if s<3: draw_string(S[s],dg+d*j,(dh+d*i)*(1-2*(s==0))+207*(s==0),couleur) else: carre(i,j,couleur) for i in A: for j in B: Liste[i][j] = 2*((max(0,Liste[i][j])+1)//2)