Présentation du Jeu de la Vie
Le jeu de la vie est une création de John Conway.
C'est le plus connu des automates cellulaires : une grille de cellules évoluant au cours du temps selon un petit nombre de règles.
Ici, on se place dans une grille simple, faite de carrés, chaque cellule est donc encadrée par 8 autres cellules.
Malgré des règles très simples, le jeu de la vie permet le développement de motifs extrêmement complexes.
Règles du Jeu de la Vie
Les règles de ce jeu sont les suivantes :
- Chaque cellule ne peut avoir que deux état : la vie et la mort.
- Si une cellule en vie n'a qu'une voisine ou aucune, elle meurt de solitude.
- Si une cellule en vie a 4 voisines ou plus, elle meurt de surpopulation.
- Avec 2 ou 3 voisins, une cellule en vie reste en vie.
- Quand exactement 3 cellules vivantes encadrent une quatrième morte, celle-ci renaït à l'étape suivante.
Eléments remarquables
Créé en 1970, d'une puissante simplicité, ce jeu présente de nombreux motifs remarquables :
- Des structures stables : celles-ci n'évoluent pas au cours du temps. La plus simple est le carré $2 \times 2$.
- Des oscillateurs , qui sont les structures (périodiques) qui reviennent à leur état initial après un certain nombre de génération.
- Des vaisseaux : ils reviennent dans leur situation initiale après un certain nombre de génération, mais pas au même endroit : ils se déplacent.
- Des canons : qui fabriquent des vaisseaux de manière périodique.
Travaux pratiques
Le sujet
- Réalisez le jeu de la vie.
- Recherchez des configurations spéciales (oscillateurs, vaisceaux, etc.).
Je vous conseille de représenter votre automate cellulaire par une matrice. Vous créerez alors une fonction d'actualisation de ladite matrice, en respectant les règles du jeu de la vie. Enfin, vous ferez une fonction qui, à une matrice associe sa représentation graphique, en utilisant Tkinter.
Indications
Voici un bout de code permettant d'afficher un rectangle :
>>> from Tkinter import *
>>> fen = Tk()
>>> can = Canvas(fen,bg='dark grey',height=200,width=200)
>>> can.pack()