begin process at 2012 05 24 05:25:57
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Jeux

 > THE GAME OF LIFE, AVEC IMPLÉMENTATION GRAPHIQUE

THE GAME OF LIFE, AVEC IMPLÉMENTATION GRAPHIQUE


 Information sur la source

Note :
Aucune note
Catégorie :Jeux Classé sous :jeu, vie, game, life, matrice Niveau :Initié Date de création :28/03/2011 Vu :2 253

Auteur : xeolin

Ecrire un message privé
Site perso
Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

 Description

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

  • #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!
#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...


 Sources du même auteur

CALCULATRICE, INTRODUCTION AU LAMBDA
Source avec une capture GENERATEUR DE CLEF RSA, TRÈS EFFICACE !
Source avec Zip Source avec une capture SERVEUR WEB EN PYTHON.
Source avec Zip SERVEUR HTTP PYTHON
Source avec Zip Source avec une capture SPAMMEUR, PYTHON

 Sources de la même categorie

Source avec Zip Source avec une capture ISOLA - MON PREMIER PROGRAMME PYTHON 3 par Debiars
Source avec Zip Source avec une capture UN PUZZLE UN PEU TAQUIN. par lespinx
Source avec Zip QUESTIONNAIRE par darkanghel91
Source avec Zip Source avec une capture JEU DU PLUS OU MOINS par Iphonemax
TAQUIN 4*4 par fredericfabry

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture ISOLA - MON PREMIER PROGRAMME PYTHON 3 par Debiars
Source avec Zip Source avec une capture JEU DE LA VIE SIMPLE ET GRAPHIQUE (TKINTER) EN PYTHON 3 par sodawil
Source avec Zip Source avec une capture UN PUZZLE UN PEU TAQUIN. par lespinx
Source avec Zip JEU DE LA VIE AVEC TKINTER par dia100daly
Source avec Zip JEU DE LA VIE par dia100daly

Commentaires et avis

Commentaire de Clempython le 29/03/2011 22:11:00

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.

Commentaire de xeolin le 29/03/2011 22:43:50

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

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

jeu de la vie [ par dia100daly ] je veux poster un code. Mais j'aimerai savoir si c'etait vraiment la peine car c'est la première fois. Pour plus de détail voir sur Wikipédia ( jeu de codage Windows jeu de caractères [ par creaduff ] Bonjour,Avant tout, précisons que je ne suis pas un aigle en Python ! Voici mon problème:J'ai écrit une petit programme permettant d'accéder à ma boit matrice symétrique [ par delaval ] bonjour, je suis actuellement en train d'écrire une fonction symétrique qui renvoie True or False selon la matrice que je rentre. Voici mon code:class décomposition LDU d'une matrice [ par map33 ] Bonjour,nous sommes débutantes en python et un projet de fin de licence nous est demandé sur ce programme.Nous devons trouver le code de la décomposit Réalisation d'un plus ou moins sur Tkinter [ par kuritsu ] Bonsoir tout le monde, et je vous souhaite la bonne année à tous par la même occasion. Je viens de me mettre à la programmation sous Python, et j'avo Charger une matrice d'un fichier [ par Alambiqux ] Bonjour, J'ai des fichiers colonnes de floats et je souhaiterais les charger dans une liste. Et, également,de manière plus général lorsqu'il s'agit d Python, jeu de mémory [ par Mattmad ] Bonjour, je suis en train de plancher sur un jeu de memory via python mais je ne parviens pas à résoudre un "petit" problème, je vous pose la question créer une simulation d'un jeu de cartes [ par jimux06 ] # simulation d'un tirage de cartes # dans la version 3.1.x # afficher la date du jour (jj-mm-aaaa) et l'heure (hh:mm:ss), avant chaque jeu # utiliser Création d'un jeu 2D ! [ par Gatax ] Salut [^^clinoeil1] Je suis nouveau ici, et depuis qu'elle que temps j'aimerais crée un jeu 2D avec qu'elle que personne 2 ou 3, Mais c'est un peu dif créer une matrice [ par basmaber ] Bonjour, est ce que quelqu'un peut m'aider j'ai une liste de ce genre ['I1', '5.', '480.', '480.', '480.', '', 'I2', '0.5', '0.85', '0.85', '0.85', ''


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,874 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales