← Blog

Le Jeu de la Vie de Conway

Le Jeu de la Vie de Conway est un exemple classique de la façon dont la complexité peut émerger de quelques règles simples. Imaginez une grille infinie de cellules — chacune peut être « allumée » (vivante) ou « éteinte » (morte). À chaque tour (ou « génération »), chaque cellule vérifie combien de voisins sont vivants. Si elle est trop entourée, elle meurt. Si elle est trop isolée, elle meurt aussi. Mais avec exactement trois voisins, une cellule morte prend vie.

Cet ensemble de règles simples mène à des comportements infiniment fascinants — des formations stables et des oscillateurs répétitifs aux « vaisseaux spatiaux » autopropulsés qui traversent la grille. C'est une démonstration parfaite de la façon dont la complexité peut naître de la simplicité, et c'est même Turing-complet, ce qui signifie qu'il peut théoriquement simuler tout calcul.

Comment ça marche

Chargement du plateau de jeu...

Exemples de motifs

Ces motifs classiques illustrent le comportement émergent du jeu. Le « Glider » démontre le mouvement à travers la grille, le « Pulsar » crée une oscillation fascinante, et le « Small Exploder » montre comment des formes simples peuvent évoluer vers des formes complexes.

L'Algorithme

Au cœur du Jeu de la Vie se trouvent quelques fonctions élégantes qui déterminent la vie et la mort dans notre univers cellulaire :

// The core algorithm that determines life and death
function computeNextGeneration(currentGrid) {
  const newGrid = createEmptyGrid(rows, cols);

  for (let r = 0; r < rows; r++) {
    for (let c = 0; c < cols; c++) {
      const neighbors = countNeighbors(currentGrid, r, c);
      const cellState = currentGrid[r][c];

      // Apply Conway's rules of life
      if (cellState === 1) {
        // Live cell survives if it has 2 or 3 neighbors
        newGrid[r][c] = (neighbors === 2 || neighbors === 3) ? 1 : 0;
      } else {
        // Dead cell springs to life if it has exactly 3 neighbors
        newGrid[r][c] = (neighbors === 3) ? 1 : 0;
      }
    }
  }
  return newGrid;
}
L'algorithme principal applique les règles de Conway à chaque cellule de la grille. À chaque génération, il vérifie l'état de chaque cellule et son nombre de voisins pour déterminer si elle vit, meurt ou prend vie.
// Count live neighbors for each cell
function countNeighbors(g, row, col) {
  let count = 0;
  for (let i = 0; i < 8; i++) {
    const nr = row + NEIGHBOR_OFFSETS[i * 2];
    const nc = col + NEIGHBOR_OFFSETS[i * 2 + 1];
    if (nr >= 0 && nr < rows && nc >= 0 && nc < cols) {
      count += g[nr][nc];
    }
  }
  return count;
}
Voir la Règle 110 de Wolfram →
Comment ça marche

Sélectionnez n'importe quelle zone pour créer des groupes de cellules, ou sélectionnez et faites glisser pour dessiner des chemins vivants. Appuyez sur Lecture pour regarder votre création évoluer, ou utilisez Étape Suivante pour avancer d'une génération à la fois. Utilisez Aléatoire pour le chaos, ou Effacer pour recommencer.

Les Règles

Chaque cellule suit quatre règles simples à chaque génération:

  • Sous-population: Une cellule vivante avec moins de 2 voisins meurt
  • Survie: Une cellule vivante avec 2 ou 3 voisins survit
  • Surpopulation: Une cellule vivante avec plus de 3 voisins meurt
  • Reproduction: Une cellule morte avec exactement 3 voisins devient vivante
Contrôles
  • Lecture/Pause: Démarrer ou arrêter la simulation
  • Étape suivante: Avancer d'une génération à la fois
  • Vitesse: Ajuster la vitesse de passage des générations
  • Zoom: Changer la taille de la grille (uniquement en pause)
Exemples de motifs

Essayez les motifs préréglés pour voir différents comportements:

  • Planeur: Un motif qui se déplace en diagonale sur la grille
  • Pulsar: Un grand motif qui oscille avec une période de 3 générations
  • Petit Exploseur: Un motif qui s'étend vers l'extérieur de manière chaotique