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()