Jeu de la vie en mini

Description

Bonjour,

Un programme du jeu de la vie (Game of Life) se compose essentiellement de trois parties:
1) L'initialisation: introduction d'une situation de départ.
2) L'affichage: visualisation de situations.
3) Le calcul: détermination des étapes consécutives.

L'introduction d'une situation initiale se fait ici à l'aide du presse-papier.
Mais il est toujours possible de faire des modifications directement avec la souris
(voir Console: Clavier et Souris).

L'affichage utilise la console en définissant les attributs 'BACKGROUND' des emplacements des caractères, c'est-à-dire sans "écrire" de caractère !
(voir Console: dimension et fonte).

Pour le calcul, on utilise l'algorithme "classique", qui consiste à compter les voisins vivants pour chaque cellule.
Puis, on détermine si, à l'étape suivante, elle sera vivante ou morte.

Le mot "mini" du titre s'applique principalement à l'étendue de la programmation, car il n'est pas rare de trouver des codes de beaucoup de centaines ou même de milliers d'instructions.

Pour simplifier le codage, on applique les concepts suivants:
a) Les cellules ont la valeur 0 si elles sont mortes, et 1 si elle sont vivantes.
b) Initialement, aucune cellule vivante ne touche le bord.
c) On ne modifie que les cellules intérieures, donc les cellules du bord restent mortes.

Le point a) permet de compter les voisins vivants en faisant simplement une somme.
b) et c) facilitent le calcul de l'adresse des voisins d'une cellule (sans devoir tenir compte des bords).
void Etape(int X, int Y, unsigned char *cel, unsigned char *cpy) {
  int X1 = X-1, Y1 = Y-1;
  uch n, *c = cel, *p, *a = cpy, *s = cpy+X;
  memcpy(cpy, cel, X*Y); // dédoublement
  for (int y = 1; y < Y1; ++y) { // lignes (évite les bords)
    c += X; p = a; a = s; s += X; // incrémentation des pointeurs
    for (int x = 1; x < X1; ++x) { // colonnes (évite les bords)
      n = p[x-1]+p[x]+p[x+1]+a[x-1]+a[x+1]+s[x-1]+s[x]+s[x+1];
      if (n != 2) // évolution selon le nombre de voisins vivants n
        if (c[x]) {if (n != 3) c[x] = 0;}
        else {if (n == 3) c[x] = 1;}
    } // for x
  } // for y
}


Le programme du fichier JeuDeLaVieMini.cpp du Zip sert principalement à tester la fonction Etape(...).

En voici quelques caractéristiques:
- Tout tient dans un seul fichier.
- Nécessite uniquement l'include <windows.h>.
- L'affichage se fait sur la console.
- Avec la souris, on peut inverser n'importe quelle cellule du jeu.
- L'introduction des situations initiales se fait à l'aide du presse-papier.
- On peut avancer pas par pas, ou par groupes de dix, cent ou mille pas.

Comme je n'ai pas trouvé de syntaxe existante pour définir une situation donnée du jeu de la vie, je propose la suivante:

Les 3 premiers caractères doivent correspondre à "JVa".
Après, tous les caractères différents d'un chiffre décimal sont traités comme des espaces
(ce qui permet d'ajouter des "commentaires").
Les entiers représentent alternativement des nombres de cellules mortes et vivantes.

Par exemple, prenez dans le presse-papier l'un des textes suivants (une ou deux lignes):
JVa Vide X=80 Y=60 X*Y=4800 (vide, pour définir la dimension)

JVa X=47 Y=35 mortes:680 vivantes:3 44 1 1 1 44 1 1 1 91 1 1 1 44 1 1 1 44 3 680

JVa Clown 47 45 {1150,3,44,1,1,1,44,1,1,1,868}

JVa Gosper glider gun 70 57 166 1 67 1 1 1 57 2 6 2 12 2 45 1 3 1 4 2 12 2
  34 2 8 1 5 1 3 2 48 2 8 1 3 1 1 2 4 1 1 1 55 1 5 1 7 1 56 1 3 1 66 2 3274

JVa Big Gosper glider gun 120 106 266 1 117 1 1 1 107 2 6 2 12 2 95 1 3 1 4 2 12
  2 84 2 8 1 5 1 3 2 98 2 8 1 3 1 1 2 4 1 1 1 105 1 5 1 7 1 106 1 3 1 116 2 11504

JVa Droite 128 127 8065 126 8065
puis tapez 'i'.

Tapez 'p' ou 'd' ou 'c' ou 'm' pour avancer d'un , de dix, de cent ou de mille pas, après avoir éventuellement modifié quelques cellules avec la souris.

Pour obtenir le clown de l'image de capture (troisième exemple ci-dessus), tapez 'c', puis 'd' pour avancer de 110 pas.

Merci d'avance de me faire connaître les syntaxes d'autres figures intéressantes.

Vous pouvez tester la rapidité du programme en supprimant l'instruction Sleep(50); qui se trouve à une dizaine de lignes de la fin du code, avec "Droite" ou "Big Gosper glider gun" par exemple.
Il est bien entendu que l'algorithme choisi (parcourir toutes les cellules en comptant les voisins vivants) est plus lent que les algorithmes "modernes".

Je prévois d'écrire d'autres versions de ce programme basées sur les idées suivantes:
- Traiter explicitement les cellules du bord.
- Travailler sur un espace 2D en forme de tore.
- Adaptation de la vitesse d'affichage.
- Permettre de sauver dans le presse-papier un état du jeu.
- Utiliser des bits (plutôt que des unsigned char).
- Optimisation des zones vides.
- Autres extensions ou améliorations proposées par les lecteurs ...


Quelques liens qui vous permettent, si nécessaire, de vous familiariser avec le jeu de la vie:
Wiki: Jeu de la vie, Conway's Game of Life, Conways Spiel des Lebens.
math.com: What is the Game of Life?.
dmoz: Liens sur "Conway's Game of Life".

De plus, CodeS-SourceS à déjà publié bien des articles sur le sujet.


Bonne lecture ...

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.