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...
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.