Le jeu de la vie est une modélisation simpliste de la vie de cellules dans l'espace. Dans le cadre de cet exercice l'espace sera une grille rectangulaire dont chaque case peut contenir au plus une cellule. Chaque case contiendra donc soit 0 soit 1 cellule en vie.
Les voisines prises en compte sont toutes les cases situées immédiatement à gauche, à droite, en haut, en bas ou sur les quatre diagonales, si elles existent. Une case a donc au plus 8 voisines, moins si elle se situe sur un bord de la grille:
voisines
Les cellules peuvent émerger ou mourir selon des critères précis à réévaluer à chaque nouvelle génération :
3voisins
Une cellule disparaît de sa case si elle est entourée par strictement moins de deux cellules vivantes ou strictement plus de trois cellules vivantes:
0 voisin | 1 voisin | 4 voisin | 5 voisin |
---|---|---|---|
0 | 1 | 4 | 5 |
Du point de vue technique une grille du jeu de la vie sera représentée par une liste de listes de nombre entiers. Chaque nombre entier représente le nombre de cellules vivantes dans une case de la grille (0 ou 1). Par exemple la liste :
[ [0, 1, 0], [1, 0, 0] ]
Sur la première ligne seule la deuxième case possède une cellule (vie), tandis que sur la deuxième ligne, seule la première case en possède une (vie).
colonne 1 | colonne 2 | colonne 3 | |
---|---|---|---|
ligne 1 | 0 | 1 | 0 |
ligne 2 | 1 | 0 | 0 |
- Voici le doc string du constructeur:
"""
Création d'une grille 2D avec deux paramètres ligne et colonne.
Initialisation de la grille avec des valeurs aléatoires
(1=vivant ou 0=mort)
"""
'attention aux paramètres ligne colonne non vide'
On désire à présent compléter le constructeur en ajoutant l'attribut d'instance monde qui correspond à la grille ligne∗colonneligne * colonneligne∗colonne avec des valeurs aléatoires (0 ou1):
[[0, 0], [0, 0], [1, 1]]
[[0, 0, 0], [0, 1, 0], [0, 1, 1], [1, 1, 1], [1, 1, 0]]
Remarque: Il est recommandé de réaliser des testes dans le shell avant de l'implémenter dans la classe JeuVie. Vous pourrez également visualiser la construction par compréhension sur Python Tutor (Python Tutor - Visualize Python, Java, JavaScript, C, C++, Ruby code execution)
"""
Affiche la grille avec les symboles graphiques du dictionnaire cells
>>> grille = JeuVie(5,5)
>>> grille.monde = [[0, 1, 0, 0, 0],[0, 0, 1, 0, 0],[1, 1, 1, 0, 0],[0, 0, 0, 0, 0],[0, 0, 0, 0, 0]]
>>> print(grille)
.#...
..#..
###..
.....
.....
"""
Q4. Ajoutez à votre classe JeuVie un attribut de classe cells de type dictionnaire, qui permettra l'affichage des symboles "#" et ".".
Il est nécessaire pour la suite de s'avoir si les coordonnées pointées par un numéro de ligne et de colonne appartiennent bien à la grille. Cette méthode retournera:
>>> grille = JeuVie(4,4)
>>> grille.monde = [[0, 0, 1, 0], [1, 0, 0, 1], [1, 0, 0, 1], [0, 1, 0, 0]]
>>> grille.get_grille(-1,2)
False
>>> grille.get_grille(2,0)
1
Cette méthode revoie le nouvel état de la cellule pointée par sa position (ligne, colonne) en respectant les règles d'évolution du jeu.
Q7. Implémentez votre méthode evolution_cell() qui prend en paramètre la ligne et la colonne de la cellule pointée.
>>> grille = JeuVie(4,4)
>>> grille.monde = [[0, 0, 1, 0], [1, 0, 0, 1], [1, 0, 0, 1], [0, 1, 0, 0]]
>>> grille.evolution_cell(0,2)
False
>>> grille.evolution_cell(2,1)
True
>>> grille = JeuVie(4,4)
>>> grille.monde = [[0, 0, 1, 0], [1, 0, 0, 1], [1, 0, 0, 1], [0, 1, 0, 0]]
>>> grille.evolution_jeu()
>>> grille.monde
[[0, 0, 0, 0], [0, 1, 1, 1], [1, 1, 1, 0], [0, 0, 0, 0]]
>>> grille.evolution_jeu()
>>> grille.monde
[[0, 0, 1, 0], [1, 0, 0, 1], [1, 0, 0, 1], [0, 1, 0, 0]]
#importer la classe time
import time
if __name__ == '__main__':
#Instanciation de l'objet grille avec 10 lignes et 10 colonnes
grille = ..........................
print(grille)
rep = 0
#repeter 20 fois
while .........:
print("Répétition= ",rep)
#appliquer une évolution du jeu à l'objet grille
............................
time.sleep(0.2)
print(grille)
#Incrémenter la variable locale x
rep = .....................
self.monde = [[0, 0, 1, 0],
[1, 0, 0, 1],
[1, 0, 0, 1],
[0, 1, 0, 0]]
self.monde = [[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 1, 1, 1, 0],
[0, 1, 1, 1, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0]]
self.monde = [[0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,1,0,0,0,0,0],
[0,0,0,0,1,1,1,0,0,0,0],
[0,0,0,1,1,1,1,1,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,1,1,1,1,1,0,0,0],
[0,0,0,0,1,1,1,0,0,0,0],
[0,0,0,0,0,1,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0],]