Projet algorithmique scolaire : Automate Cellulaire
Projet 22
Caractéristiques
- Date : Automne 2021
- État : Terminé
- Code source et rapport de projet
- Thèmes : Jeu de la vie, simulation, intéractions entre matériaux
- Tags : C, Projet scolaire
Description
Ce projet est le premier de mon cursus à l'ENSEIRB-MATMECA. C'est un projet algorithmique réalisé en C, dans un groupe de deux. Mon partenaire de travail était Dimitri Walther . Le projet s'est étalé sur 3 mois et j'ai trouvé le sujet vraiment intéressant.
Le sujet concerne les automates cellulaires, dont certaines règles à implémanter décrites dans le sujet sont inpirées de l'état de l'art et du jeu Noita. Avec Dimitri, nous avons travaillé sur les mêmes parties de code dont je vais développer les étapes.
Au départ, nous devions réaliser le jeu de la vie en représentant les cellules vivantes avec plusieurs couleurs. Ce problème de multicoloritude a été résolu assez, facilement. En effet, les couleurs affichées à l'écran étaient représentées par des nombres allant de 0 à 16777215. Nous avons utilisé des nombres supplémentaires pour représenter les différents type de cellules. Ici 16777215 + 1 pour les cellules mortes et le nombre 16777215 + 2 pour les cellules vivantes. Ensuite, c'est lors de la phase de la création d'images que notre système convertit ces couleurs inafichables en des couleurs que nous avons définies. Malgré tout, nous avons eu un problème, les couleurs d'une cellule changeaient même si elle ne bougait pas. C'est-à-dire qu'un matériau pouvait avoir plusieurs couleurs et la couleur de notre cellule changeait aléatoirement parmi les couleurs définies à chaque mise à jour. Pour régler ce problème, nous avons créé le type spécial, "last color", une convention qui indique au système que la couleur de la cellule doit être la même pour la prochaine image, ce système fonctionnait aussi pour le cas des cellules en mouvement.
Notre deuxième objectif était de reproduire le comportement du sable. Nous avons voulu faire un système plus généraliste, nous avons donc fait un système avec des particules (comme des grains de sable) qui se déplaceaient. Les particules suivaient leurs règles de modification (ex: déplace-toi en diagonale.), elle leur donnait leur nouvelle position et leur nouveau type. Notre système effectuait un premier parcours de toutes les cellules pour remplir une file de règles à appliquer. Ensuite, le système regardait pour chaque case quelles étaient les cellules voulant se déplacer dessus. De cette considération, le système construisait un graphe de dépendance sur lequel nous avons rajouté un système de détection de cycle. Pour le cas où des multiples cellules voulaient se déplacer sur une seule case, nous avons décidé qu'un choix au hasard était le mieux. Pour le cas des cycles, nous pouvions simplement faire une permutation cyclique des cellules.
Afin de tester la compression, nous avons imaginé deux cas, un bloc de sable et deux barres, une se déplaçant vers la gauche et une se déplaçant vers la droite. Le but du bloc de sable est de vérifier qu'il tombait bien en un seul bloc. Tandis que le but de compression contenant deux barres était de vérifier qu'elles n'allaient pas se fusionner l'une dans l'autre et qu'une seule des deux cellules allait prendre la place voulue. Pour tester les cycles, nous avons créé une zone avec une colonne complète de sable. Comme la zone de simulation est torique, la colonne devait tomber à l'infini. Les visuels ci-dessous illustrent cela.
Enfin, notre dernier objectif était de développer des événements aléatoires. C'est dans ce but que nous avons créé les cellules de sable lourd et les cellules de dynamites. Le comportement du sable dense était d'échanger de position avec le sable fin de façon aléatoire. De même, la dynamite devait exploser à un moment aléatoire.
Visuels - (cliquer pour ouvrir en grand)
















Hey test test