Le « Jeu de la vie » est un jeu imaginé par John Horton Conway en 1970. Il s’agit d’un jeu au sens mathématique du terme car il ne nécessite aucun joueur. Chaque état du jeu conduit automatiquement à l’état suivant à partir de règles déterminées.
Le jeu se déroule sur une grille à deux dimensions dont les cases, appelées « cellules », peuvent prendre deux états distincts : « vivante » (True) ou « morte » (False).
A chaque étape, l’évolution d’une cellule est entièrement déterminée par l’état de ses huit voisines (horizontales, verticales et diagonales) de la façon suivante :
- Une cellule morte possédant exactement trois voisines vivantes devient vivante, sinon elle reste morte.
- Une cellule vivante possédant deux ou trois voisines vivantes reste vivante, sinon elle meurt.
Ces règles sont illustrées par les tableaux suivants (source : Wikipédia) en considérant la cellule centrale :
- Dans la figure a., la cellule du centre est morte dans le premier état (elle n’apparaît plus) mais devient vivante dans l’état suivant du fait de ses trois voisines vivantes.
- Dans la figure b., l’état de la cellule centrale (morte) ne change pas car le nombre de voisines vivantes est trop faible.
- Dans la figure c., la cellule centrale est vivante dans le premier état mais meurt dans le second état car le nombre de voisines vivantes est trop élevé.
Pour ce problème, nous allons considérer la grille de jeu comme un tableau de booléens à deux dimensions (une liste de listes) où une cellule vivante est indiquée par « True » et une cellule morte est indiquée par « False ». Nous considérons aussi pour plus de facilité que la grille possède une bordure interne d’une épaisseur d’une cellule dans laquelle les cellules sont considérées comme mortes et dont l’état ne peut pas être changé (indiquées par des False ‘F’ dans le schéma ci-dessous). Ces cellules interviennent cependant dans l’évolution de l’état de leurs voisines (indiquées par des tirets ‘-’ dans le schéma ci-dessous). Notez que l’évolution du tableau au temps t se fait de manière globale pour tout le tableau. En d’autres termes, toutes les cellules du tableau sont modifiées en fonction de sa configuration actuelle (son état) au temps t pour donner sa nouvelle configuration au temps (t + 1). Notez que le tableau n’est pas nécessairement carré.
Nous vous demandons d’écrire les fonctions suivantes :
Signature des fonctions:
def nombreVoisinsVivants(etatActuel, x, y):
A implémenter. Cette fonction prend en argument un tableau de booléens à deux dimensions représentant l’état actuel du jeu ainsi que deux entiers x et y et renvoie le nombre de cellules vivantes autour de la cellule en position (x, y).def etatSuivant(etatActuel):
A implémenter. Cette fonction prend en argument un tableau de booléens à deux dimensions représentant l’état actuel du jeu et renvoie en sortie un autre tableau de booléens, distinct du tableau donné en argument, représentant l’état suivant du jeu selon les règles énoncées ci-dessus, où toutes les cellules (saufs celles de la bordure interne) ont été mises à jour une et une seule fois.