bonjour,

J'aurais besoin d'aide, je n'arrive pas a faire une fonction crédible pour la détection des collisions.

voici le code: (les collisions sont dans la section collision )

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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()
Dans le fond, je fais une copie (liste2) de ma première liste (liste) en retirant la cellules actives (pour ne pas la comparer avec elle même), et puis avec un range, je vérifie chaque coordonnées ou se trouve la cellule (imaginer un carré autour de la cellule ou je vérifie chaque point à l'intérieur), si un des points en X et un des points en Y sont dans ma liste2 alors je tue la cellules active.

Malheureusement sa ne semble pas fonctionner, de temps en temps, lorsqu'il y a beaucoup de cellule, on voie des cellules disparaitre pour rien...

J'ai essayer plusieur variante, mais je crois que je n'ai pas une bonne approche... Si quelqu'un a des idées je suis preneur

merci