nsi:tds:jeux:jeu_de_la_vie
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédente | |||
| nsi:tds:jeux:jeu_de_la_vie [2024/12/29 17:58] – goupillwiki | nsi:tds:jeux:jeu_de_la_vie [2024/12/29 18:42] (Version actuelle) – goupillwiki | ||
|---|---|---|---|
| Ligne 28: | Ligne 28: | ||
| {{ vie_3.png? | {{ vie_3.png? | ||
| - | ===== L' | + | ===== Les fichiers de départ |
| - | + | ||
| - | On peut utiliser [[nsi: | + | |
| - | + | ||
| - | Voici les éléments dont vous pourriez avoir besoin : | + | |
| - | + | ||
| - | ==== Initialisation de la fenêtre graphique | + | |
| <code python> | <code python> | ||
| - | from tkinter import * # bibliothèque graphique | + | # module life.py |
| - | # on convient de dimensions : | ||
| WIDTH = 80 # La grille de jeu a 80 cellules de large | WIDTH = 80 # La grille de jeu a 80 cellules de large | ||
| HEIGHT = 60 # et 60 de haut | HEIGHT = 60 # et 60 de haut | ||
| Ligne 46: | Ligne 39: | ||
| DEAD_COLOR = '# | DEAD_COLOR = '# | ||
| - | root = Tk() # création de la fenêtre Tkinter | + | def create_new_cell(canvas, line:int, col:int, coul: |
| - | root.title(" | + | |
| - | + | ||
| - | # création de la zone de dessin - canvas | + | |
| - | canvas = Canvas(root, width = WIDTH*CELL_SIZE, | + | |
| - | canvas.pack() # insertion de la zone de dessin dans la fenêtre | + | |
| - | </ | + | |
| - | + | ||
| - | ==== Créer une cellule ==== | + | |
| - | + | ||
| - | La fenêtre graphique est vide. Le mieux est de créer des carrés qui resteront les mêmes tout du long de l' | + | |
| - | + | ||
| - | <code python> | + | |
| - | def create_new_cell(line:int, col:int, coul: | + | |
| - | | + | |
| Crée une nouvelle cellule dans la zone de dessin, | Crée une nouvelle cellule dans la zone de dessin, | ||
| à la ligne line et colonne col, de couleur coul | à la ligne line et colonne col, de couleur coul | ||
| la fonction renvoie un identifiant de l' | la fonction renvoie un identifiant de l' | ||
| - | | + | |
| x = col * CELL_SIZE | x = col * CELL_SIZE | ||
| y = line * CELL_SIZE | y = line * CELL_SIZE | ||
| return canvas.create_rectangle(x, | return canvas.create_rectangle(x, | ||
| - | </ | ||
| - | ==== Changer la couleur d'une cellule déjà créée ==== | + | def change_cell_coul(canvas, |
| - | + | | |
| - | Lors de la création d'une cellule, on a pu récupérer un identifiant -- c'est un entier -- qu'il faut conserver car cet identifiant nous permettra d' | + | |
| - | + | ||
| - | Dans la fonction, '' | + | |
| - | + | ||
| - | <code python> | + | |
| - | def change_cell_coul(cell_id: | + | |
| - | | + | |
| pour une cellule dont l' | pour une cellule dont l' | ||
| on impose une nouvelle couleur | on impose une nouvelle couleur | ||
| - | | + | |
| canvas.itemconfig(cell_id, | canvas.itemconfig(cell_id, | ||
| - | </ | ||
| - | ==== Animation ==== | + | def make_grids(canvas): |
| + | """ | ||
| + | crée et renvoie deux grilles | ||
| + | une grille cells contenant les identifiants des cellules graphiques | ||
| + | une grille vivants contenant l' | ||
| + | """ | ||
| + | # à faire | ||
| - | Le jeu de la vie est plus intéressant s'il bouge un peu ! | + | def vivant(vivants, |
| + | """ | ||
| + | renvoie True si la cellule à la position demandée | ||
| + | si position hors cadre, renvoie False | ||
| + | """ | ||
| + | # à faire | ||
| - | Tkinter permet un mécanisme de réactualisation de l' | ||
| - | Dans notre cas, la fonction | + | def voisins_vivants(vivants, line, col) -> int: |
| + | """ | ||
| + | renvoie le nombre | ||
| + | """ | ||
| + | # à faire | ||
| + | |||
| + | def has_to_die(vivants, | ||
| + | """ | ||
| + | renvoie True si la cellule à la position demandée est vivante et doit mourir | ||
| + | """ | ||
| + | # à faire | ||
| + | |||
| + | |||
| + | def has_to_born(vivants, | ||
| + | """ | ||
| + | renvoie True si la cellule à la position demandée est morte et doit naître | ||
| + | """ | ||
| + | # à faire | ||
| + | |||
| + | def set_alive(canvas, | ||
| + | """ | ||
| + | met à l'état vivant | ||
| + | c'est à dire : modifie vivants | ||
| + | """ | ||
| + | # à faire | ||
| + | |||
| + | def set_dead(canvas, vivants, cells, line, col): | ||
| + | """ | ||
| + | met à l' | ||
| + | c'est à dire : modifie vivants et l' | ||
| + | """ | ||
| + | # à faire | ||
| + | |||
| + | def cycle(canvas, | ||
| + | """ | ||
| + | exécute un cycle de jeu de la vie | ||
| + | """ | ||
| + | # à faire | ||
| + | </ | ||
| <code python> | <code python> | ||
| + | # main.py | ||
| + | |||
| + | from tkinter import * # bibliothèque graphique | ||
| + | from life import make_grids, cycle | ||
| + | |||
| + | # init fenêtre tkinter | ||
| + | root = Tk() # création de la fenêtre Tkinter | ||
| + | root.title(" | ||
| + | |||
| + | # création de la zone de dessin - canvas | ||
| + | canvas = Canvas(root, | ||
| + | canvas.pack() # insertion de la zone de dessin dans la fenêtre | ||
| + | |||
| def reactualisation(): | def reactualisation(): | ||
| - | | + | |
| - | | + | |
| # pour que la réactualisation se relance 1s plus tard, la fonction se termine par : | # pour que la réactualisation se relance 1s plus tard, la fonction se termine par : | ||
| root.after(1000, | root.after(1000, | ||
| + | |||
| + | |||
| + | cells, vivants = make_grid(canvas) | ||
| # et en fin de script, on amorce en programmant une première | # et en fin de script, on amorce en programmant une première | ||
| # réactualisation | # réactualisation | ||
| - | root.after(0, reactualisation) | + | root.after(1000, reactualisation) |
| # et on lance la boucle qui maintient l' | # et on lance la boucle qui maintient l' | ||
| root.mainloop() | root.mainloop() | ||
| - | </Code> | + | </code> |
| - | ===== Stockage de la grille | + | ===== L' |
| - | D'une part, nous devons stocker l' | + | On peut utiliser [[nsi: |
| - | Nos cellules sont réparties sur une grille. On va stocker nos données dans un tableau. Nous avons deux approches possibles : | + | Le fenêtre elle-même est désignée par '' |
| - | <code python> | + | On souhaite créer des carrés qui changent de couleurs. Ces carrés sont dessinés grâce aux fonctions |
| - | # tableau | + | |
| - | # exemple pour l'information sur l'état : | + | |
| - | vivantes = [ [False, False, False, ..., False], | + | |
| - | | + | |
| - | ... | + | |
| - | | + | |
| - | # True pour une cellule vivante, False pour une morte | + | Quand on veut changer la couleur, on utilise '' |
| - | # pour atteindre la cellule de ligne 13 et colonne 5 | + | |
| - | vivantes[13][5] | + | Il est important dans ce programme de traiter à part l' |
| - | # la cellule | + | |
| - | </ | + | Tout au long du programme, nous aurons donc deux grilles : |
| + | * une grille '' | ||
| + | * une grille '' | ||
| + | |||
| + | ===== grilles ===== | ||
| - | Le choix de tableau 2D ci-dessus peut sembler s' | + | ==== création des grilles ==== |
| + | Bien que le jeu soit à deux dimensions, je propose d' | ||
| <code python> | <code python> | ||
| - | # tableau 1D | + | vivants |
| - | # exemple pour l' | + | |
| - | vivantes | + | |
| | | ||
| ... | ... | ||
| Ligne 143: | Ligne 175: | ||
| </ | </ | ||
| - | À vous de choisir. À mon avis, la grille 1D vaut mieux. | + | La fonction '' |
| - | <WRAP box> | + | ==== lecture de la grille ==== |
| - | ===== Les fonctions utiles ===== | + | On va vouloir savoir si la cellule à une certaine ligne et une certaine colonne est vivante. Pour cela on doit définir : |
| - | ==== Créer les grilles ==== | + | <code python> |
| + | def vivant(vivants, | ||
| + | """ | ||
| + | renvoie True si la cellule à la position demandée est vivante | ||
| + | si position hors cadre, renvoie False | ||
| + | """ | ||
| + | # à faire | ||
| + | </ | ||
| - | Il serait préférable | + | |
| - | * une grille '' | + | Comme '' |
| + | |||
| + | Remarquez qu'il sera plus commode de pouvoir donner des positions hors grille (vous verrez un peu plus loin pourquoi). Donc dans le cas où la position demandée ne correspond pas à une ligne valide ou une colonne valide, il faut renvoyer '' | ||
| + | |||
| + | ==== voisins vivants ==== | ||
| + | |||
| + | Nous parlons ici de la fonction '' | ||
| + | |||
| + | Par exemple, si je demande ligne 13, colonne 5, je vais faire la somme des positions (12,4), (12,5), (12,6), (13,4), (13,6), (14,4), (14,5), (14,6). | ||
| + | |||
| + | Ces positions contiennent des booléens mais si on demande une somme, les '' | ||
| + | |||
| + | Ce qui vient d' | ||
| + | |||
| + | Voilà pourquoi on a fait ce choix pour la fonction '' | ||
| + | |||
| + | ==== Changement d' | ||
| + | |||
| + | Deux fonctions permettent de changer l' | ||
| + | |||
| + | Ces fonctions doivent modifier l' | ||
| + | |||
| + | Elles doivent aussi modifier l' | ||
| + | |||
| + | ===== Évolution ===== | ||
| + | |||
| + | Je vous propose une approche | ||
| + | |||
| + | La fonction '' | ||
| + | * préparer une liste '' | ||
| + | * parcourir chaque cellule. Grâce aux fonctions '' | ||
| + | * Quand toutes les cellules ont été lues, passer à la modification des cellules : | ||
| + | * mettre à l' | ||
| + | * mettre à l' | ||
| + | |||
| + | <WRAP box> | ||
nsi/tds/jeux/jeu_de_la_vie.1735491527.txt.gz · Dernière modification : de goupillwiki
