Aller au contenu

Exercice : Le Jeu de la Vie (Conway's Game of Life)

Cet exercice vise à mettre en pratique la modélisation de classes et les algorithmes de manipulation de tableaux 2D.

Introduction

Le Jeu de la vie n'est pas un "jeu" au sens traditionnel (il n'y a pas de joueur). C'est un automate cellulaire qui évolue selon des règles simples basées sur l'état de ses voisins.

Les Règles

L'univers du jeu est une grille orthogonale bidimensionnelle de cellules carrées, chacune d'entre elles étant dans l'un des deux états possibles : vivante ou morte. Chaque cellule interagit avec ses huit voisins directs (horizontaux, verticaux et diagonaux).

À chaque étape de temps (génération), les transitions suivantes se produisent :

  1. Naissance : Une cellule morte avec exactement trois voisins vivants devient vivante.

    Génération T    Génération T+1
    . . . . .       . . . . .
    . X X . .  -->  . X X . .
    . X . . .       . X X . .
    . . . . .       . . . . .
    

  2. Survie : Une cellule vivante avec deux ou trois voisins vivants reste vivante.

    Génération T    Génération T+1
    . . . . .       . . . . .
    . X X . .  -->  . X X . .
    . X . . .       . X . . .
    . . . . .       . . . . .
    

  3. Mort (Sous-population) : Une cellule vivante avec moins de deux voisins vivants meurt.

    Génération T    Génération T+1
    . . . . .       . . . . .
    . . X . .  -->  . . . . .
    . X . . .       . . . . .
    . . . . .       . . . . .
    

  4. Mort (Surpopulation) : Une cellule vivante avec plus de trois voisins vivants meurt.

    Génération T    Génération T+1
    . . X . .       . X X X .
    . X X X .  -->  . X . X .
    . . X . .       . X X X .
    

Travail à faire

1. Modélisation

Créez une classe GrilleJeuDeLaVie qui contient :
- Un tableau 2D (ou une structure appropriée) pour représenter l'état des cellules.
- Les propriétés Largeur et Hauteur.
- Une méthode ProchaineGeneration() qui calcule l'état suivant de la grille.
- Une méthode DefinirCellule(int x, int y, bool estVivante) pour configurer l'état initial.
- Une méthode EstVivante(int x, int y) pour vérifier l'état d'une cellule.
- Une méthode InitialiserAleatoirement(double pourcentage) qui remplit la grille de façon aléatoire selon un pourcentage de chance (0.0 à 1.0) qu'une cellule soit vivante.
- Redéfinissez la méthode public override string ToString() en utilisant obligatoirement la classe StringBuilder pour construire et retourner une représentation visuelle de la grille (utilisez des caractères comme pour les cellules vivantes et . pour les cellules mortes).

2. Exemples de Motifs (ASCII Art)

Utilisez ces motifs pour valider votre logique de transition.

Motifs Stables (S'arrêtent de changer)

Bloc (2x2) :      Ruche :
  . . . .          . . . . .
  . X X .          . . X X .
  . X X .          . X . . X
  . . . .          . . X X .
                   . . . . .

Oscillateurs (Alternent entre deux états)

Clignotant (Période 2) :
État 1:          État 2:
  . . . . .       . . . . .
  . . . . .       . . X . .
  . X X X .       . . X . .
  . . . . .       . . X . .
  . . . . .       . . . . .

Vaisseaux (Se déplacent sur la grille)

Planeur (Glider) :
  . X .
  . . X
  X X X

Défi pour les avancés (Mode Pac-Man)

Pour rendre l'univers infini (mais bouclé), implémentez une variante où la grille est torique.
- Si une cellule est au bord droit, ses voisins de droite se trouvent sur le bord gauche.
- Si une cellule est sur le bord supérieur, ses voisins du haut se trouvent sur le bord inférieur.

Cela signifie qu'aucune cellule n'est jamais réellement "sur le bord" ; elles ont toutes systématiquement 8 voisins.