Le jeu de la vie

Aller à la navigation Aller à la recherche
La version imprimable n’est plus prise en charge et peut comporter des erreurs de génération. Veuillez mettre à jour les signets de votre navigateur et utiliser à la place la fonction d’impression par défaut de celui-ci.

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