Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Invité régulier
    Homme Profil pro
    Lyceen
    Inscrit en
    novembre 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lyceen
    Secteur : Service public

    Informations forums :
    Inscription : novembre 2012
    Messages : 30
    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

  2. #2
    Expert Confirmé Sénior
    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    5 238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 5 238
    Points : 7 251
    Points
    7 251

    Par défaut

    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

  3. #3
    Invité régulier
    Homme Profil pro
    Lyceen
    Inscrit en
    novembre 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lyceen
    Secteur : Service public

    Informations forums :
    Inscription : novembre 2012
    Messages : 30
    Points : 5
    Points
    5

    Par défaut

    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" ?

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •