Précédent   Forum du club des développeurs et IT Pro > Autres langages > Python & Zope > Programmation multimédia/Jeux
Programmation multimédia/Jeux Forum d'entraide sur la 2D, 3D, video, son, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 19/11/2012, 11h24   #1
bromy
Invité régulier
 
Homme
Lyceen
Inscription : novembre 2012
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Lyceen
Secteur : Service public

Informations forums :
Inscription : novembre 2012
Messages : 28
Points : 5
Points : 5
Par défaut Rebond balle - changer de couleurs

Bonjour,

J'ai crée un programme python permettant de faire rebondir des balles sur les parois.
J'aimerais maintenant qu'elles changent de couleur a chaque rebonds, j'ai donc crée une variable couleur et je crée une nouvelle balle a chaque rebond, d'une autre couleur.
Il faudrait ensuite détruire l'ancienne balle, seulement je n'ai pas trouver la formule requise, une idée ?

Code :
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
 
# --- Importer les bibliothèques utilisées ---- #
import tkinter as tk    # pour Python 2.x, c'est Tkinter (majuscule initiale)
import random
import time
 
# --- Variables  --- #
w_fen, h_fen = 500, 400 # Dimensions de notre zone graphique.
balle = int(input("Choisissez le nombre de balles"))
x = [random.randint(0,500) for i in range(balle+1)] # Position x aléatoire des balles.
y = [random.randint(0,400) for i in range(balle+1)] # Position y aléatoire des balles.
r = 8 # Rayon de la balle.
n = 0
dx = [random.randint(-5,5) for i in range(balle+1)] # Etape 4 : Rebond aléatoire.
dy = [random.randint(-5,5) for i in range(balle+1)] # Etape 4 : Rebond aléatoire.
 
while n != balle : # Empecher d'avoir le 0 comme valeur et ainsi empecher un non mouvement possible d'une balle.
    if dx[n] == 0 or dy[n] == 0 :
        dx = [random.randint(-5,5) for i in range(balle+1)] # Etape 4 : Rebond aléatoire.
        dy = [random.randint(-5,5) for i in range(balle+1)] # Etape 4 : Rebond aléatoire.
        n = - 1
    n = n + 1
n = 1
 
flag = 1
 
Couleur = ["red","yellow","orange","blue","black","white","green","pink"]
 
# --- Fonctions de modification de l'interface graphique --- #
def fin(event=None): # Fermeture de la fenetre à l'appui de la touche Shift-Controle-End.
    fen.destroy()
def arret(event=None): # Arret des mouvements à l'appui de la touche Espace.
    global flag
    flag = 0
def reprise(event=None): # Demarrage des mouvements à l'appui de la touche Entrée.
    global flag
    flag = 1
def cercle(x, y, r, nom = n): #Fonction cercle
    a = x - r
    b = y - r
    c = x + r
    d = y + r 
    return can.create_oval((a,b,c,d), fill=Couleur[Ale], outline="black", tag = nom)
 
 
# --- Fenêtre principale --- #
fen = tk.Tk()           # Crée la fenêtre principale de l'application.
fen.title("Boules & Billes...")
 
tit = tk.Label(fen, text="Boules & Billes :")       # Un petit titre...
tit.pack(side=tk.TOP)
 
can = tk.Canvas(fen)    # Puis une surface 'pour dessiner' à l'intérieur.
can.configure(width=w_fen, height=h_fen, bg='white')
can.pack(side=tk.TOP)
 
# --- COMMANDES --- # 
boutQuit=tk.Button(fen, text="Quitter", command=fin).pack(side=tk.BOTTOM)
fen.bind("<Shift-Control-End>", fin)
fen.bind("<Return>",reprise)
fen.bind("<space>",arret)
 
 
# --- PARTIE PRINCIPALE DU CODE --- #
 
while n!=balle +1 : # Affichage des cercles.
    Ale = random.randint(0,6)
    cercle(x[n],y[n],r) 
    n = n + 1
n = 1 # Remise de n a 0 pour commencer le mouvement des balles 1 par une.
fen.update()
while 1 : # Boucle infinie.
    while flag == 0 : # Boucle si les mouvements sont arretés.
        fen.update()
        fen.after(10)
 
    while flag == 1 : # Boucle si les mouvements sont demarrés.
 
    # --- GESTION DU MOUVEMENT --- #
        can.move(n,dx[n],dy[n]) # Déplacement de la balle selon dx et dy.
        fen.update()  # Actualisation de la fenetre graphique.
        fen.after(10) # Vitesse de la balle.
 
    # --- GESTION DES REBONDS SUR LES BORDS --- #
        if 490 < x[n] < 505 or -5 < x[n] < 10 : # Si la balle touche le bord en x ...
            dx[n] = -dx[n]# Gestion du rebord en prenant l'inverse de dx pour un rebond coherent.
            # ICI PROBLEME
            Ale = random.randint(0,6)
            cercle(x[n],y[n],r)
        if 390 < y[n] < 405 or -5 < y[n] < 10 : # Si la balle touche le bord en y ...
            dy[n] = -dy[n] # Gestion du rebord en prenant l'inverse de dy pour un rebond coherent.
            # ICI PROBLEME
            Ale = random.randint(0,6)
            cercle(x[n],y[n],r)
        y[n] = y[n] + dy[n] # Incrementation de dy sur y.
        x[n] = x[n] + dx[n] # Incrementation de dx sur x.
 
        if n == (balle): # Si on a fait bouger toute les balles une fois ... 
            n = -1 # ... On reinitialise n pour recommencer une boucle.
        n = n + 1 
        col = 1
 
    # --- GESTION DES COLLISIONS --- #
        while col != balle :
            if x[col] + 4 > x[n] > x[col] - 4 and y[col] + 4 > y[n] > y[col] - 4 and n != col :
                dy[col] = -dy[col]
                dx[col] = -dx[col]
                can.move(n,dx[col],dy[col])
                dx[n] = -dx[n]
                dy[n] = -dy[n]
                can.move(n,dx[n],dy[n])
                col = balle - 1
            col = col + 1
 
# ------------------------------------ #
 
fen.mainloop()
Bonne journée
Bromy
bromy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2012, 13h34   #2
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 690
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 690
Points : 4 518
Points : 4 518
Salut,

Vous avez eu la bonne idée d'utiliser tag=n dans .create_oval(..., tag=n).
C'est ce "n" auquel vous appliquez .move.

Pourquoi ne pas l'utiliser pour .delete, .itemconfig(..., fill=color)?

Vous pourriez aussi créer une classe Balle pour y regrouper attributs et méthodes associés. Passer par un tas de tableau x, y, dx, dy fonctionne, mais n'aide pas trop à comprendre ce qu'il se passe dans votre code.

- W
__________________
Architectures Post-Modernes
wiztricks est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2012, 19h13   #3
bromy
Invité régulier
 
Homme
Lyceen
Inscription : novembre 2012
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Lyceen
Secteur : Service public

Informations forums :
Inscription : novembre 2012
Messages : 28
Points : 5
Points : 5
Je débute en python dans le cadre scolaire, qu'entendez vous par Classe balle ?
Comment gérer les mouvements de toutes mes balles sans utiliser la notation "n" ?
bromy est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 16h01.


 
 
 
 
Partenaires

Hébergement Web