Le jeu de la vie
Aller à la navigation
Aller à la recherche
Le jeu de la vie est un automate cellulaire imaginé par John Horton Conway en 1970.
Python
#-------------------------------------------------------------------------------
# Nom : Jeu de la vie
# Sujet : automate cellulaire imaginé par John Horton Conway
#
# Auteur : tiré du mensuel Linux magasine
#
# Date de création : 03/07/2017
# Copyright :
# Licence :
#-------------------------------------------------------------------------------
import pygame
from pygame.locals import *
import numpy
import random
# Création de la grille (ancien nom : drawGrid)
def dessineGrille(caneva, fenetreLargeur, fenetreHauteur, celluleTaille):
for x in range(0, fenetreLargeur, celluleTaille):
pygame.draw.line(caneva, (0, 0, 0), (x, 0), (x, fenetreHauteur))
for y in range(0, fenetreHauteur, celluleTaille):
pygame.draw.line(caneva, (0, 0, 0), (0, y), (fenetreLargeur, y))
# Création population (ancien nom : populate)
def population(fenetreLargeur, fenetreHauteur, celluleTaille):
grille = numpy.zeros((fenetreLargeur, fenetreHauteur), dtype=numpy.dtype('b'))
for x in range(fenetreLargeur // celluleTaille):
for y in range (fenetreHauteur // celluleTaille):
grille[x, y] = random.randint(0, 1)
return grille
# Création affichage des cellules (ancien nom : displayCells)
def afficheCellules(caneva, fenetreLargeur, fenetreHauteur, celluleTaille, grille, celluleCouleur=(255, 155, 0)):
for x in range(fenetreLargeur // celluleTaille):
for y in range(fenetreHauteur // celluleTaille):
if grille[x, y] == 1:
pygame.draw.rect(caneva, celluleCouleur, (x * celluleTaille, y * celluleTaille, celluleTaille, celluleTaille))
else:
pygame.draw.rect(caneva, (fondCouleur), (x * celluleTaille, y * celluleTaille, celluleTaille, celluleTaille))
# Création de la fenêtre (ancien nom : initWindow)
def fenetreInitialisation(fenetreLargeur=640, fenetreHauteur=480, celluleTaille=10):
if fenetreLargeur % celluleTaille != 0:
print('Attention, la largeur doit être un multiple de la taille d\'une cellule')
exit(1)
if fenetreHauteur % celluleTaille != 0:
print('Attention, la hauteur doit être un multiple de la taille d\'une cellule')
exit(2)
pygame.init()
horloge = pygame.time.Clock()
caneva = pygame.display.set_mode((fenetreLargeur, fenetreHauteur))
caneva.fill(fondCouleur)
pygame.display.set_caption('Jeu de la vie')
grille = population(fenetreLargeur, fenetreHauteur, celluleTaille)
afficheCellules(caneva, fenetreLargeur, fenetreHauteur, celluleTaille, grille)
#dessineGrille(caneva, fenetreLargeur, fenetreHauteur, celluleTaille)
return (caneva, grille, horloge)
# recherche des voisins (ancien nom : getNeighbours)
def rechercheVoisins(grille, cellule, celluleLargeur, celluleHauteur):
voisins = 0
for mod_x in range(-1, 2):
for mod_y in range(-1, 2):
if mod_x == 0 and mod_y == 0:
continue
voisinCellule = (cellule[0] + mod_x, cellule[1] + mod_y)
if (voisinCellule[0] < celluleLargeur and voisinCellule[0] >= 0) and \
(voisinCellule[1] < celluleHauteur and voisinCellule[1] >= 0) and \
grille[voisinCellule[0], voisinCellule[1]] == 1:
voisins += 1
return voisins
# Recherche des voisins (ancien nom : applyRules)
def applicRegles(grille, fenetreLargeur, fenetreHauteur, celluleTaille, celluleLargeur, celluleHauteur):
nouvelleGrille = numpy.zeros((fenetreLargeur, fenetreHauteur), dtype=numpy.dtype('b'))
for x in range(celluleLargeur):
for y in range(celluleHauteur):
nombreDeVoisins = rechercheVoisins(grille, (x, y), celluleLargeur, celluleHauteur)
if grille[x, y] == 1:
if nombreDeVoisins < 2:
nouvelleGrille[x, y] = 0
elif nombreDeVoisins > 3:
nouvelleGrille[x, y] = 0
else:
nouvelleGrille[x, y] = 1
else:
if nombreDeVoisins == 3:
nouvelleGrille[x, y] = 1
#else
#nouvelleGrille[x, y] = 0
return nouvelleGrille
# Création du jeu de la vie
def jeuDeLaVie(fenetre=(640, 480), celluleTaille=10, frequence=10):
(caneva, grille, horloge) = fenetreInitialisation(fenetre[0], fenetre[1], celluleTaille)
celluleLargeur = fenetre[0] // celluleTaille
celluleHauteur = fenetre[1] // celluleTaille
while True:
for evenement in pygame.event.get():
if evenement.type == QUIT:
pygame.quit()
exit(0)
grille = applicRegles(grille, fenetre[0], fenetre[1], celluleTaille, celluleLargeur, celluleHauteur)
afficheCellules(caneva, fenetre[0], fenetre[1], celluleTaille, grille, celluleCouleur)
#dessineGrille(caneva, fenetre[0], fenetre[1], celluleTaille)
pygame.display.update()
horloge.tick(frequence)
# Lancement du jeu de la vie
if __name__ == '__main__':
# valeurs pour le jeu
frequence = 10
fenetre = (1500, 500)
celluleTaille = 10
celluleCouleur=(255, 155, 0) # couleur orange
fondCouleur = (255, 255, 192) # couleur jaune clair
# Lancement du jeu
jeuDeLaVie(fenetre, celluleTaille, frequence)
while True:
for evenement in pygame.event.get():
if evenement.type == QUIT:
pygame.quit()
exit(0)
pygame.display.update()