« Jeu de la vie » : différence entre les versions

De Wiki du LAMA (UMR 5127)
Aller à la navigation Aller à la recherche
Aucun résumé des modifications
Aucun résumé des modifications
Ligne 19 : Ligne 19 :
Ces règles simples donnent naissance à une diversité de motifs et d'interactions.
Ces règles simples donnent naissance à une diversité de motifs et d'interactions.


===Exemples de comportements===
<h2>Exemples de comportements</h2>


Mettre des gif pour illustre ça
(Mettre des gif pour illustrer)


- Les oscillateurs
- Les oscillateurs
Ligne 27 : Ligne 27 :
- Les structures stationnaires
- Les structures stationnaires


===Implémentation sur une grille finie===
<h1>Implémentation sur une grille finie</h1>


===Structure de données utilisée===
<h2>Structure de données utilisée</h2>


La version naïve repose sur un tableau à deux dimensions, où chaque élément représente l'état de la cellule (0 pour morte, 1 pour vivante).
La version naïve repose sur un tableau à deux dimensions, où chaque élément représente l'état de la cellule (0 pour morte, 1 pour vivante).


===Initialisation et affichage de la grille===
<h2>Initialisation et affichage de la grille</h2>


L'affichage se fait via Tkinter, en dessinant des rectangles pour chaque cellule selon son état.
L'affichage se fait via Tkinter, en dessinant des rectangles pour chaque cellule selon son état.
Ligne 40 : Ligne 40 :
cases = [[0 for _ in range(largeur)] for _ in range(hauteur)]</pre>
cases = [[0 for _ in range(largeur)] for _ in range(hauteur)]</pre>


===Calcul des voisins et évolution des cellules===
<h2>Calcul des voisins et évolution des cellules</h2>


L'évolution d'une cellule s'effectue ensuite en appliquant les règles selon le nombre de voisins vivants.
L'évolution d'une cellule s'effectue ensuite en appliquant les règles selon le nombre de voisins vivants.
Ligne 56 : Ligne 56 :
</pre>
</pre>


===Avantages et limites de l'approche naïve===
<h2>Avantages et limites de l'approche naïve</h2>


- Simple à comprendre et à implémenter.
- Simple à comprendre et à implémenter.
Ligne 66 : Ligne 66 :
- Inadapté lorsque la majorité des cellules restent mortes.
- Inadapté lorsque la majorité des cellules restent mortes.


===Implémentation sur une grille infinie===
<h1>Implémentation sur une grille infinie</h1>


===Principe de stockage par dictionnaire===
<h2>Principe de stockage par dictionnaire</h2>

Version du 24 mars 2025 à 10:08

Introduction

Le jeu de la vie est un automate cellulaire inventé par John Conway en 1970. Il se base sur des règles très simples pour déterminer l'évolution d'un ensemble de cellules sur une grille. Cette simulation permet d'observer l'émergence de motifs complexes à partir d'états initialement simple.

Théorie et règles

Règles de base du jeu de la vie

A chaque génération, les règles suivantes s'appliquent simultanément à toutes les cellules :

(expliquer le principe de voisins : diagonale, haut, bas, gauche, droite)

- Une cellules vivante meurt si elle a moins de 2 ou plus de 3 voisins vivants (sous-population ou surpopulation)

- Une cellule vivante survit si elle a exactement 2 ou 3 voisins.

- Une cellule morte naît si elle a exactement 3 voisins vivants

Ces règles simples donnent naissance à une diversité de motifs et d'interactions.

Exemples de comportements

(Mettre des gif pour illustrer)

- Les oscillateurs - Les vaisseaux - Les structures stationnaires

Implémentation sur une grille finie

Structure de données utilisée

La version naïve repose sur un tableau à deux dimensions, où chaque élément représente l'état de la cellule (0 pour morte, 1 pour vivante).

Initialisation et affichage de la grille

L'affichage se fait via Tkinter, en dessinant des rectangles pour chaque cellule selon son état.

# Initialisation d'une grille de dimensions définies par l'utilisateur
cases = [[0 for _ in range(largeur)] for _ in range(hauteur)]

Calcul des voisins et évolution des cellules

L'évolution d'une cellule s'effectue ensuite en appliquant les règles selon le nombre de voisins vivants.

 def voisins_vivants(x, y):
    voisins = [(-1, -1), (-1, 0), (-1, 1), 
               (0, -1),           (0, 1),
               (1, -1),  (1, 0),  (1, 1)]
    nb_vivants = 0
    for dx, dy in voisins:
        nx, ny = x + dx, y + dy
        if 0 <= nx < hauteur and 0 <= ny < largeur:
            nb_vivants += cases[nx][ny]
    return nb_vivants

Avantages et limites de l'approche naïve

- Simple à comprendre et à implémenter.

- Utiles pour des grilles de petite taille.

- Gaspillage de mémoire pour de grandes tailles.

- Inadapté lorsque la majorité des cellules restent mortes.

Implémentation sur une grille infinie

Principe de stockage par dictionnaire