# TP Algorithmie Game Of Life
## Ressources
Exemple d'écriture d'une matrice (tableau à 2 dimensions, grille) 3x3 d'entiers en pseudo code:
```c#
Entier[,] MATRICE = Entier[3,3]
//Remplir l'élément (aussi appelé cellule) à la position (0,0) par 10.
Entier[0,0] = 10
//Remplir l'élément à la position (0,1) par 12.
Entier[0,1] = 12
//Accéder à l'élément (2,1) et l'afficher.
Afficher MATRICE[2,1]
```
Documentation sur les tableaux multidimensionnels en C#:
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/arrays/multidimensional-arrays
## Individuel
>On a dans notre code une matrice représentant une grille de vrai et de faux:
>```c#
>static bool[,] grid;
>```
### Elève 1 :
1 - Ecrire une fonction __*GenerateGrid*__ en pseudo code qui génére la grille (de taille x et y entiers donnés en entrée) et la remplie de valeurs aléatoires (vrai ou faux).
2 - Traduire en C#.
### Elève 2 :
1 - Ecrire en pseudo code une fonction __*GetNumberOfNeighboursAlive*__ qui prenne en entrée les coordonnées entières x et y d'un élément de la grille. Elle devra __retourner__ le nombre de voisins (cotés et diagonales, donc parmis 8) dont la valeur est vrai.
2 - Traduire en C#.
### Elève 3 :
1 - Ecrire en pseudo code une fonction __*DrawGame*__ qui dessine la grille dans la console. Les éléments *vrai* seront représentés par __\*__ et les éléments *faux* par un espace (on utilise Console.WriteLine() comme d'habitude). On ajoutera également un espace entre chaque élément pour plus de lisibilité.
>Exemple pour une matrice 5x5
>```
> * * *
> * * *
> *
> *
> * * *
>```
2 - Traduire en C#.
## Groupe
On veut réaliser un __*Game of Life*__: https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life
>Le jeu de la vie est un « jeu à zéro joueur », puisqu'il ne nécessite pas l'intervention du joueur lors de son déroulement. Il s’agit d’un automate cellulaire, un modèle où chaque état conduit mécaniquement à l’état suivant à partir de règles pré-établies.
>
>Le jeu se déroule sur une grille à deux dimensions, théoriquement infinie (mais de longueur et de largeur finies et plus ou moins grandes dans la pratique), dont les cases — qu’on appelle des « cellules », par analogie avec les cellules vivantes — peuvent prendre deux états distincts : « vivante » ou « morte ».
>
>Une cellule possède huit voisins, qui sont les cellules adjacentes horizontalement, verticalement et diagonalement.
>
>À chaque étape, l’évolution d’une cellule est entièrement déterminée par l’état de ses huit voisines de la façon suivante :
>* Une cellule morte possédant exactement trois voisines vivantes devient vivante (elle naît).
>* Une cellule vivante possédant deux ou trois voisines vivantes le reste, sinon elle meurt.
Voici le main en C# pour le réaliser:
```c#
const int WIDTH = 20;
const int HEIGHT = 20;
const int FRAMERATE = 5;
static bool[,] grid;
static void Main(string[] args)
{
GenerateGrid(WIDTH,HEIGHT);
int step = 0;
while (true)
{
Console.Clear();
Console.WriteLine($"Step : {step}");
DrawGame();
Grow();
step++;
Thread.Sleep(1000 / FRAMERATE);
}
}
```
1 - Ecrire la fonction __*Grow*__, qui va faire evoluer la grille vers l'état suivant selon les règles du jeu.
*Attention à ne pas faire évoluer la grille au fur et à mesure. On doit détérminer la nouvelle valeur de chaque cellule de la grille avant d'appliquer toutes les modifications d'un coup à la grille. Autrement, les premières cellules modifiées pourrait avoir un impacte sur leurs voisines.*
2 - Vérifier que le jeu fonctionne en mettant en commun toutes vos fonctions, debugger autrement.
