22 Février, 2023

Réalisation d'un
Jeu de la vie

Inspiré du concept de Von Neumann, mon jeu de la vie propose
une perspective originale par rapport à la version de base.

Ci-dessus une ancienne version (d'illustration) de mon jeu de la vie version hors-ligne.


Le projet

Introduction

L'emblématique jeu de la vie de Von Neumann, un automate cellulaire fascinant introduit par le mathématicien John Conway, se distingue par la simplicité avec laquelle il est possible de simuler des éléments de la vie. En reprenant les idées de son concept, j'ai pu concevoir une version personnalisée du jeu de la vie.

Cadre de travail

Ce projet a été réalisé en 16 heures de travail à l'aide sur logiciel Visual Studio Code. Un grand merci à Anthony Saccardo, étudiant à l'école 42 et animateur de TUMO, qui m'a guidé tout au long du projet en me fournissant notamment les bases du projet (site internet, environnement de programmation...), mais qui m'a aussi enseigné la programmation en JavaScript, la mise en place d'un serveur, l'utilisation de GitHub, de Node.js et de ses paquets (tels que Express et Socket.io).

Fonctionnement

Mon jeu de la vie a pour thème la nature. Il existe diverses cellules : l'herbe, les mangeurs d'herbes, les prédateurs, l'herbe empoisonnée, la pierre. Chacune de ces cellules évolue au sein de cycles, où certaines disparaissent au profit d'autres à chaque itération, tout en permettant l'apparition de nouvelles cellules.


Structure du projet

Le projet est divisé en deux parties. D'un côté, la partie utilisateur (front-end), et de l'autre, la partie serveur (back-end).

Front-end

Dans la partie front-end se trouve un site qui permet à plusieurs utilisateurs de visualiser simultanément la matrice et de placer graphiquement des cellules dans cette même matrice en cliquant. L'utilisateur peut également augmenter ou ralentir la vitesse à laquelle les cycles s'enchaînent. À noter : une protection empêche l'utilisateur de saturer le serveur en envoyant trop de requêtes.

Back-end

Chaque action de l'utilisateur est transmise au serveur sous la forme d'un événement correspondant à cette action. Lorsqu'un événement est reçu, signifiant par exemple l'ajout graphique d'une cellule par un clic, le serveur procède à la modification de la matrice. Ensuite, cette matrice actualisée est renvoyée au site.

Exemple

socket.on('click', (x, y, selection) => {
	if (selection == 'cell-grass-eater'){
		game.grid[y][x] = new GrassEater({x, y, game, grid: game.grid})
	}
})

Fonction écoutant les clics sur la matrice de jeu et ajoutant une cellule de type GrassEater (mangeur d'herbe) aux coordonnées sélectionnées.


Les types de cellules

Passons en revue les divers types de cellules :

L'Herbe

Animation de l'herbeLa cellule d'Herbe est l'une des seules cellules (avec le rocher et la bombe) qui ne meurt pas de faim avec le temps. Une cellule d'herbe peut grandir toute seule, chaque descendant créant une nouvelle cellule d'herbe jusqu'à éventuellement remplir la matrice entière. Dans la configuration de mon jeu, l'herbe est indispensable à la vie. Sans elle, il n'y a pas de mangeurs d'herbe, et donc pas de prédateurs.

Les mangeurs d'herbes

Animation des mangeurs d'herbesComme leur nom l'indique, les cellules mangeuses d'herbe sont herbivores. Elles ont besoin d'herbe pour se reproduire et survivre. Ainsi, si une cellule d'herbe n'est pas dans leur périmètre (zone alentour) pendant plus de 30 cycles, ces dernières meurent. Après avoir mangé 5 cellules d'herbe, elles produisent une nouvelle cellule mangeuse d'herbe. En mangeant, la cellule d'herbe est détruite.

L'Herbe empoisonnée

Animation de l'herbe empoisonnéeUne copie conforme de l'herbe à quelques différences près. Si un mangeur d'herbe consomme cette cellule, il meurt et l'herbe en question disparaît. Cette herbe pousse moins rapidement que l'herbe normale et devient ordinaire après 250 cycles.

Les prédateurs

Animation des prédateursLes prédateurs ne se nourrissent que de mangeurs d'herbes. Ils balayent la zone dans un rayon de 50 cellules autour d'eux à la recherche de proies herbivores avant de se diriger vers l'une d'elles. Si un prédateur ne se nourrit pas pendant 40 cycles, il meurt de faim. Un nouveau descendant apparaît dès la consommation du cinquième mangeur d'herbe.

La bombe

Animation de la bombeLa bombe constitue l'unique élément artificiel du jeu. Cette cellule demeure inerte. Dès qu'un herbivore se situe dans un rayon de 25 pixels autour de la bombe, celle-ci se dirige vers l'herbivore avant d'exploser, créant un cratère de dimension aléatoire (et détruisant les cellules environnantes) qui persiste pendant 70 cycles.

La Pierre

Animation de la pierreUne cellule totalement inerte et uniquement destructible par une bombe. Sa solidité en fait le rempart idéal face à tout ce qui bouge : mangeurs d'herbes, bombes, prédateurs, etc. Le rocher restera en place tant qu'il n'aura pas été détruit par une bombe ou retiré par l'utilisateur.


Code source du projet

Le projet est disponible en open-source sur GitHub en cliquant sur le bouton ci-dessous.