The game of life, avec implémentation graphique

Contenu du snippet

Une petite implémentation du jeu de la vie,
J'ai vu que un code sur le site avait déjà été posté mais il avait été décrit comme incompréhensible, je poste donc ma version, que je trouve plus efficace.
Je pense avoir tout commenté ce qui en valait la peine, mais je peut me tromper : pointez moi les endroits fautifs !

Source / Exemple :


#Notez que j'ommet volontairement les caracteres accentues, afin d'eviter les erreurs.
import random
from Tkinter import *
import time
try :
    import psyco
    psyco.full()
except :pass

def seed (a,b,n): # fabrique une matrice de axb avec 1/n True en moyenne
    "x,y,n"
    sets=[]
    for y in range(0,b):
        t=[]
        for x in range(0,a):
            t.append(random.randint(0,n)==0) 
        sets.append(t)
    return sets

def evolve (s): # fait avancer d'une generation la matrice
    sets=[]
    a,b=len(s[0]),len(s) #je prefere verifier la taille "sur place" plutot que de la demander la taille de la matrice
    for y in range(0,b):
        t=[]
        for x in range(0,a):
            state=s[y][x] # on recupere l'etat de la cellule
            nb=s[(y-1)%b][x]+s[(y+1)%b][x]+s[(y-1)%b][(x+1)%a]+s[(y-1)%b][(x-1)%a]+s[y][(x-1)%a]+s[(y+1)%b][(x-1)%a]+s[(y+1)%b][(x+1)%a]+s[y][(x+1)%a]#On cherche l'etat des cellules avoisinantes, le modulo sert a donner une dimension toroidale a l'expace (les bouts se retouchent). NB : True+True=2
            if not state and nb==3:n=True #ces regles correspondent au jeu. nb : nombre de cellule avoisinante en vie; state : etat de la cellule
            elif not state : n=False
            elif state and nb<2 : n=False
            elif state and nb in (2,3) : n=True
            elif state and nb>3 : n=False
            else : #hum..
                print nb, state
                print "fail..."
                n=False
            t.append(n)
        sets.append(t)
    return sets
    
            

class represent : #representation graphique de la matrice!
    def __init__(self,a=128,b=128,n=1,m=1,t=500,istep=1):
        "x,y, 1/n cellule vivante par case au debut, largeur de la cellule, temporisation entre les affichages (s'y rajoutera le temps de calcul.), nombre d'evolution a faire par affichage"
        self.istep,self.a,self.b,self.n,self.m,self.t=istep,a,b,n,m,t#on kick tout ce beau monde en vaiable locales.
        self.root=Tk()
        self.can=Canvas(height=m*b,width=m*a,bg="grey15")#on fait la fenetre.
        self.can.pack()
        self.sets=seed(self.a,self.b,self.n)#on genere la matrice
        self.render()#on affiche le tout
        self.root.after(self.t,self.continu)#on lance la temporisation
        self.root.mainloop()
    def continu (self,trash=None):#"animation"
        #r=time.time()
        for a in range(0,self.istep):#on evolue istep fois
            self.sets=evolve(self.sets)
        #r2=time.time()
        self.render()#on affiche
        #r3=time.time()
        #print "took %ss to calculate, %ss to render"%(r2-r,r3-r2)
        self.root.after(self.t,self.continu)#on relance la temporisation
    def render (self):#calcul du rendu graphique
        self.can.delete(ALL)#on scrap tout
        x,y=0,0#on part de x=0,y=0 et on va ligne par ligne.
        for i in self.sets:
            for j in i :
                if j :#si la cellule est en vie :
                    self.can.create_rectangle(x,y,x+self.m,y+self.m,width=1,fill="green")#on fait un rectangle vert, notez que le width empeche le bon fonctionnement avec m<3, le mettre a 0 dans le cas echeant.
                x+=self.m
            y+=self.m
            x=0
                

represent(64,64,1,8,150,1)#juste de quoi faire la demo!

Conclusion :


des heures de fun à regarder des glider se crasher sur des bloc de 2x2...

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.