1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
|
from tkinter import *
from random import randrange as alea
def cellule(posX, posY, liste):
"""Création d'une cellule"""
can.create_oval(posX, posY, posX+10,
posY+10, fill = "red", tag = "Cellule")
numIdent = can.find_withtag("Cellule")
longTuple = len(numIdent)-1
for donnee in ("Cellule"+str(numIdent[longTuple]),0 , 0, posX, posY):
liste.append(donnee)
def moveCellule(nbIdent, liste):
"""Gère les mouvements de la cellule"""
adresse = liste.index("Cellule" + str(nbIdent))
posX1 = alea(-2, 3)
posY1 = alea(-2, 3)
can.move(nbIdent, posX1, posY1)
liste[adresse + 3] += posX1
liste[adresse + 4] += posY1
def reproduction(nbIdent, liste):
"""Gère la reproduction des cellules"""
if "Cellule"+str(nbIdent) in liste:
adresse = liste.index("Cellule" + str(nbIdent))
if liste[adresse+1] == 100:
posAleaX = alea(-20, 21)
posAleaY = alea(-20, 21)
cellule(liste[adresse+3] + posAleaX,
liste[adresse+4] + posAleaY, liste)
liste[adresse+1] = 0
liste[adresse+2] += 1
if liste[adresse+2] == 1:
can.itemconfigure(nbIdent, fill = "dark orange")
if liste[adresse+2] == 2:
can.itemconfigure(nbIdent, fill = "blue")
if liste[adresse+2] == 3:
can.itemconfigure(nbIdent, fill = "purple")
if liste[adresse+2] == 4:
can.delete(nbIdent)
for i in range(0, 5):
del liste[adresse]
else:
liste[adresse+1] += 1
def collision(nbIdent, liste):
"""Gère les collisions entre cellules"""
collision = 0
liste2 = liste[:]
adresse = liste.index("Cellule" + str(nbIdent))
for i in range(0, 5):
del liste2[adresse]
for i in range(liste[adresse+3], liste[adresse+3]+11):
for y in range(liste[adresse+4], liste[adresse+4]+11):
if i in liste2 and y in liste2:
collision = 1
if liste[adresse+3] < 0 or liste[adresse+3] > 590 or liste[adresse+4] < 0 or liste[adresse+4] > 590:
collision = 1
if collision == 1:
can.delete(nbIdent)
for i in range(0, 5):
del liste[adresse]
collision = 0
def gestionCompteur(liste):
"""Affiche le nombre de cellules a l'écran"""
global compteur
nombreCellule = "Nombre de cellules = " + str(int(len(liste)/5))
compteur.configure(text = nombreCellule)
def gestionCellule(liste):
"""Appel toute les fonctions pour une cellule donné"""
for nbIdent in can.find_withtag("Cellule"):
moveCellule(nbIdent, liste)
collision(nbIdent, liste)
reproduction(nbIdent, liste)
def animation():
"""Gère la vitesse d'animation"""
global listeCellule
gestionCellule(listeCellule)
gestionCompteur(listeCellule)
root.after(50, animation)
#----------------------------------------------------------------------------#
listeCellule = []
root = Tk()
compteur = Label(root, text = "Nombre de cellules = 0")
compteur.pack(side = TOP, fill = "x")
can = Canvas(root, bg = "black", width = 600, height = 600)
can.pack()
Button(root, text = "Quit", bg = "light grey",
command = root.destroy).pack(side = BOTTOM, fill = "x")
cellule(300, 300, listeCellule)
animation()
root.mainloop() |
Partager