The game of life, avec implémentation graphique

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 539 fois - Téléchargée 18 fois

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

Ajouter un commentaire

Commentaires

Messages postés
336
Date d'inscription
samedi 26 novembre 2005
Statut
Membre
Dernière intervention
8 novembre 2011
1
J'avais oublié que xrange existait, et c'est vrai, il y aurait une légère accélération, mais négligeable.

Pour avoir uniquement une liste au lieu de ma pseudo "matrice", c'est se compliquer la vie pour rien, il est vrai que j'ai plus d'instances de listes, mais elles sont beaucoup plus petites. Cela me permet d'implanter beaucoup plus facilement un modèle toroïdale. (j'ai juste à kicker un modulo.)

Ce qui est lent dans le code, c'est l'affichage, pas l'évolution, j'ai besoin d'optimisation dans mon UI. (évolution environ .001s affichage environ .5s)

http://en.wikipedia.org/wiki/Conway's_Game_of_Life#Algorithms
Messages postés
9
Date d'inscription
samedi 26 décembre 2009
Statut
Membre
Dernière intervention
29 mars 2011
9
Quelques petites remarques :
pour seed() tu pourrait peut être utiliser une compréhension de liste et réduire tout en une ligne (faut voir pour les perfs).
Utilise plutôt xrange au lieu de range car range ça génère vraiment une liste.
Sinon l'utilisation de classes comme ça, ça ne me plait pas trop (avis subjectif).
Ca a l'air intéressant ces automates, il faudra que je les étudies...

Je suis en train de faire un convertisseur de langage c simplifié vers c. (une sorte de mélange de syntaxe de python avec c) je vais sûrement le publier ce week end tu me donneras ton avis.

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.