IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

Jeu de labyrinthe - Animation d'une balle.


Sujet :

Tkinter Python

  1. #61
    Nouveau membre du Club
    Homme Profil pro
    Travail
    Inscrit en
    Avril 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Travail

    Informations forums :
    Inscription : Avril 2014
    Messages : 45
    Points : 34
    Points
    34
    Par défaut
    J'ai rajouté toutes mes questions dans le code :



    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
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
     
    # -*- coding: utf-8 -*-
     
    from Tkinter import *
     
    import tkMessageBox
     
    from partie1_coord_droite_finie import est_dans_polygone
     
     
    def animation_de_depart():
        global X, Y
        if X <= x2 and Y <= y2:
            X += sx * dep       #je vais essayer de modifier ca suivant vos
            Y += sy * dep       #indications je n'ai pas encore eu le temps de me pencher
            can1.move(cerc1, sx * dep, sy * dep) #dessus
            can1.after(100, animation_de_depart)
        else:
            move()
     
    def move():
        # la balle a-t-elle heurté quelque chose ?
        if len(can1.find_overlapping(*can1.bbox(cerc1))) > 1:
            # oui, la partie se termine
            game_over()
        # non, tout va bien, on continue
        else:
            can1.move(cerc1, sx * dep, sy * dep)
            can1.after(100, move)
     
    def bravo():    
        left = can1.winfo_reqwidth() // 2    #j'ai modifié bravo de manière à
        top = can1.winfo_reqheight() // 2    #ce qu'on y trouve que les elements voulus
        can1.create_text(
            left, top - 40,
            text="GG!",
            font="sans 24 bold",
            fill="gold",
        )
     
    def fin():  #voila la fonction de fin séparée de pravo 
        if est_dans_polygone([X,Y],r, carre1[0], carre1[1]):
            bravo()
            can1.bind_all("<p>", passer_de_niveau()) 
          #j'ai utilisé cette comande pour passer de niveau mais est ce correct?
          #
     
    def game_over():
        # la partie est finie !
        left = can1.winfo_reqwidth() // 2
        top = can1.winfo_reqheight() // 2
        can1.create_text(
            left, top - 40,
            text="GAME OVER!",
            font="sans 24 bold",
            fill="gold",
        )
     
    def passer_de_niveau():  #voila la grosse fonction associée au nouveau parcours :)
        "parcours numéro 2"
     
        can1.delete(ALL)    #l'effacement rester toujours a sa place
     
        can1.create_rectangle(50,50,100,100) #dessine un rectangle
        can1.create_rectangle(370,370,420,420)
        polygone1 = [100,65,420,65], [100,85,400,85]    
        can1.create_line(tuple(polygone1[0]),fill='blue',width=4)#ligne 1
        can1.create_line(tuple(polygone1[1]),fill='blue',width=4)#ligne 2
        can1.create_line(400,85,400,130,fill='blue',width=4)#ligne 3
        can1.create_line(420,65,420,150,fill='blue',width=4)#ligne 4
        can1.create_line(170,150,420,150,fill='blue',width=4)#ligne 5
        can1.create_line(150,130,400,130,fill='blue',width=4)#ligne 6
        can1.create_line(150,130,150,190,fill='blue',width=4)#ligne 7
        can1.create_line(170,150,170,220,fill='blue',width=4)#ligne 8
        can1.create_line(60,220,170,220,fill='blue',width=4)#ligne 9
        can1.create_line(30,190,150,190,fill='blue',width=4)#ligne 10
        can1.create_line(30,190,30,480,fill='blue',width=4)#ligne 11
        can1.create_line(60,220,60,450,fill='blue',width=4)#ligne 12
        can1.create_line(60,450,250,450,fill='blue',width=4)#ligne 13
        can1.create_line(30,480,270,480,fill='blue',width=4)#ligne 14
        can1.create_line(270,480,270,330,fill='blue',width=4)#ligne 15
        can1.create_line(250,450,250,310,fill='blue',width=4)#ligne 16
        can1.create_line(270,330,380,330,fill='blue',width=4)#ligne 17
        can1.create_line(250,310,400,310,fill='blue',width=4)#ligne 18
        can1.create_line(400,310,400,370,fill='blue',width=4)#ligne 19
        can1.create_line(380,330,380,370,fill='blue',width=4)#ligne 20
     
        cerc2 = can1.create_oval(X, Y, X + diametre, Y + diametre, fill='grey')
        #j'ai défini la balle de cette manière (en reprennant celle faite précédemment)
        #mais du coup si on utilise cette appellation , cela va poser problème dans
        #les fonctions qui ne seront pas adaptées à cerc1 et cerc2 non?
     
        X = (x1 + x2 - diametre) / 2
        Y = (y1 + y2 - diametre) / 2
     
           #vous me parlez d'utiliser une seule et meme fonction "init_parcours" mais 
           #je ne comprends pas vraiment comment?  
           #vous pensez qu'il faudrait en fait metre les deux parcours dans la meme fonction
           # et en quelque sorte faire le résonnement que l'on fait dans en plusieurs parties 
           #en une seule (je ne suis peut etre pas tres clair)
     
            # grâce à une seule et même fonction init_parcours(carre_depart, parcours, carre_final) ?
     
    def dep1_gauche(event=None):
        global sx, sy
        sx = -1
        sy = 0
     
    def dep1_droite(event=None):
        global sx, sy
        sx = 1
        sy = 0
     
    def dep1_haut(event=None):
        global sy, sx
        sy = -1
        sx = 0
     
    def dep1_bas(event=None):
        global sy, sx
        sy = 1
        sx = 0
     
    def start_it():
        global flag # utile ?
        flag = not flag # utile ?
        animation_de_depart()
     
     
     #j'ai enlevé la fonction pause qui comme vous le dites devient inutile.
     
     
    # les variables suivantes seront utilisees de maniere globale:
     
    dep = 5         # valeur de deplacement
    sx, sy = 1, 0   # sens de deplacement
     
     
    # carre de depart
    x1, y1 = 50, 50
    x2, y2 = 100, 100
     
    # diametre balle
    diametre = 10
     
    # coordonnees initiales de la balle
    X = (x1 + x2 - diametre) / 2
    Y = (y1 + y2 - diametre) / 2
     
    # Creation du widget principal ("maitre"):
    fen1 = Tk()
    fen1.title("Super Ball")
     
    # creation des widgets "esclaves":
    can1 = Canvas(fen1, bg='white', height=500, width=500)
    can1.pack(side=LEFT)
     
    # dessin parcours no. 1
    can1.create_rectangle(x1, y1, x2, y2) # dessine un rectangle
    can1.create_rectangle(120, 280, 170, 335)
    polygone1 = [100, 65, 420, 65], [100, 85, 400, 85]
    can1.create_line(*polygone1[0], fill='red', width=4) # ligne 1
    can1.create_line(*polygone1[1], fill='red', width=4) # ligne 2
    can1.create_line(400, 84, 400, 300, fill='red', width=4) # ligne 3
    can1.create_line(420, 65, 420, 320, fill='red', width=4) # ligne 4
    can1.create_line(170, 320, 420, 320, fill='red', width=4) # ligne 5
    can1.create_line(170, 300, 400, 300, fill='red', width=4) # ligne 5
     
    # dessin balle
    cerc1 = can1.create_oval(X, Y, X + diametre, Y + diametre, fill='grey')
     
    # balle au premier plan d'affichage
    can1.tag_raise(cerc1, ALL)
     
    # boutons à cliquer
    Button(fen1, text='Demarrer', command=start_it).pack(side=BOTTOM)
    Button(fen1, text='Quitter', command=fen1.destroy).pack(side=BOTTOM)
    Button(fen1, text='Gauche',command=dep1_gauche).pack()
    Button(fen1, text='Droite', command=dep1_droite).pack()
    Button(fen1, text='Haut', command=dep1_haut).pack()
    Button(fen1, text='Bas', command=dep1_bas).pack()
    Button(fen1, text='Accelere!', command=start_it).pack(side=BOTTOM)
     
    # touches du clavier
    can1.bind_all("<z>", dep1_haut)
    can1.bind_all("<s>", dep1_bas)
    can1.bind_all("<d>", dep1_droite)
    can1.bind_all("<q>", dep1_gauche)
     
    # flèches du clavier
    can1.bind_all("<Up>", dep1_haut)
    can1.bind_all("<Down>", dep1_bas)
    can1.bind_all("<Left>", dep1_gauche)
    can1.bind_all("<Right>", dep1_droite)
     
    #la fenetre d'acceuil était un petit bonnus que j'ai trouvé en cherchant des infos
    #sur internet je l'ai juste rajoutée pour faire un test
    #comme vous le dite je m'y repencherais plus tard ;)
     
    # démarrage du gestionnaire d'événements (boucle principale):
    fen1.mainloop()
    Merci encore

  2. #62
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par FatP0ney Voir le message
    J'ai rajouté toutes mes questions dans le code :

    Merci encore
    je vois qu'on progresse !

    Pour la fonction animation_de_depart(), je vous donne un indice : la solution est hyper simple, n'allez pas chercher midi à 14 heures.

    Pour la fonction fin(), c'est NON : votre test doit se dérouler ailleurs, réfléchissez bien...

    Pour la fonction bravo() : vous affichez les félicitations mais où est passée la suite (bouton "parcours suivant", par exemple) ?

    Pour la fonction passer_de_niveau() : pourquoi créer une variable cerc2 ? Avec tout ce que je vous embrouille le cerveau à longueur de journée, vous ne savez plus réutiliser cerc1 tout simplement ?

    En plus, vous calculez les coordonnées initiales de la balle APRÈS avoir créé la balle, vous ?

    Quel intérêt ?

    Pour votre remarque en fin de fonction passer_de_niveau() : non, observez à quel point la procédure de dessin de chaque parcours se ressemble.

    Il est donc peut-être possible de créer une fonction générique init_parcours(carre_depart, parcours, carre_final) qui s'occuperait de :

    1. effacer le canevas
    2. tracer le carré de départ à partir des coordonnées fournies par le paramètre carre_depart sous la forme d'un tuple e.g. init_parcours((xd0, yd0, xd1, yd1), ...)
    3. initialiser les variables globales x1, y1, x2, y2 avec les valeurs du paramètre-tuple carre_depart
    4. tracer les polygones à partir des coordonnées fournies par le paramètre parcours, qui serait alors une liste de tuples de coordonnées de segments de droites tels que vous les utilisez en ce moment
    5. tracer le carré final d'arrivée à partir des coordonnées fournies par le paramètre carre_final qui serait lui aussi un tuple e.g. init_parcours(..., ..., (xf0, yf0, xf1, yf1))
    6. calculer les coordonnées initiales de la balle avec X et Y les variables globales que vous utilisez déjà
    7. tracer la balle cerc1
    8. passer la balle au premier plan d'affichage


    Bon, je crois que j'ai fait le tour.

    Traitez un seul problème à la fois : cela ira plus vite au final.

    @+.

  3. #63
    Nouveau membre du Club
    Homme Profil pro
    Travail
    Inscrit en
    Avril 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Travail

    Informations forums :
    Inscription : Avril 2014
    Messages : 45
    Points : 34
    Points
    34
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Pour la fonction fin(), c'est NON : votre test doit se dérouler ailleurs, réfléchissez bien...
    Au début je l'avais placé dans bravo ce qui n'allait pas comme vous me l'aviez spécifié j'avais donc sorti ca dans une nouvelle fonction ( fin() ) pour essayer de reproduire ce que vous m'aviez conseillé en commentaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        #   if dans_carre_final(XY, r, carre_final[0], carre_final[1]):
        #       bravo()
        #   ...etc...
        #   # fin if
    J'ai essayé de le mettre dans une autre fonction mais j'ai beau chercher je ne trouve pas dans laquelle... Pourriez vous donc me donner un dernier indice sur ce point : faut il la mettre dans une fonction déja existante ou à part ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Pour la fonction bravo() : vous affichez les félicitations mais où est passée la suite (bouton "parcours suivant", par exemple) ?
    En fait j'ai essayé de reproduire ce que l'on avait fait pour faire marcher les touches du clavier : utiliser "fen1.bind_all("<z>", dep1_haut)" mais adapté au passage du niveau ce que j'avais placé dans la fonction "fin" :

    est-ce-que cela convient si je le place dans bravo?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    can1.bind_all("<p>", passer_de_niveau())
    En plus, vous calculez les coordonnées initiales de la balle APRÈS avoir créé la balle, vous ?
    erreur d'inatention ca ne se reproduira plus monsieur

    Il est donc peut-être possible de créer une fonction générique init_parcours(carre_depart, parcours, carre_final)
    A ce propos je crois que je vais avoir besoin d'un peu de temps pour étudier tout cela ... à première lecture ca ne me parait pas forcément hyper simple et comme vous le dites il vaut mieux faire une chose à la fois. Je vais donc d'abord me pencher sur les problèmes précédents avant d'attaquer ce dernier

    EDIT : je continue encore un peu de réfléchir sur le problème avant de me remettre à d'autres matières et je me disais qu'il faudrait peut être mettre ce que j'avais appellé la fonction "fin" dans le move()... en tout cas c'est ce qui me semble le plus cohérent pour le moment... Dr. Watson still trying to find proofs

  4. #64
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par FatP0ney Voir le message
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Pour la fonction fin(), c'est NON : votre test doit se dérouler ailleurs, réfléchissez bien...
    Au début je l'avais placé dans bravo ce qui n'allait pas comme vous me l'aviez spécifié j'avais donc sorti ca dans une nouvelle fonction ( fin() ) pour essayer de reproduire ce que vous m'aviez conseillé en commentaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        #   if dans_carre_final(XY, r, carre_final[0], carre_final[1]):
        #       bravo()
        #   ...etc...
        #   # fin if
    J'ai essayé de le mettre dans une autre fonction mais j'ai beau chercher je ne trouve pas dans laquelle... Pourriez vous donc me donner un dernier indice sur ce point : faut il la mettre dans une fonction déja existante ou à part ?
    Petite note en passant : pour citer un texte, vous avez un bouton qui ressemble à une bulle de BD à gauche du bouton "#" dans votre éditeur de messages du forum.

    Cela correspond aux balises phpBB [QUOTE] texte à citer [/QUOTE].

    Voir ici : http://www.developpez.net/forums/mis...o=bbcode#quote

    Sinon on a l'impression que vous citez des bouts de code alors que c'est du texte simple.

    Indice no. 1 : dans une fonction déjà existante.

    Indice no. 2 : si la balle doit s'inquiéter de ne pas heurter un mur, pourquoi ne se soucierait-elle pas aussi de savoir quand elle est arrivée à bon port ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Pour la fonction bravo() : vous affichez les félicitations mais où est passée la suite (bouton "parcours suivant", par exemple) ?
    En fait j'ai essayé de reproduire ce que l'on avait fait pour faire marcher les touches du clavier : utiliser "fen1.bind_all("<z>", dep1_haut)" mais adapté au passage du niveau ce que j'avais placé dans la fonction "fin" :

    est-ce-que cela convient si je le place dans bravo?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    can1.bind_all("<p>", passer_de_niveau())
    Si déjà, c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    can1.bind_all("<p>", passer_de_niveau) # sans les parenthèses d'appel de fonction /!\
    Oui, c'est en effet parfaitement jouable.

    Mais je me demande si ce sera bien clair pour le joueur (faudra-t-il se placer dans le dos de chaque joueur pour lui dire que pour passer au parcours suivant, il doit appuyer sur "P") ?

    Est-ce qu'il ne serait pas plus EXPLICITE d'afficher un bouton qui dit ce que l'on peut faire à ce moment-là ? (sans parler des effets de bord que vous rencontrerez avec w.bind_all() par la suite)

    A ce propos je crois que je vais avoir besoin d'un peu de temps pour étudier tout cela ... à première lecture ca ne me parait pas forcément hyper simple et comme vous le dites il vaut mieux faire une chose à la fois. Je vais donc d'abord me pencher sur les problèmes précédents avant d'attaquer ce dernier
    N'oubliez pas aussi de résoudre le problème de trajectoire de animation_de_depart().
    Dernière modification par Invité ; 28/04/2014 à 08h39. Motif: complément d'information

  5. #65
    Nouveau membre du Club
    Homme Profil pro
    Travail
    Inscrit en
    Avril 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Travail

    Informations forums :
    Inscription : Avril 2014
    Messages : 45
    Points : 34
    Points
    34
    Par défaut
    Est-ce qu'il ne serait pas plus EXPLICITE d'afficher un bouton qui dit ce que l'on peut faire à ce moment-là ? (sans parler des effets de bord que vous rencontrerez avec w.bind_all() par la suite)
    Effectivement vous avez raison! J'ai donc changé cela en m'inspirant de ce que j'avais déja fait pour les boutons dédiés au déplacement en l'insérant dans la fonction bravo !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Button(fen1, text='Niveau suivant', command=passer_de_niveau).pack(side=BOTTOM)
    Je me suis (enfin) penché sur le problème de la fonction animation_de_depart mais je n'ai pas encore trouvé de solution pour remplacer ces deux lignes la
    de manière à les rendres indépendantes des valeurs de sx et sy promit je me remet à la recherche d'une solution des que possible

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            X += sx * dep      
            Y += sy * dep
    En fait j'avais édité mon post précédent un peu plus tard dans mon après-midi en proposant une réponse :

    EDIT : je continue encore un peu de réfléchir sur le problème avant de me remettre à d'autres matières et je me disais qu'il faudrait peut être mettre ce que j'avais appellé la fonction "fin" dans le move()... en tout cas c'est ce qui me semble le plus cohérent pour le moment... Dr. Watson still trying to find proofs
    Je vous envoie donc le code modifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    def move():
        # la balle a-t-elle heurté quelque chose ?
        if len(can1.find_overlapping(*can1.bbox(cerc1))) > 1:
            # oui, la partie se termine
            game_over()
        # non, tout va bien, on continue
        else:
            can1.move(cerc1, sx * dep, sy * dep)
            can1.after(100, move)
     
        if est_dans_polygone([X,Y],r, carre1[0], carre1[1]):
            bravo()
    @ plouche!

  6. #66
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par FatP0ney Voir le message
    Effectivement vous avez raison! J'ai donc changé cela en m'inspirant de ce que j'avais déja fait pour les boutons dédiés au déplacement en l'insérant dans la fonction bravo !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Button(fen1, text='Niveau suivant', command=passer_de_niveau).pack(side=BOTTOM)
    Oui, vous pouvez faire comme ça, mais moi j'aimerais que vous affichiez ce bouton dans le canevas, juste en-dessous du texte "Bravo !"

    Allez, c'est l'occasion d'apprendre qq chose de nouveau avec les canevas, je vous donne un indice :

    http://infohost.nmt.edu/tcc/help/pub...te_window.html

    Lisez bien attentivement, vous allez trouver comment adapter cela à un Button().

    Je me suis (enfin) penché sur le problème de la fonction animation_de_depart mais je n'ai pas encore trouvé de solution pour remplacer ces deux lignes la
    de manière à les rendres indépendantes des valeurs de sx et sy promit je me remet à la recherche d'une solution des que possible

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            X += sx * dep      
            Y += sy * dep
    La solution n'est pas dans ces lignes de code.

    L'écriture de la solution est vraiment hyper simple, ceci dit, le raisonnement qui mène à l'écriture de la solution ne l'est pas forcément.

    En revanche, ce raisonnement vous permettra de découvrir encore une nouveauté en matière de programmation.


    En fait j'avais édité mon post précédent un peu plus tard dans mon après-midi en proposant une réponse :

    Je vous envoie donc le code modifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    def move():
        # la balle a-t-elle heurté quelque chose ?
        if len(can1.find_overlapping(*can1.bbox(cerc1))) > 1:
            # oui, la partie se termine
            game_over()
        # non, tout va bien, on continue
        else:
            can1.move(cerc1, sx * dep, sy * dep)
            can1.after(100, move)
     
        if est_dans_polygone([X,Y],r, carre1[0], carre1[1]):
            bravo()
    @ plouche!
    Vous y êtes presque !

    Relisez votre code et essayez de vous mettre à la place de l'ordinateur en vous imaginant l'exécution du code pas à pas dans la tête.

    Comme ces aviateurs acrobates qui répètent leurs mouvements dans la tête, essayez de tracer ce qui n'irait pas.

    En attendant, d'un point de vue algorithmique théorique, moi j'aurais écrit ce test comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SI
        dans carré final
    ALORS
        joueur a gagné
    SINON SI
        heurte une paroi
    ALORS
        joueur a perdu
    SINON
        bouger la balle
    FIN SI
    Est-ce que vous voyez mieux ce qui ne va pas dans votre code actuellement ?

  7. #67
    Nouveau membre du Club
    Homme Profil pro
    Travail
    Inscrit en
    Avril 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Travail

    Informations forums :
    Inscription : Avril 2014
    Messages : 45
    Points : 34
    Points
    34
    Par défaut
    Bonjour,

    Oui, vous pouvez faire comme ça, mais moi j'aimerais que vous affichiez ce bouton dans le canevas, juste en-dessous du texte "Bravo !"

    Allez, c'est l'occasion d'apprendre qq chose de nouveau avec les canevas, je vous donne un indice :

    http://infohost.nmt.edu/tcc/help/pub...te_window.html

    Lisez bien attentivement, vous allez trouver comment adapter cela à un Button().
    Voila je pense avoir fait ce qui fallait après avoir lut la doc
    ps : le bouton est dans la fonction bravo()
    Est-ce-que cela vous semble correct?

    La solution n'est pas dans ces lignes de code.

    L'écriture de la solution est vraiment hyper simple, ceci dit, le raisonnement qui mène à l'écriture de la solution ne l'est pas forcément.

    En revanche, ce raisonnement vous permettra de découvrir encore une nouveauté en matière de programmation.
    Snif... L'inspiration ne me viens pas vraiment sur ce coup... Je vais encore un peu fouiner et chercher un peu plus pour trouver quelque chose! Je vais y arriver je vous le promet mais compte tenu du peu de temps que j'ai en ce moment, je n'ai pas encore prit le temps de vraiment me concentrer dessus et d'appliquer votre méthode de raisonnement ...

    Vous y êtes presque !

    Relisez votre code et essayez de vous mettre à la place de l'ordinateur en vous imaginant l'exécution du code pas à pas dans la tête.

    Comme ces aviateurs acrobates qui répètent leurs mouvements dans la tête, essayez de tracer ce qui n'irait pas.

    En attendant, d'un point de vue algorithmique théorique, moi j'aurais écrit ce test comme suit :
    Avec une telle remarque vous étiez sur de toucher un passionné d'aviation comme moi
    J'ai appliqué vos remarques au code que je vous poste EN ENTIER ci dessous :

    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
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
     
    !/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    from Tkinter import *
    from partie1_coord_droite_finie import est_dans_polygone
     
     
    def animation_de_depart():
        global X, Y
        if X <= x2 and Y <= y2:
            X += sx * dep      
            Y += sy * dep       
            can1.move(cerc1, sx * dep, sy * dep) 
            can1.after(100, animation_de_depart)
        else:
            move()
     
    def move():
        #Si la balle est dans le carré final alors :
        if est_dans_polygone([X,Y],r, carre1[0], carre1[1]):
            bravo()
        #si la balle touche un coté alors :    
        elif len(can1.find_overlapping(*can1.bbox(cerc1))) > 1:
            # oui, la partie se termine
            game_over()
        # non, tout va bien, on continue
        else:
            can1.move(cerc1, sx * dep, sy * dep)
            can1.after(100, move)
     
    def bravo():    
        global Widget_Bouton
        left = can1.winfo_reqwidth() // 2    
        top = can1.winfo_reqheight() // 2    
        can1.create_text(
            left, top - 40,
            text="Bravo!",
            font="sans 24 bold",
            fill="gold",
        )
     
        Widget_Bouton = can1.create_window(400,400, fen1, bg='white')
        Widget_Bouton = Button(fen1, text='Niveau suivant', command=passer_de_niveau).pack
     
     
    def game_over():
        # la partie est finie !
        left = can1.winfo_reqwidth() // 2
        top = can1.winfo_reqheight() // 2
        can1.create_text(
            left, top - 40,
            text="GAME OVER!",
            font="sans 24 bold",
            fill="gold",
        )
     
    def passer_de_niveau():  
        global X, Y, cerc1
     
        "parcours numéro 2"
     
        can1.delete(ALL)
     
        can1.create_rectangle(50,50,100,100) #dessine un rectangle
        can1.create_rectangle(370,370,420,420)
     
        #trace du nouveau parcours :
        polygone1 = [100,65,420,65], [100,85,400,85]    
        can1.create_line(tuple(polygone1[0]),fill='blue',width=4)#ligne 1
        can1.create_line(tuple(polygone1[1]),fill='blue',width=4)#ligne 2
        can1.create_line(400,85,400,130,fill='blue',width=4)#ligne 3
        can1.create_line(420,65,420,150,fill='blue',width=4)#ligne 4
        can1.create_line(170,150,420,150,fill='blue',width=4)#ligne 5
        can1.create_line(150,130,400,130,fill='blue',width=4)#ligne 6
        can1.create_line(150,130,150,190,fill='blue',width=4)#ligne 7
        can1.create_line(170,150,170,220,fill='blue',width=4)#ligne 8
        can1.create_line(60,220,170,220,fill='blue',width=4)#ligne 9
        can1.create_line(30,190,150,190,fill='blue',width=4)#ligne 10
        can1.create_line(30,190,30,480,fill='blue',width=4)#ligne 11
        can1.create_line(60,220,60,450,fill='blue',width=4)#ligne 12
        can1.create_line(60,450,250,450,fill='blue',width=4)#ligne 13
        can1.create_line(30,480,270,480,fill='blue',width=4)#ligne 14
        can1.create_line(270,480,270,330,fill='blue',width=4)#ligne 15
        can1.create_line(250,450,250,310,fill='blue',width=4)#ligne 16
        can1.create_line(270,330,380,330,fill='blue',width=4)#ligne 17
        can1.create_line(250,310,400,310,fill='blue',width=4)#ligne 18
        can1.create_line(400,310,400,370,fill='blue',width=4)#ligne 19
        can1.create_line(380,330,380,370,fill='blue',width=4)#ligne 20
     
        X = (x1 + x2 - diametre) / 2
        Y = (y1 + y2 - diametre) / 2
     
        cerc1 = can1.create_oval(X, Y, X + diametre, Y + diametre, fill='grey')
     
     
     
    def dep1_gauche(event=None):
        global sx, sy
        sx = -1
        sy = 0
     
    def dep1_droite(event=None):
        global sx, sy
        sx = 1
        sy = 0
     
    def dep1_haut(event=None):
        global sy, sx
        sy = -1
        sx = 0
     
    def dep1_bas(event=None):
        global sy, sx
        sy = 1
        sx = 0
     
    def start_it():
        animation_de_depart()
     
     
     
    # les variables suivantes seront utilisees de maniere globale:
     
    dep = 5         # valeur de deplacement
    sx, sy = 1, 0   # sens de deplacement
     
     
    # carre de depart
    x1, y1 = 50, 50
    x2, y2 = 100, 100
     
    # diametre balle
    diametre = 10
     
    # coordonnees initiales de la balle
    X = (x1 + x2 - diametre) / 2
    Y = (y1 + y2 - diametre) / 2
     
    # Creation du widget principal ("maitre"):
    fen1 = Tk()
    fen1.title("Super Ball")
     
    # creation des widgets "esclaves":
    can1 = Canvas(fen1, bg='white', height=500, width=500)
    can1.pack(side=LEFT)
     
    # dessin parcours no. 1
    can1.create_rectangle(x1, y1, x2, y2) # dessine un rectangle
    can1.create_rectangle(120, 280, 170, 335)
    polygone1 = [100, 65, 420, 65], [100, 85, 400, 85]
    can1.create_line(*polygone1[0], fill='red', width=4) # ligne 1
    can1.create_line(*polygone1[1], fill='red', width=4) # ligne 2
    can1.create_line(400, 84, 400, 300, fill='red', width=4) # ligne 3
    can1.create_line(420, 65, 420, 320, fill='red', width=4) # ligne 4
    can1.create_line(170, 320, 420, 320, fill='red', width=4) # ligne 5
    can1.create_line(170, 300, 400, 300, fill='red', width=4) # ligne 5
     
    # dessin balle
    cerc1 = can1.create_oval(X, Y, X + diametre, Y + diametre, fill='grey')
     
    # balle au premier plan d'affichage
    can1.tag_raise(cerc1, ALL)
     
    # boutons à cliquer
    Button(fen1, text='Demarrer', command=start_it).pack(side=BOTTOM)
    Button(fen1, text='Quitter', command=fen1.destroy).pack(side=BOTTOM)
    Button(fen1, text='Gauche',command=dep1_gauche).pack()
    Button(fen1, text='Droite', command=dep1_droite).pack()
    Button(fen1, text='Haut', command=dep1_haut).pack()
    Button(fen1, text='Bas', command=dep1_bas).pack()
    Button(fen1, text='Accelere!', command=start_it).pack(side=BOTTOM)
     
    # touches du clavier
    can1.bind_all("<z>", dep1_haut)
    can1.bind_all("<s>", dep1_bas)
    can1.bind_all("<d>", dep1_droite)
    can1.bind_all("<q>", dep1_gauche)
     
    # flèches du clavier
    can1.bind_all("<Up>", dep1_haut)
    can1.bind_all("<Down>", dep1_bas)
    can1.bind_all("<Left>", dep1_gauche)
    can1.bind_all("<Right>", dep1_droite)
     
     
    # démarrage du gestionnaire d'événements (boucle principale):
    fen1.mainloop()
    Ps : veuillez excuser le délai entre mes réponse qui est plus long qu'à l'habitude à cause la reprise des cours ...
    Bonne soirée!

  8. #68
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par FatP0ney Voir le message
    Bonjour,

    Voila je pense avoir fait ce qui fallait après avoir lut la doc
    ps : le bouton est dans la fonction bravo()
    Est-ce-que cela vous semble correct?
    Bonjour,

    Ce n'est pas moi qu'il faut convaincre, mais votre ordinateur.

    Faites-lui faire un test pour en avoir le coeur net :

    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
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    from Tkinter import *
    from partie1_coord_droite_finie import est_dans_polygone
     
    ...etc... (snip) (snip)
     
    def bravo():
        global Widget_Bouton
        left = can1.winfo_reqwidth() // 2
        top = can1.winfo_reqheight() // 2
        can1.create_text(
            left, top - 40,
            text="Bravo!",
            font="sans 24 bold",
            fill="gold",
        )
        Widget_Bouton = can1.create_window(400,400, fen1, bg='white')
        Widget_Bouton = Button(fen1, text='Niveau suivant', command=passer_de_niveau).pack
     
    ...etc... (snip) (snip)
     
    # placez juste avant fen1.mainloop() pour tester
    bravo()
     
    # démarrage du gestionnaire d'événements (boucle principale):
    fen1.mainloop()
    Gardez ceci sous le coude, je crois que nous allons en avoir besoin :

    http://infohost.nmt.edu/tcc/help/pub...te_window.html

    Et peut-être même revoir quelques fondamentaux.

    Snif... L'inspiration ne me viens pas vraiment sur ce coup... Je vais encore un peu fouiner et chercher un peu plus pour trouver quelque chose! Je vais y arriver je vous le promet mais compte tenu du peu de temps que j'ai en ce moment, je n'ai pas encore prit le temps de vraiment me concentrer dessus et d'appliquer votre méthode de raisonnement ...
    Ça va, ça va !

    Je vous donne des indices :

    Indice no. 1 : il faudra marquer sx, sy, dep dans 3 endroits précis de votre code;

    Indice no. 2 : je vous donne le premier endroit, à vous de trouver les deux autres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    def start_it():
        animation_de_depart(sx, sy, dep)
    Avec une telle remarque vous étiez sur de toucher un passionné d'aviation comme moi
    J'ai appliqué vos remarques au code que je vous poste EN ENTIER ci dessous :
    (snip)(snip)
    Rigolure ! Faites péter le Cessna ! +1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def move():
        #Si la balle est dans le carré final alors :
        if est_dans_polygone([X,Y],r, carre1[0], carre1[1]):
            bravo()
        #si la balle touche un coté alors :
        elif len(can1.find_overlapping(*can1.bbox(cerc1))) > 1:
            # oui, la partie se termine
            game_over()
        # non, tout va bien, on continue
        else:
            can1.move(cerc1, sx * dep, sy * dep)
            can1.after(100, move)
    Bon, on touche au but.

    Reste à vérifier ce que valent les paramètres [X,Y],r, carre1[0], carre1[1] de est_dans_polygone() et ce, à tout moment de l'exécution de move().

    Ps : veuillez excuser le délai entre mes réponse qui est plus long qu'à l'habitude à cause la reprise des cours ...
    Bonne soirée!
    Y a pas de souci : on est sur un forum, on a tout le temps.

  9. #69
    Nouveau membre du Club
    Homme Profil pro
    Travail
    Inscrit en
    Avril 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Travail

    Informations forums :
    Inscription : Avril 2014
    Messages : 45
    Points : 34
    Points
    34
    Par défaut
    Bonsoir!

    Bonjour,

    Ce n'est pas moi qu'il faut convaincre, mais votre ordinateur.
    Si j'arrive à faire les deux ca sera encore mieux

    Faites-lui faire un test pour en avoir le coeur net
    J'ai réalisé le test comme vous le proposiez mais rien n’apparaît lorsque l'on réussit à finir le parcours à pars le bravo()...
    Ps: j'ai réinséré la fonction bravo dans mon code dans la fonction game over ce qui me permettait de faire des tests plus rapidement

    Je me demande donc si je n'ai pas fait une erreur dans le positionnement de ma fenêtre ou dans les conditions que je n'ai peut être pas toutes insérées...

    J'avais trouvé dans la documentation interne à python qu'il fallait quatre coordonnées pour utiliser la fonction j'en ai donc rajouté deux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        def create_window(self, *args, **kw):
            """Create window with coordinates x1,y1,x2,y2."""
            return self._create('window', args, kw)
    J'ai également rajouté "window = Widget_Bouton" qui d'après la documentation me semble nécessaire de manière à ce que le widget soit sur et non pas sous le canvas.

    Gardez ceci sous le coude, je crois que nous allons en avoir besoin :

    http://infohost.nmt.edu/tcc/help/pub...te_window.html

    Et peut-être même revoir quelques fondamentaux.
    Etant donné les questions que je pose je pense que ca me fera le plus grand bien!

    Indice no. 1 : il faudra marquer sx, sy, dep dans 3 endroits précis de votre code;
    Merci pour les indices!
    Néanmoins le placer aux 3 endroits qui me paraissaient les plus adéquats ne fait que me créer une grosse latence au début... Je me suis peut-être trompé d'endroit après!
    Avec tous les indices que vous m'avez donné je pense que sur ce coup il faut encore que je cherche un peu tout seul avant de vous donner un avis définitif
    Je vous en reparle sous peu dès que j'aurais compris le raisonnement qu'il y a à faire avant le placement.

    Rigolure ! Faites péter le Cessna ! +1
    Aha +1

    Reste à vérifier ce que valent les paramètres [X,Y],r, carre1[0], carre1[1] de est_dans_polygone() et ce, à tout moment de l'exécution de move().
    Alors en fait je me suis servi du même type de raisonnement que nous avions réalisé auparavant pour la fonction move mais pour résoudre le problème de l'arrivée.
    J'ai donc utilisé le test suivant de manière à trouver à quel chiffre correspondait le carré (qui est apparemment 2) et de l'utiliser pour un test permettant de savoir si la balle était arrivée dans le carré de fin.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print(can1.bbox(cerc1))
    Je vous poste donc le code en entier :

    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
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
     
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    from Tkinter import *
     
     
     
    def animation_de_depart(sx, sy, dep):
        global X, Y
        if X <= x2 and Y <= y2:
            X += sx * dep      
            Y += sy * dep       
            can1.move(cerc1, sx * dep, sy * dep) 
            can1.after(100, animation_de_depart(sx, sy, dep))
        else:
            move()
     
    def move():
        global carre_balle
     
        carre_balle = can1.bbox(cerc1)
     
        intersection = can1.find_overlapping(carre_balle[0],carre_balle[1],carre_balle[2],carre_balle[3]) 
     
     
        if len(intersection) >1:
            if 2 in intersection:
                bravo()
            else:
                game_over()
     
        else:
            can1.move(cerc1, sx*dep, sy*dep)
            can1.after(100, move)
     
    def bravo():    
        global Widget_Bouton
        left = can1.winfo_reqwidth() // 2    
        top = can1.winfo_reqheight() // 2    
        can1.create_text(
            left, top - 40,
            text="Bravo!",
            font="sans 24 bold",
            fill="gold",
        )
     
     
    def game_over():
        global Widget_Bouton,  window 
      # la partie est finie !
        left = can1.winfo_reqwidth() // 2
        top = can1.winfo_reqheight() // 2
        can1.create_text(
            left, top - 40,
            text="GAME OVER!",
            font="sans 24 bold",
            fill="gold",
        )
     
        window = Widget_Bouton    
        Widget_Bouton = can1.create_window(400,400, fen1, bg='white')
        Widget_Bouton = Button(fen1, text='Niveau suivant', command=passer_de_niveau).pack
     
     
     
    def passer_de_niveau():  
        global X, Y, cerc1
     
        "parcours numéro 2"
     
        can1.delete(ALL)
     
        can1.create_rectangle(50,50,100,100) #dessine un rectangle
        can1.create_rectangle(370,370,420,420)
     
        #trace du nouveau parcours :
        polygone1 = [100,65,420,65], [100,85,400,85]    
        can1.create_line(tuple(polygone1[0]),fill='blue',width=4)#ligne 1
        can1.create_line(tuple(polygone1[1]),fill='blue',width=4)#ligne 2
        can1.create_line(400,85,400,130,fill='blue',width=4)#ligne 3
        can1.create_line(420,65,420,150,fill='blue',width=4)#ligne 4
        can1.create_line(170,150,420,150,fill='blue',width=4)#ligne 5
        can1.create_line(150,130,400,130,fill='blue',width=4)#ligne 6
        can1.create_line(150,130,150,190,fill='blue',width=4)#ligne 7
        can1.create_line(170,150,170,220,fill='blue',width=4)#ligne 8
        can1.create_line(60,220,170,220,fill='blue',width=4)#ligne 9
        can1.create_line(30,190,150,190,fill='blue',width=4)#ligne 10
        can1.create_line(30,190,30,480,fill='blue',width=4)#ligne 11
        can1.create_line(60,220,60,450,fill='blue',width=4)#ligne 12
        can1.create_line(60,450,250,450,fill='blue',width=4)#ligne 13
        can1.create_line(30,480,270,480,fill='blue',width=4)#ligne 14
        can1.create_line(270,480,270,330,fill='blue',width=4)#ligne 15
        can1.create_line(250,450,250,310,fill='blue',width=4)#ligne 16
        can1.create_line(270,330,380,330,fill='blue',width=4)#ligne 17
        can1.create_line(250,310,400,310,fill='blue',width=4)#ligne 18
        can1.create_line(400,310,400,370,fill='blue',width=4)#ligne 19
        can1.create_line(380,330,380,370,fill='blue',width=4)#ligne 20
     
        X = (x1 + x2 - diametre) / 2
        Y = (y1 + y2 - diametre) / 2
     
        cerc1 = can1.create_oval(X, Y, X + diametre, Y + diametre, fill='grey')
     
     
     
    def dep1_gauche(event=None):
        global sx, sy
        sx = -1
        sy = 0
     
    def dep1_droite(event=None):
        global sx, sy
        sx = 1
        sy = 0
     
    def dep1_haut(event=None):
        global sy, sx
        sy = -1
        sx = 0
     
    def dep1_bas(event=None):
        global sy, sx
        sy = 1
        sx = 0
     
    def start_it():
        animation_de_depart(sx, sy, dep)
     
     
     
    # les variables suivantes seront utilisees de maniere globale:
     
    dep = 3         # valeur de deplacement
    sx, sy = 1, 0   # sens de deplacement
     
     
    # carre de depart
    x1, y1 = 50, 50
    x2, y2 = 100, 100
     
    # diametre balle
    diametre = 5
     
    # coordonnees initiales de la balle
    X = (x1 + x2 - diametre) / 2
    Y = (y1 + y2 - diametre) / 2
     
    # Creation du widget principal ("maitre"):
    fen1 = Tk()
    fen1.title("Super Ball")
     
    # creation des widgets "esclaves":
    can1 = Canvas(fen1, bg='white', height=500, width=500)
    can1.pack(side=LEFT)
     
    # dessin parcours no. 1
    can1.create_rectangle(x1, y1, x2, y2) # dessine un rectangle
    can1.create_rectangle(120, 280, 170, 335)
    polygone1 = [100, 65, 420, 65], [100, 85, 400, 85]
    can1.create_line(*polygone1[0], fill='red', width=4) # ligne 1
    can1.create_line(*polygone1[1], fill='red', width=4) # ligne 2
    can1.create_line(400, 84, 400, 300, fill='red', width=4) # ligne 3
    can1.create_line(420, 65, 420, 320, fill='red', width=4) # ligne 4
    can1.create_line(170, 320, 420, 320, fill='red', width=4) # ligne 5
    can1.create_line(170, 300, 400, 300, fill='red', width=4) # ligne 5
     
    # dessin balle
    cerc1 = can1.create_oval(X, Y, X + diametre, Y + diametre, fill='grey')
     
    # balle au premier plan d'affichage
    can1.tag_raise(cerc1, ALL)
     
    # boutons à cliquer
    Button(fen1, text='Demarrer', command=start_it).pack(side=BOTTOM)
    Button(fen1, text='Quitter', command=fen1.destroy).pack(side=BOTTOM)
    Button(fen1, text='Gauche',command=dep1_gauche).pack()
    Button(fen1, text='Droite', command=dep1_droite).pack()
    Button(fen1, text='Haut', command=dep1_haut).pack()
    Button(fen1, text='Bas', command=dep1_bas).pack()
    Button(fen1, text='Accelere!', command=start_it).pack(side=BOTTOM)
     
    # touches du clavier
    can1.bind_all("<z>", dep1_haut)
    can1.bind_all("<s>", dep1_bas)
    can1.bind_all("<d>", dep1_droite)
    can1.bind_all("<q>", dep1_gauche)
     
    # flèches du clavier
    can1.bind_all("<Up>", dep1_haut)
    can1.bind_all("<Down>", dep1_bas)
    can1.bind_all("<Left>", dep1_gauche)
    can1.bind_all("<Right>", dep1_droite)
     
    Button()
    # démarrage du gestionnaire d'événements (boucle principale):
    fen1.mainloop()

    Bon, on touche au but.
    Effectivement et grâce à votre aide !!

    @ plouche!

  10. #70
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par FatP0ney Voir le message
    Bonsoir!

    J'ai réalisé le test comme vous le proposiez mais rien n’apparaît lorsque l'on réussit à finir le parcours à pars le bravo()...
    Ps: j'ai réinséré la fonction bravo dans mon code dans la fonction game over ce qui me permettait de faire des tests plus rapidement

    Je me demande donc si je n'ai pas fait une erreur dans le positionnement de ma fenêtre ou dans les conditions que je n'ai peut être pas toutes insérées...

    J'avais trouvé dans la documentation interne à python qu'il fallait quatre coordonnées pour utiliser la fonction j'en ai donc rajouté deux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        def create_window(self, *args, **kw):
            """Create window with coordinates x1,y1,x2,y2."""
            return self._create('window', args, kw)
    J'ai également rajouté "window = Widget_Bouton" qui d'après la documentation me semble nécessaire de manière à ce que le widget soit sur et non pas sous le canvas.
    Bah bah bah ! Ne partez pas dans des trucs compliqués pour rien !

    Relisez bien la doc : http://infohost.nmt.edu/tcc/help/pub...te_window.html

    Et ensuite expliquez-moi ce que vous avez écrit là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Widget_Bouton = can1.create_window(400,400, fen1, bg='white')
        Widget_Bouton = Button(fen1, text='Niveau suivant', command=passer_de_niveau).pack
    Tout ça m'a l'air un peu tiré par les cheveux, non ?

    Ne suffirait-il pas d'appliquer bêtement ce qui est indiqué dans la doc Tkinter ?

    Merci pour les indices!
    Néanmoins le placer aux 3 endroits qui me paraissaient les plus adéquats ne fait que me créer une grosse latence au début... Je me suis peut-être trompé d'endroit après!
    Avec tous les indices que vous m'avez donné je pense que sur ce coup il faut encore que je cherche un peu tout seul avant de vous donner un avis définitif
    Je vous en reparle sous peu dès que j'aurais compris le raisonnement qu'il y a à faire avant le placement.
    On devrait plutôt se concentrer sur un seul problème à la fois, en l'occurrence finir la fonction bravo() en premier.

    Comme ça, nous aurons tout le loisir de nous concentrer sur les autres problèmes ensuite.

    Alors en fait je me suis servi du même type de raisonnement que nous avions réalisé auparavant pour la fonction move mais pour résoudre le problème de l'arrivée.
    J'ai donc utilisé le test suivant de manière à trouver à quel chiffre correspondait le carré (qui est apparemment 2) et de l'utiliser pour un test permettant de savoir si la balle était arrivée dans le carré de fin.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print(can1.bbox(cerc1))
    Je vous poste donc le code en entier :

    (snip) (snip)
    Finissons d'abord la fonction bravo(), voulez-vous ?

  11. #71
    Nouveau membre du Club
    Homme Profil pro
    Travail
    Inscrit en
    Avril 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Travail

    Informations forums :
    Inscription : Avril 2014
    Messages : 45
    Points : 34
    Points
    34
    Par défaut
    Bonjour,
    après quelques jours d'absence (travail bla bla bla ) j'ai enfin un peu de temps pour me repencher sur le projet

    Et ensuite expliquez-moi ce que vous avez écrit là
    D'après ce que je comprends de la doc la première ligne crée un widget dans le "gros widget canvas" , aux coordonnées suivantes : 400,400.
    La seconde ligne permet de créer un bouton dans lequel je place la commande pour passer de niveau.

    Mais en relisant la doc je ne comprends pas pourquoi :

    - on n'utilise pas window=w car par définition le nouveau widget n'est pas censé se placer sur le canvas si?



    Je vais reprende à l'écrit le raisonement que j'ai fait ca vous permettra peut etre de mieux comprendre la ou je me suis trompé :

    id = C.create_window(x, y, option, ...)
    Je reproduit la meme chose avec les éléments suivants :

    - id = Widget_Bouton
    -C = can1
    - x = 400
    - y = 400
    options :
    -bg='white'


    La seconde ligne correspond pour moi à la création du bouton en lui meme qui serait censé s'afficher dans le nouveau widget :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Widget_Bouton = Button(fen1, text='Niveau suivant', command=passer_de_niveau).pack
    @ +

  12. #72
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par FatP0ney Voir le message
    Bonjour,
    après quelques jours d'absence (travail bla bla bla ) j'ai enfin un peu de temps pour me repencher sur le projet

    D'après ce que je comprends de la doc la première ligne crée un widget dans le "gros widget canvas" , aux coordonnées suivantes : 400,400.
    La seconde ligne permet de créer un bouton dans lequel je place la commande pour passer de niveau.

    Mais en relisant la doc je ne comprends pas pourquoi :

    - on n'utilise pas window=w car par définition le nouveau widget n'est pas censé se placer sur le canvas si?
    Bonjour,

    Qui ça "on" n'utilise pas window=w ?

    Qui a écrit ces lignes de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Widget_Bouton = can1.create_window(400,400, fen1, bg='white')
        Widget_Bouton = Button(fen1, text='Niveau suivant', command=passer_de_niveau).pack
    c'est bien vous, non ?

    Je vais reprende à l'écrit le raisonement que j'ai fait ca vous permettra peut etre de mieux comprendre la ou je me suis trompé :

    Je reproduit la meme chose avec les éléments suivants :

    - id = Widget_Bouton
    -C = can1
    - x = 400
    - y = 400
    options :
    -bg='white'

    La seconde ligne correspond pour moi à la création du bouton en lui meme qui serait censé s'afficher dans le nouveau widget :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Widget_Bouton = Button(fen1, text='Niveau suivant', command=passer_de_niveau).pack
    @ +
    Non, moi ce que j'aimerais comprendre dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Widget_Bouton = can1.create_window(400,400, fen1, bg='white')
        Widget_Bouton = Button(fen1, text='Niveau suivant', command=passer_de_niveau).pack
    C'est pourquoi à la ligne 1, vous assignez à la variable Widget_Bouton l'id du canvasItem issu de can1.create_window(), puis aussi sec à la ligne 2 vous perdez cette information en assignant à la même variable Widget_Bouton la création du widget Button() - à qui de surcroît vous collez en bout de ligne un pack sans parenthèses totalement sibyllin ?

    De plus, vous me faites un can1.create_window(400,400, fen1, bg='white'), alors que j'ai beau relire la doc, je ne vois nulle part une assignation de create_window() à un widget parent tel que fen1, par exemple.

    Vous voyez bien que plusieurs choses ne collent pas, non ?

  13. #73
    Nouveau membre du Club
    Homme Profil pro
    Travail
    Inscrit en
    Avril 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Travail

    Informations forums :
    Inscription : Avril 2014
    Messages : 45
    Points : 34
    Points
    34
    Par défaut
    Bonjour,

    Qui ça "on" n'utilise pas window=w ?

    Qui a écrit ces lignes de code :

    Code :Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Widget_Bouton = can1.create_window(400,400, fen1, bg='white')
    Widget_Bouton = Button(fen1, text='Niveau suivant', command=passer_de_niveau).pack
    c'est bien vous, non ?
    Je me suis mal exprimé, je pensais que lorsque vous aviez reposté les deux lignes de code, vous aviez enlevé ce qui vous paraissait inutile (à savoir " window=w" que j'avais rajouté lorsque j'avais posté mon code la dernière fois sous cette forme la :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        window = Widget_Bouton    
        Widget_Bouton = can1.create_window(400,400, fen1, bg='white')
        Widget_Bouton = Button(fen1, text='Niveau suivant', command=passer_de_niveau).pack
    C'est pourquoi à la ligne 1, vous assignez à la variable Widget_Bouton l'id du canvasItem issu de can1.create_window(), puis aussi sec à la ligne 2 vous perdez cette information en assignant à la même variable Widget_Bouton la création du widget Button() - à qui de surcroît vous collez en bout de ligne un pack sans parenthèses totalement sibyllin ?
    En fait je pensais qu'en procédant de la sorte , j'indiquais que le bouton se trouvait dans le widget...ce qui n'est pas le cas

    De plus, vous me faites un can1.create_window(400,400, fen1, bg='white'), alors que j'ai beau relire la doc, je ne vois nulle part une assignation de create_window() à un widget parent tel que fen1, par exemple.
    Effectivement je pensais que cela faisait partit des "options" comme donné dans la doc.

    Je vous renvoie donc la modification de la partie en suivant vos conseils :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        window = Widget_Bouton    
        Widget_Bouton = can1.create_window(400,400, bg='white')
               Button(fen1, text='Niveau suivant', command=passer_de_niveau).pack
    En relisant la documentation je pense qu'il n'est pas nécessaire d'utiliser les autres options (width , anchors...) mais en prenant compte mon excellente maitrise de l'anglais il est possible que je me trompes

    @+

  14. #74
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par FatP0ney Voir le message
    Je me suis mal exprimé, je pensais que lorsque vous aviez reposté les deux lignes de code, vous aviez enlevé ce qui vous paraissait inutile (à savoir " window=w" que j'avais rajouté lorsque j'avais posté mon code la dernière fois sous cette forme la :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        window = Widget_Bouton    
        Widget_Bouton = can1.create_window(400,400, fen1, bg='white')
        Widget_Bouton = Button(fen1, text='Niveau suivant', command=passer_de_niveau).pack
    En fait je pensais qu'en procédant de la sorte , j'indiquais que le bouton se trouvait dans le widget...ce qui n'est pas le cas
    A vrai dire, même en ajoutant cette ligne l'ensemble reste faux.


    Effectivement je pensais que cela faisait partit des "options" comme donné dans la doc.

    Je vous renvoie donc la modification de la partie en suivant vos conseils :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        window = Widget_Bouton    
        Widget_Bouton = can1.create_window(400,400, bg='white')
        Button(fen1, text='Niveau suivant', command=passer_de_niveau).pack
    En relisant la documentation je pense qu'il n'est pas nécessaire d'utiliser les autres options (width , anchors...) mais en prenant compte mon excellente maitrise de l'anglais il est possible que je me trompes

    @+
    Les options citées à la page http://infohost.nmt.edu/tcc/help/pub...te_window.html ne sont pas en plus d'autres options générales.

    Ce sont des options strictes : vous ne pouvez utiliser dans canvas.create_window() QUE les options listées dans cette page et uniquement ces options.

    En somme, vous ne pouvez citer dans canvas.create_window() que les options anchor, height, state, tags, width, window et rien d'autre.

    Une option comme bg='white' n'a strictement rien à faire là.

    En revanche, toutes les options listées dans la doc sont effectivement optionnelles, donc pas obligatoires à citer dans chaque canvas.create_window().

    Ensuite, essayez de vous mettre à la place de l'ordinateur quand vous écrivez du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        window = Widget_Bouton    
        Widget_Bouton = can1.create_window(400,400, bg='white')
        Button(fen1, text='Niveau suivant', command=passer_de_niveau).pack
    Qu'avez-vous écrit ?

    1. Vous assignez à la variable locale window la variable locale Widget_Bouton que vous n'avez pas encore créée (y a pas un os, là ?) ;
    2. Vous assignez à la variable locale Widget_Bouton l'ID du canvasItem créé par can1.create_window() ;
    3. Vous créez un bouton sans variable de référence et toujours avec ce mystérieux pack sans parenthèses à la fin ;


    Je vous le redis : la programmation, c'est tout sauf de la magie incantatoire.

    Vous devez comprendre ce que vous faites et vous mettre à la place de l'ordinateur pour imaginer les étapes qu'il est amené à accomplir pour exécuter le code que vous lui écrivez.

    Mettez par écrit ce que vous voulez réellement faire :

    1. créer un widget Button() avec tous les paramètres qui vont bien ;
    2. assigner ce widget Button() à une variable locale de référence, disons la variable bouton ;
    3. créer une zone réservée dans le canevas avec canvas.create_window() qui utilise le widget Button() référencé par la variable bouton ;


    Et ça devrait suffire pour la fonction bravo(), pour l'instant.

  15. #75
    Nouveau membre du Club
    Homme Profil pro
    Travail
    Inscrit en
    Avril 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Travail

    Informations forums :
    Inscription : Avril 2014
    Messages : 45
    Points : 34
    Points
    34
    Par défaut
    Après une nouveau gros laps de temps sans solliciter votre aide , je reviens vous faire part des avancées du projet :

    Nous avons finalement décidé que le passage d'un niveau a un autre se ferait automatiquement. Néanmoins j'utilise la technique que l'on étudiais dans la fonction game_over afin d'activer une relance possible lorsque l'on perd.

    Je vous publie le code en entier (le temps passe mais les conseils restent !! ) qui comprend toutes les modifications.

    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
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
     
    # -*- coding: utf-8 -*-
    """
    Created on Tue May 06 13:32:10 2014
     
     
    """
     
    from Tkinter import *
     
    def initialisation():
        global dep,sx,sy,diametre, X, Y
        dep = 5         # valeur de deplacement
        sx, sy = 1, 0   # sens de deplacement
     
        # carre de depart
        x1, y1 = 50, 50
        x2, y2 = 100, 100
     
        # diametre balle
        diametre = 5
     
        # coordonnees initiales de la balle
        X = (x1 + x2 - diametre) / 2
        Y = (y1 + y2 - diametre) / 2
     
    def animation_de_depart():
        global X, Y
        if X <= x2 and Y <= y2:
            X += sx * dep      
            Y += sy * dep       
            can1.move(cerc1, sx * dep, sy * dep) 
            can1.after(100, animation_de_depart)
        else:
            move()
     
    def move():
        global carre_balle
     
        carre_balle = can1.bbox(cerc1)
     
        intersection = can1.find_overlapping(carre_balle[0],carre_balle[1],carre_balle[2],carre_balle[3]) 
        # la balle se retrouve-t-elle seule ?
        import winsound
     
        if len(intersection) >1:
            if 2 in intersection:
                bravo()
                # Play Windows exclamation sound.
                winsound.PlaySound("SystemExclamation", winsound.SND_ALIAS)
                can1.after(100, passer_de_niveau)
            else:
                game_over()
                # Play Windows exit sound.
                winsound.PlaySound("SystemExit", winsound.SND_ALIAS)
        # la balle est au moins sur un rail
        else:
            can1.move(cerc1, sx*dep, sy*dep)
            can1.after(100, move)
     
        #print(can1.find_overlapping(carre_balle[0], carre_balle[1], can1.bbox(cerc1)))
         #Si la balle est dans le carré final alors :
     
        #si la balle touche un coté alors :
        #print(can1.bbox(cerc1))
     
     
        #if len(can1.find_overlapping(*can1.bbox(cerc1))) > 1:
            # oui, la partie se termine
         #   game_over()
        # non, tout va bien, on continue
        #else:
         #   can1.move(cerc1, sx * dep, sy * dep)
          #  can1.after(100, move)
     
        #carre_balle = bbox(X, Y)
     
    def bravo():    
        global Widget_Bouton
        left = can1.winfo_reqwidth() // 2    
        top = can1.winfo_reqheight() // 2    
        can1.create_text(
            left, top - 40,
            text="Bravo!",
            font="sans 24 bold",
            fill="gold",
        )
     
    def game_over():
        global bouton
     
       # la partie est finie !
        left = can1.winfo_reqwidth() // 2
        top = can1.winfo_reqheight() // 2
        can1.create_text(
            left, top - 40,
            text="GAME OVER!",
            font="sans 24 bold",
            fill="gold",
        )
     
        bouton=Button(fen1, text='Relancer', command=replay)
        can1.create_window(240,180,window=bouton)
     
     
     
    def replay():    
        global X, Y, cerc1
     
        can1.delete(ALL)
     
        can1.create_rectangle(50,50,100,100) #dessine un rectangle
        can1.create_rectangle(120, 280, 170, 335)   
        can1.create_line(100, 65, 160, 65, fill='medium sea green', width=4) # ligne 1
        can1.create_line(100, 85, 140, 85, fill='medium sea green', width=4) # ligne 2
        can1.create_line(140, 85, 140, 280, fill='medium sea green', width=4) # ligne 3
        can1.create_line(160, 65, 160, 280, fill='medium sea green', width=4) # ligne 4
     
        X = (x1 + x2 - diametre) / 2
        Y = (y1 + y2 - diametre) / 2
     
        cerc1 = can1.create_oval(X, Y, X + diametre, Y + diametre, fill='grey')
     
     
    def passer_de_niveau():  
        global X, Y, cerc1
     
        "parcours numéro 2"
     
        can1.delete(ALL)
     
        can1.create_rectangle(50,50,100,100) #dessine un rectangle
        can1.create_rectangle(370,370,420,420)
     
        #trace du nouveau parcours :
        polygone1 = [100,65,420,65], [100,85,400,85]    
        can1.create_line(tuple(polygone1[0]),fill='orange',width=4)#ligne 1
        can1.create_line(tuple(polygone1[1]),fill='orange',width=4)#ligne 2
        can1.create_line(400,85,400,130,fill='orange',width=4)#ligne 3
        can1.create_line(420,65,420,150,fill='orange',width=4)#ligne 4
        can1.create_line(170,150,420,150,fill='orange',width=4)#ligne 5
        can1.create_line(150,130,400,130,fill='orange',width=4)#ligne 6
        can1.create_line(150,130,150,190,fill='orange',width=4)#ligne 7
        can1.create_line(170,150,170,220,fill='orange',width=4)#ligne 8
        can1.create_line(60,220,170,220,fill='orange',width=4)#ligne 9
        can1.create_line(30,190,150,190,fill='orange',width=4)#ligne 10
        can1.create_line(30,190,30,480,fill='orange',width=4)#ligne 11
        can1.create_line(60,220,60,450,fill='orange',width=4)#ligne 12
        can1.create_line(60,450,250,450,fill='orange',width=4)#ligne 13
        can1.create_line(30,480,270,480,fill='orange',width=4)#ligne 14
        can1.create_line(270,480,270,330,fill='orange',width=4)#ligne 15
        can1.create_line(250,450,250,310,fill='orange',width=4)#ligne 16
        can1.create_line(270,330,380,330,fill='orange',width=4)#ligne 17
        can1.create_line(250,310,400,310,fill='orange',width=4)#ligne 18
        can1.create_line(400,310,400,370,fill='orange',width=4)#ligne 19
        can1.create_line(380,330,380,370,fill='orange',width=4)#ligne 20
     
        X = (x1 + x2 - diametre) / 2
        Y = (y1 + y2 - diametre) / 2
     
        cerc1 = can1.create_oval(X, Y, X + diametre, Y + diametre, fill='grey')
     
     
     
    def dep1_gauche(event=None):
        global sx, sy
        sx = -1
        sy = 0
     
    def dep1_droite(event=None):
        global sx, sy
        sx = 1
        sy = 0
     
    def dep1_haut(event=None):
        global sy, sx
        sy = -1
        sx = 0
     
    def dep1_bas(event=None):
        global sy, sx
        sy = 1
        sx = 0
     
    def start_it():
        initialisation()
        animation_de_depart()
     
     
     
    # les variables suivantes seront utilisees de maniere globale:
     
    dep = 5         # valeur de deplacement
    sx, sy = 1, 0   # sens de deplacement
     
     
    # carre de depart
    x1, y1 = 50, 50
    x2, y2 = 100, 100
     
    # diametre balle
    diametre = 5
     
    # coordonnees initiales de la balle
    X = (x1 + x2 - diametre) / 2
    Y = (y1 + y2 - diametre) / 2
     
    # Creation du widget principal ("maitre"):
    fen1 = Tk()
    fen1.title("Super Ball")
     
    # creation des widgets "esclaves":
    can1 = Canvas(fen1, bg='white', height=500, width=500)
    can1.pack(side=LEFT)
     
    # dessin parcours no. 1
    can1.create_rectangle(x1, y1, x2, y2) # dessine le rectangle de départ
    can1.create_rectangle(120, 280, 170, 335) # dessine le rectangle d'arrivé
    polygone1 = [100, 65, 420, 65], [100, 85, 400, 85]
    #can1.create_line(*polygone1[0], fill='red', width=4) # ligne 1
    #can1.create_line(*polygone1[1], fill='red', width=4) # ligne 2
    can1.create_line(100, 65, 160, 65, fill='medium sea green', width=4) # ligne 1
    can1.create_line(100, 85, 140, 85, fill='medium sea green', width=4) # ligne 2
    can1.create_line(140, 85, 140, 280, fill='medium sea green', width=4) # ligne 3
    can1.create_line(160, 65, 160, 280, fill='medium sea green', width=4) # ligne 4
     
     
    # dessin balle
    cerc1 = can1.create_oval(X, Y, X + diametre, Y + diametre, fill='green')
     
    # balle au premier plan d'affichage
    can1.tag_raise(cerc1, ALL)
    can1.update()
     
    # boutons à cliquer
     
    Button(fen1, text='Demarrer', command=start_it).pack(side=BOTTOM)
    Button(fen1, text='Quitter', command=fen1.destroy).pack(side=BOTTOM)
    Button(fen1, text='Gauche',command=dep1_gauche).pack()
    Button(fen1, text='Droite', command=dep1_droite).pack()
    Button(fen1, text='Haut', command=dep1_haut).pack()
    Button(fen1, text='Bas', command=dep1_bas).pack()
     
    # touches du clavier
    can1.bind_all("<z>", dep1_haut)
    can1.bind_all("<s>", dep1_bas)
    can1.bind_all("<d>", dep1_droite)
    can1.bind_all("<q>", dep1_gauche)
     
    # flèches du clavier
    can1.bind_all("<Up>", dep1_haut)
    can1.bind_all("<Down>", dep1_bas)
    can1.bind_all("<Left>", dep1_gauche)
    can1.bind_all("<Right>", dep1_droite)
     
     
    # démarrage du gestionnaire d'événements (boucle principale):
    fen1.mainloop()
    La fin du temps qui m'est imparti pour réaliser le projet touche à sa fin je vais essayer maintenant de créer une sorte de système de score en fonction de la carte ou l'on est.. Je vous tiens au jus

    Merci pour les indications!

  16. #76
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par FatP0ney Voir le message
    Après une nouveau gros laps de temps sans solliciter votre aide , je reviens vous faire part des avancées du projet :

    Nous avons finalement décidé que le passage d'un niveau a un autre se ferait automatiquement. Néanmoins j'utilise la technique que l'on étudiais dans la fonction game_over afin d'activer une relance possible lorsque l'on perd.

    Je vous publie le code en entier (le temps passe mais les conseils restent !! ) qui comprend toutes les modifications.

    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
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
     
    # -*- coding: utf-8 -*-
    """
    Created on Tue May 06 13:32:10 2014
     
     
    """
     
    from Tkinter import *
     
    def initialisation():
        global dep,sx,sy,diametre, X, Y
        dep = 5         # valeur de deplacement
        sx, sy = 1, 0   # sens de deplacement
     
        # carre de depart
        x1, y1 = 50, 50
        x2, y2 = 100, 100
     
        # diametre balle
        diametre = 5
     
        # coordonnees initiales de la balle
        X = (x1 + x2 - diametre) / 2
        Y = (y1 + y2 - diametre) / 2
     
    def animation_de_depart():
        global X, Y
        if X <= x2 and Y <= y2:
            X += sx * dep      
            Y += sy * dep       
            can1.move(cerc1, sx * dep, sy * dep) 
            can1.after(100, animation_de_depart)
        else:
            move()
     
    def move():
        global carre_balle
     
        carre_balle = can1.bbox(cerc1)
     
        intersection = can1.find_overlapping(carre_balle[0],carre_balle[1],carre_balle[2],carre_balle[3]) 
        # la balle se retrouve-t-elle seule ?
        import winsound
     
        if len(intersection) >1:
            if 2 in intersection:
                bravo()
                # Play Windows exclamation sound.
                winsound.PlaySound("SystemExclamation", winsound.SND_ALIAS)
                can1.after(100, passer_de_niveau)
            else:
                game_over()
                # Play Windows exit sound.
                winsound.PlaySound("SystemExit", winsound.SND_ALIAS)
        # la balle est au moins sur un rail
        else:
            can1.move(cerc1, sx*dep, sy*dep)
            can1.after(100, move)
     
        #print(can1.find_overlapping(carre_balle[0], carre_balle[1], can1.bbox(cerc1)))
         #Si la balle est dans le carré final alors :
     
        #si la balle touche un coté alors :
        #print(can1.bbox(cerc1))
     
     
        #if len(can1.find_overlapping(*can1.bbox(cerc1))) > 1:
            # oui, la partie se termine
         #   game_over()
        # non, tout va bien, on continue
        #else:
         #   can1.move(cerc1, sx * dep, sy * dep)
          #  can1.after(100, move)
     
        #carre_balle = bbox(X, Y)
     
    def bravo():    
        global Widget_Bouton
        left = can1.winfo_reqwidth() // 2    
        top = can1.winfo_reqheight() // 2    
        can1.create_text(
            left, top - 40,
            text="Bravo!",
            font="sans 24 bold",
            fill="gold",
        )
     
    def game_over():
        global bouton
     
       # la partie est finie !
        left = can1.winfo_reqwidth() // 2
        top = can1.winfo_reqheight() // 2
        can1.create_text(
            left, top - 40,
            text="GAME OVER!",
            font="sans 24 bold",
            fill="gold",
        )
     
        bouton=Button(fen1, text='Relancer', command=replay)
        can1.create_window(240,180,window=bouton)
     
     
     
    def replay():    
        global X, Y, cerc1
     
        can1.delete(ALL)
     
        can1.create_rectangle(50,50,100,100) #dessine un rectangle
        can1.create_rectangle(120, 280, 170, 335)   
        can1.create_line(100, 65, 160, 65, fill='medium sea green', width=4) # ligne 1
        can1.create_line(100, 85, 140, 85, fill='medium sea green', width=4) # ligne 2
        can1.create_line(140, 85, 140, 280, fill='medium sea green', width=4) # ligne 3
        can1.create_line(160, 65, 160, 280, fill='medium sea green', width=4) # ligne 4
     
        X = (x1 + x2 - diametre) / 2
        Y = (y1 + y2 - diametre) / 2
     
        cerc1 = can1.create_oval(X, Y, X + diametre, Y + diametre, fill='grey')
     
     
    def passer_de_niveau():  
        global X, Y, cerc1
     
        "parcours numéro 2"
     
        can1.delete(ALL)
     
        can1.create_rectangle(50,50,100,100) #dessine un rectangle
        can1.create_rectangle(370,370,420,420)
     
        #trace du nouveau parcours :
        polygone1 = [100,65,420,65], [100,85,400,85]    
        can1.create_line(tuple(polygone1[0]),fill='orange',width=4)#ligne 1
        can1.create_line(tuple(polygone1[1]),fill='orange',width=4)#ligne 2
        can1.create_line(400,85,400,130,fill='orange',width=4)#ligne 3
        can1.create_line(420,65,420,150,fill='orange',width=4)#ligne 4
        can1.create_line(170,150,420,150,fill='orange',width=4)#ligne 5
        can1.create_line(150,130,400,130,fill='orange',width=4)#ligne 6
        can1.create_line(150,130,150,190,fill='orange',width=4)#ligne 7
        can1.create_line(170,150,170,220,fill='orange',width=4)#ligne 8
        can1.create_line(60,220,170,220,fill='orange',width=4)#ligne 9
        can1.create_line(30,190,150,190,fill='orange',width=4)#ligne 10
        can1.create_line(30,190,30,480,fill='orange',width=4)#ligne 11
        can1.create_line(60,220,60,450,fill='orange',width=4)#ligne 12
        can1.create_line(60,450,250,450,fill='orange',width=4)#ligne 13
        can1.create_line(30,480,270,480,fill='orange',width=4)#ligne 14
        can1.create_line(270,480,270,330,fill='orange',width=4)#ligne 15
        can1.create_line(250,450,250,310,fill='orange',width=4)#ligne 16
        can1.create_line(270,330,380,330,fill='orange',width=4)#ligne 17
        can1.create_line(250,310,400,310,fill='orange',width=4)#ligne 18
        can1.create_line(400,310,400,370,fill='orange',width=4)#ligne 19
        can1.create_line(380,330,380,370,fill='orange',width=4)#ligne 20
     
        X = (x1 + x2 - diametre) / 2
        Y = (y1 + y2 - diametre) / 2
     
        cerc1 = can1.create_oval(X, Y, X + diametre, Y + diametre, fill='grey')
     
     
     
    def dep1_gauche(event=None):
        global sx, sy
        sx = -1
        sy = 0
     
    def dep1_droite(event=None):
        global sx, sy
        sx = 1
        sy = 0
     
    def dep1_haut(event=None):
        global sy, sx
        sy = -1
        sx = 0
     
    def dep1_bas(event=None):
        global sy, sx
        sy = 1
        sx = 0
     
    def start_it():
        initialisation()
        animation_de_depart()
     
     
     
    # les variables suivantes seront utilisees de maniere globale:
     
    dep = 5         # valeur de deplacement
    sx, sy = 1, 0   # sens de deplacement
     
     
    # carre de depart
    x1, y1 = 50, 50
    x2, y2 = 100, 100
     
    # diametre balle
    diametre = 5
     
    # coordonnees initiales de la balle
    X = (x1 + x2 - diametre) / 2
    Y = (y1 + y2 - diametre) / 2
     
    # Creation du widget principal ("maitre"):
    fen1 = Tk()
    fen1.title("Super Ball")
     
    # creation des widgets "esclaves":
    can1 = Canvas(fen1, bg='white', height=500, width=500)
    can1.pack(side=LEFT)
     
    # dessin parcours no. 1
    can1.create_rectangle(x1, y1, x2, y2) # dessine le rectangle de départ
    can1.create_rectangle(120, 280, 170, 335) # dessine le rectangle d'arrivé
    polygone1 = [100, 65, 420, 65], [100, 85, 400, 85]
    #can1.create_line(*polygone1[0], fill='red', width=4) # ligne 1
    #can1.create_line(*polygone1[1], fill='red', width=4) # ligne 2
    can1.create_line(100, 65, 160, 65, fill='medium sea green', width=4) # ligne 1
    can1.create_line(100, 85, 140, 85, fill='medium sea green', width=4) # ligne 2
    can1.create_line(140, 85, 140, 280, fill='medium sea green', width=4) # ligne 3
    can1.create_line(160, 65, 160, 280, fill='medium sea green', width=4) # ligne 4
     
     
    # dessin balle
    cerc1 = can1.create_oval(X, Y, X + diametre, Y + diametre, fill='green')
     
    # balle au premier plan d'affichage
    can1.tag_raise(cerc1, ALL)
    can1.update()
     
    # boutons à cliquer
     
    Button(fen1, text='Demarrer', command=start_it).pack(side=BOTTOM)
    Button(fen1, text='Quitter', command=fen1.destroy).pack(side=BOTTOM)
    Button(fen1, text='Gauche',command=dep1_gauche).pack()
    Button(fen1, text='Droite', command=dep1_droite).pack()
    Button(fen1, text='Haut', command=dep1_haut).pack()
    Button(fen1, text='Bas', command=dep1_bas).pack()
     
    # touches du clavier
    can1.bind_all("<z>", dep1_haut)
    can1.bind_all("<s>", dep1_bas)
    can1.bind_all("<d>", dep1_droite)
    can1.bind_all("<q>", dep1_gauche)
     
    # flèches du clavier
    can1.bind_all("<Up>", dep1_haut)
    can1.bind_all("<Down>", dep1_bas)
    can1.bind_all("<Left>", dep1_gauche)
    can1.bind_all("<Right>", dep1_droite)
     
     
    # démarrage du gestionnaire d'événements (boucle principale):
    fen1.mainloop()
    La fin du temps qui m'est imparti pour réaliser le projet touche à sa fin je vais essayer maintenant de créer une sorte de système de score en fonction de la carte ou l'on est.. Je vous tiens au jus

    Merci pour les indications!
    Bonjour,

    Hum. Je ne veux pas avoir l'air de vous stresser en période d'examens, mais vous avez encore un paquet de choses à revoir dans votre code, là.

    Je viens d'étudier votre script et vous avez encore plein de DEAD CODE (code inutile ou en double) à nettoyer avant de vous lancer dans la conception de fonctionnalités de score.

    Vous avez créé une fonction initialisation() - ce qui est très pertinent - mais vous ne l'utilisez pas de manière pertinente ensuite.

    Regardez, vous avez écrit :

    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
    def initialisation():
        global dep, sx, sy, diametre, X, Y
        dep = 5         # valeur de deplacement
        sx, sy = 1, 0   # sens de deplacement
     
        # carre de depart
        x1, y1 = 50, 50
        x2, y2 = 100, 100
     
        # diametre balle
        diametre = 5
     
        # coordonnees initiales de la balle
        X = (x1 + x2 - diametre) / 2
        Y = (y1 + y2 - diametre) / 2
    et tout en bas de votre script, vous avez aussi écrit :

    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
    # les variables suivantes seront utilisees de maniere globale:
     
    dep = 5         # valeur de deplacement
    sx, sy = 1, 0   # sens de deplacement
     
     
    # carre de depart
    x1, y1 = 50, 50
    x2, y2 = 100, 100
     
    # diametre balle
    diametre = 5
     
    # coordonnees initiales de la balle
    X = (x1 + x2 - diametre) / 2
    Y = (y1 + y2 - diametre) / 2
     
    # Creation du widget principal ("maitre"):
    fen1 = Tk()
    fen1.title("Super Ball")
     
    # creation des widgets "esclaves":
    can1 = Canvas(fen1, bg='white', height=500, width=500)
    can1.pack(side=LEFT)
    pourquoi ne pas appeler tout simplement initialisation() à cet endroit-là au lieu de réécrire le même code ?

    qu'est-ce qui vous en empêche ?

    pareil pour la fonction replay() qui trace de nouveau le parcours 1 alors qu'on trouve le même tracé plus bas dans le fichier de script.

    n'aurait-il pas été plus pertinent de créer deux fonctions tracer_parcours_1() et tracer_parcours_2() dans lesquelles vous auriez placé ET les initialisations propres à chaque parcours ET le tracé propre à chaque parcours ?

    vous pourriez organiser l'initialisation de votre jeu avec les étapes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    creation_des_widgets_tkinter()
    tracer_parcours_1()
    fen1.mainloop()
    là, c'est dans les grandes lignes pour vous montrer comment vous pourriez organiser le code de démarrage.

    il faut évidemment remplacer par ce que vous avez déjà fait :

    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
    # Creation du widget principal ("maitre"):
    fen1 = Tk()
    fen1.title("Super Ball")
     
    # creation des widgets "esclaves":
    can1 = Canvas(fen1, bg='white', height=500, width=500)
    can1.pack(side=LEFT)
     
    # tracé du premier parcours
    tracer_parcours_1()
     
    # boutons à cliquer
    Button(fen1, text='Demarrer', command=start_it).pack(side=BOTTOM)
    Button(fen1, text='Quitter', command=fen1.destroy).pack(side=BOTTOM)
    Button(fen1, text='Gauche',command=dep1_gauche).pack()
    Button(fen1, text='Droite', command=dep1_droite).pack()
    Button(fen1, text='Haut', command=dep1_haut).pack()
    Button(fen1, text='Bas', command=dep1_bas).pack()
     
    # touches du clavier
    can1.bind_all("<z>", dep1_haut)
    can1.bind_all("<s>", dep1_bas)
    can1.bind_all("<d>", dep1_droite)
    can1.bind_all("<q>", dep1_gauche)
     
    # flèches du clavier
    can1.bind_all("<Up>", dep1_haut)
    can1.bind_all("<Down>", dep1_bas)
    can1.bind_all("<Left>", dep1_gauche)
    can1.bind_all("<Right>", dep1_droite)
     
    # démarrage du gestionnaire d'événements (boucle principale):
    fen1.mainloop()
    ensuite, vous me faites un import winsound dans la fonction move() qui est appelée environ 10 fois par seconde (!)

    pourquoi ne pas placer cet import une bonne fois pour toutes au départ du jeu ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    """
    Created on Tue May 06 13:32:10 2014
    """
    import winsound
    from Tkinter import *
    un module une fois importé ne sera plus réimporté une 2ème fois, alors autant ne l'importer qu'une seule fois au départ.

    il y aurait un sacré coup de balai à passer avant de partir bille en tête dans le codage du score.

    allez, courage, vous touchez au but.

    @+.
    Dernière modification par Invité ; 13/05/2014 à 10h33.

  17. #77
    Nouveau membre du Club
    Homme Profil pro
    Travail
    Inscrit en
    Avril 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Travail

    Informations forums :
    Inscription : Avril 2014
    Messages : 45
    Points : 34
    Points
    34
    Par défaut
    Merci encore une fois de vos conseils !

    Je vous avoue que j'ai pas mal de travail en ce moment mais je veillerais à supprimer toutes ces lignes inutiles samedi soir ou j'aurais un peu de temps pour corriger tout ça ...

    Nous avons un peu avancé avec mes amis mais nous avons quelques problèmes plutôt gênant surtout que l'oral est pour la semaine prochaine.

    Nous avons modifié certaines choses notamment l'ajout d'un troisième parcours mais nous avons deux problèmes lorsque nous exécutons le code :

    1- lorsque nous perdons, le bouton replay n’apparaît pas car il semblerait que ce que nous avons appelé "fin2" ne soit pas défini dans move ce qui ne me semble pas être le cas vu qu'il est dans global.

    2- Lorsque l'on redémarre au second niveau notre balle se dirige vers le bas et non pas en ligne droite ce qui me semble bizarre :/

    Voici le code édité :

    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
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
     
    # -*- coding: utf-8 -*-
    """
    Created on Tue May 20 13:35:38 2014
     
    @author: BOUCHEP
    """
     
    from Tkinter import *
     
     
     
    def animation_de_depart():
        global X, Y
        if X <= x2 and Y <= y2:
            X += sx * dep      
            Y += sy * dep       
            can1.move(cerc1, sx * dep, sy * dep) 
            can1.after(100, animation_de_depart)
        else:
            move()
     
    def move():
        global carre_balle,fin1 ,fin2 ,fin3
     
        carre_balle = can1.bbox(cerc1)
     
        intersection = can1.find_overlapping(carre_balle[0],carre_balle[1],carre_balle[2],carre_balle[3]) 
        # la balle se retrouve-t-elle seule ?
     
        if len(intersection) >1:
            if fin1 in intersection:
                    bravo()
                    can1.after(800, passer_de_niveau)
     
            elif fin2 in intersection:
                    bravo()
                    can1.after(800, passer_de_niveau2)
     
            elif fin3 in intersection:
                    super_bravo()
     
            else:
                game_over()
     
     
        else:
            can1.move(cerc1, sx*dep, sy*dep)
            can1.after(100, move)
     
     
    def bravo():    
        global Widget_Bouton
        left = can1.winfo_reqwidth() // 2    
        top = can1.winfo_reqheight() // 2    
        can1.create_text(
            left, top - 40,
            text="Bravo!",
            font="sans 24 bold",
            fill="gold",
        )
     
    def super_bravo():
        global Widget_Bouton
        left = can1.winfo_reqwidth() // 2    
        top = can1.winfo_reqheight() // 2    
        can1.create_text(
            left, top - 40,
            text="BIEN JOUE !",
            font="sans 60 bold",
            fill="gold",
        )
     
     
    def game_over():
        global bouton,item
     
       # la partie est finie !
        left = can1.winfo_reqwidth() // 2
        top = can1.winfo_reqheight() // 2
        can1.create_text(
            left, top - 40,
            text="GAME OVER!",
            font="sans 24 bold",
            fill="gold",
        )
     
        bouton=Button(fen1, text='Relancer', command=replay)
        can1.create_window(240,180,window=bouton)
     
     
     
     
     
    def replay():    
        global X ,Y,cerc1 ,fin1
     
        can1.delete(ALL)
     
        can1.create_rectangle(50,50,100,100) #dessine un rectangle
        fin1 = can1.create_rectangle(120, 280, 170, 335)   
        can1.create_line(100, 65, 160, 65, fill='medium sea green', width=4) # ligne 1
        can1.create_line(100, 85, 140, 85, fill='medium sea green', width=4) # ligne 2
        can1.create_line(140, 85, 140, 280, fill='medium sea green', width=4) # ligne 3
        can1.create_line(160, 65, 160, 280, fill='medium sea green', width=4) # ligne 4
     
        X = (x1 + x2 - diametre) / 2
        Y = (y1 + y2 - diametre) / 2
     
        cerc1 = can1.create_oval(X, Y, X + diametre, Y + diametre, fill='grey')
     
     
    def passer_de_niveau():  
     
        "parcours numéro 2"
     
        can1.delete(ALL)
        parcours2()
     
    def passer_de_niveau2():  
     
        "parcours numéro 3"
     
        can1.delete(ALL)
        parcours3()
     
     
     
    def dep1_gauche(event=None):
        global sx, sy
        sx = -1
        sy = 0
     
    def dep1_droite(event=None):
        global sx, sy
        sx = 1
        sy = 0
     
    def dep1_haut(event=None):
        global sy, sx
        sy = -1
        sx = 0
     
    def dep1_bas(event=None):
        global sy, sx
        sy = 1
        sx = 0
     
    def start_it():
     
        animation_de_depart()
     
     
     
    # les variables suivantes seront utilisees de maniere globale:
     
    dep = 5         # valeur de deplacement
    sx, sy = 1, 0   # sens de deplacement
     
     
    # carre de depart
    x1, y1 = 50, 50
    x2, y2 = 100, 100
     
    # diametre balle
    diametre = 5
     
    # coordonnees initiales de la balle
    X = (x1 + x2 - diametre) / 2
    Y = (y1 + y2 - diametre) / 2
     
    # Creation du widget principal ("maitre"):
    fen1 = Tk()
    fen1.title("Super Ball")
     
    # creation des widgets "esclaves":
    can1 = Canvas(fen1, bg='white', height=500, width=500)
    can1.pack(side=LEFT)
     
    # dessin parcours no. 1
    can1.create_rectangle(x1, y1, x2, y2) # dessine le rectangle de départ
    fin1 = can1.create_rectangle(120, 280, 170, 335) # dessine le rectangle d'arrivé
    polygone1 = [100, 65, 420, 65], [100, 85, 400, 85]
    #can1.create_line(*polygone1[0], fill='red', width=4) # ligne 1
    #can1.create_line(*polygone1[1], fill='red', width=4) # ligne 2
    can1.create_line(100, 65, 160, 65, fill='medium sea green', width=4) # ligne 1
    can1.create_line(100, 85, 140, 85, fill='medium sea green', width=4) # ligne 2
    can1.create_line(140, 85, 140, 280, fill='medium sea green', width=4) # ligne 3
    can1.create_line(160, 65, 160, 280, fill='medium sea green', width=4) # ligne 4
     
     
     
     
    def parcours2():
        global X,Y ,cerc1 ,fin2 ,polygone1 
        # dessin parcours no. 1
        can1.create_rectangle(x1, y1, x2, y2) # dessine le rectangle de départ
        fin2 = can1.create_rectangle(120, 280, 170, 335) # dessine le rectangle d'arrivé
        polygone1 = [100, 65, 420, 65], [100, 85, 400, 85]
        #can1.create_line(*polygone1[0], fill='red', width=4) # ligne 1
        #can1.create_line(*polygone1[1], fill='red', width=4) # ligne 2
        can1.create_line(100, 65, 420, 65, fill='red', width=4) # ligne 3
        can1.create_line(100, 85, 400, 85, fill='red', width=4) # ligne 3
        can1.create_line(400, 85, 400, 300, fill='red', width=4) # ligne 3
        can1.create_line(420, 65, 420, 320, fill='red', width=4) # ligne 4
        can1.create_line(170, 320, 420, 320, fill='red', width=4) # ligne 5
        can1.create_line(170, 300, 400, 300, fill='red', width=4) # ligne 6
     
        X = (x1 + x2 - diametre) / 2
        Y = (y1 + y2 - diametre) / 2
     
        cerc1 = can1.create_oval(X, Y, X + diametre, Y + diametre, fill='grey')
     
     
     
     
    def parcours3():
        global X, Y, cerc1, fin3
     
        can1.create_rectangle(50,50,100,100) #dessine un rectangle
        fin3=can1.create_rectangle(370,370,420,420)
     
        #trace du nouveau parcours :
        polygone1 = [100,65,420,65], [100,85,400,85]    
        can1.create_line(tuple(polygone1[0]),fill='orange',width=4)#ligne 1
        can1.create_line(tuple(polygone1[1]),fill='orange',width=4)#ligne 2
        can1.create_line(400,85,400,130,fill='orange',width=4)#ligne 3
        can1.create_line(420,65,420,150,fill='orange',width=4)#ligne 4
        can1.create_line(170,150,420,150,fill='orange',width=4)#ligne 5
        can1.create_line(150,130,400,130,fill='orange',width=4)#ligne 6
        can1.create_line(150,130,150,190,fill='orange',width=4)#ligne 7
        can1.create_line(170,150,170,220,fill='orange',width=4)#ligne 8
        can1.create_line(60,220,170,220,fill='orange',width=4)#ligne 9
        can1.create_line(30,190,150,190,fill='orange',width=4)#ligne 10
        can1.create_line(30,190,30,480,fill='orange',width=4)#ligne 11
        can1.create_line(60,220,60,450,fill='orange',width=4)#ligne 12
        can1.create_line(60,450,250,450,fill='orange',width=4)#ligne 13
        can1.create_line(30,480,270,480,fill='orange',width=4)#ligne 14
        can1.create_line(270,480,270,330,fill='orange',width=4)#ligne 15
        can1.create_line(250,450,250,310,fill='orange',width=4)#ligne 16
        can1.create_line(270,330,380,330,fill='orange',width=4)#ligne 17
        can1.create_line(250,310,400,310,fill='orange',width=4)#ligne 18
        can1.create_line(400,310,400,370,fill='orange',width=4)#ligne 19
        can1.create_line(380,330,380,370,fill='orange',width=4)#ligne 20
     
        X = (x1 + x2 - diametre) / 2
        Y = (y1 + y2 - diametre) / 2
     
        cerc1 = can1.create_oval(X, Y, X + diametre, Y + diametre, fill='grey')
     
     
    # dessin balle
    cerc1 = can1.create_oval(X, Y, X + diametre, Y + diametre, fill='green')
     
    # balle au premier plan d'affichage
    can1.tag_raise(cerc1, ALL)
    can1.update()
     
    # boutons à cliquer
     
     
    Button(fen1, text='Démarrer', bg='white',bd=8, relief="ridge", command=start_it).pack(side=BOTTOM)
    Button(fen1, text='Quitter', bg='cyan',bd=8, relief="ridge", command=fen1.destroy).pack(side=BOTTOM)
    Button(fen1, text='Gauche', bg='gold',bd=8, relief="ridge", command=dep1_gauche).pack()
    Button(fen1, text='Droite', bg='green',bd=8, relief="ridge", command=dep1_droite).pack()
    Button(fen1, text='Haut', bg='white',bd=8, relief="ridge", command=dep1_haut).pack()
    Button(fen1, text='Bas', bg='cyan',bd=8, relief="ridge", command=dep1_bas).pack()
    Button(fen1, text='Accélère!', bg='gold',bd=8, relief="ridge", command=start_it).pack(side=BOTTOM)
     
     
    # touches du clavier
    can1.bind_all("<z>", dep1_haut)
    can1.bind_all("<s>", dep1_bas)
    can1.bind_all("<d>", dep1_droite)
    can1.bind_all("<q>", dep1_gauche)
     
    # flèches du clavier
    can1.bind_all("<Up>", dep1_haut)
    can1.bind_all("<Down>", dep1_bas)
    can1.bind_all("<Left>", dep1_gauche)
    can1.bind_all("<Right>", dep1_droite)
     
     
    # démarrage du gestionnaire d'événements (boucle principale):
    fen1.mainloop()
    Ps : je me chargerais de modifier le premier parcours et de le mettre dans une fonction samedi , je n'ai pas trop eu le temps de m'y attarder et je préfère essayer de faire ca tout d'un coup histoire d'optimiser un peu mon temps

    Merci encore!!

  18. #78
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par FatP0ney Voir le message
    1- lorsque nous perdons, le bouton replay n’apparaît pas car il semblerait que ce que nous avons appelé "fin2" ne soit pas défini dans move ce qui ne me semble pas être le cas vu qu'il est dans global.
    Non, il ne suffit pas de déclarer une variable var avec global var pour qu'elle soit initialisée (mise à une valeur de départ).

    Pour éviter les mauvaises surprises, mettez une ligne du style :

    dans les initialisations de départ de votre script, déboguez tout ce qui ne va pas puis envisagez ensuite d'optimiser ce code.

    2- Lorsque l'on redémarre au second niveau notre balle se dirige vers le bas et non pas en ligne droite ce qui me semble bizarre :/
    il serait peut-être prudent de réinitialiser sx, sy aux valeurs que vous souhaitez dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def parcours2():
        global X,Y ,cerc1 ,fin2 ,polygone1
     
        global sx, sy
        # on remet les valeurs de départ
        sx, sy = 1, 0
     
        # dessin parcours no. 1
        can1.create_rectangle(x1, y1, x2, y2) # dessine le rectangle de départ
        fin2 = can1.create_rectangle(120, 280, 170, 335) # dessine le rectangle d'arrivé
        polygone1 = [100, 65, 420, 65], [100, 85, 400, 85]
    idem pour parcours3() et pour replay().


    Ps : je me chargerais de modifier le premier parcours et de le mettre dans une fonction samedi , je n'ai pas trop eu le temps de m'y attarder et je préfère essayer de faire ca tout d'un coup histoire d'optimiser un peu mon temps

    Merci encore!!
    Si j'ai un conseil à vous donner : arrêtez d'ajouter des nouveautés à votre programme à moins d'une semaine des épreuves et commencez à optimiser votre code pour que non seulement il fonctionne correctement, mais aussi pour qu'il soit suffisamment commenté et optimisé.

    Bref, mieux vaut un script court mais fonctionnel, efficace et bien documenté, qu'une logorrhée de plusieurs kilomètres qui plante à tout bout de champ.

    Bon courage.

    @+.

  19. #79
    Nouveau membre du Club
    Homme Profil pro
    Travail
    Inscrit en
    Avril 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Travail

    Informations forums :
    Inscription : Avril 2014
    Messages : 45
    Points : 34
    Points
    34
    Par défaut
    Effectivement je me promet de m’arrêter la à propos de nouveautés je pense que ça devrait suffire.

    Néanmoins même en rajoutant ces élément le beug du déplacement de la balle vers le bas au début reste le même , en général , après 2 ou 3 tentatives de relance , la balle se dirige vers le bas au lieu de continuer son chemin vers la droite.

    Deplus , lorsque ces modifications sont faites , il arrive que game over s'affiche au lieu de bravo, nous forçant à recommencer .

    J'ai essayé de revenir sur ma dernière sauvegarde en me disant qu'il serait plus prudent de laisser tomber ces nouveautés mais je ne comprends pas pourquoi j'ai le même problème aussi sur cette dernière.

    Merci

  20. #80
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par FatP0ney Voir le message
    Effectivement je me promet de m’arrêter la à propos de nouveautés je pense que ça devrait suffire.

    Néanmoins même en rajoutant ces élément le beug du déplacement de la balle vers le bas au début reste le même , en général , après 2 ou 3 tentatives de relance , la balle se dirige vers le bas au lieu de continuer son chemin vers la droite.

    Deplus , lorsque ces modifications sont faites , il arrive que game over s'affiche au lieu de bravo, nous forçant à recommencer .

    J'ai essayé de revenir sur ma dernière sauvegarde en me disant qu'il serait plus prudent de laisser tomber ces nouveautés mais je ne comprends pas pourquoi j'ai le même problème aussi sur cette dernière.

    Merci
    Pourriez-vous republier le code modifié que je puisse voir, svp ?

Discussions similaires

  1. Problème avec l'animation d'une balle
    Par Arkey24 dans le forum GUI
    Réponses: 1
    Dernier message: 15/04/2014, 15h21
  2. Réponses: 4
    Dernier message: 11/05/2007, 19h45
  3. Réponses: 6
    Dernier message: 21/03/2005, 13h22
  4. Réponses: 6
    Dernier message: 14/12/2004, 02h47
  5. [Composants][Animation] Lire une vidéo compressée
    Par femtosa dans le forum Composants VCL
    Réponses: 6
    Dernier message: 03/09/2002, 08h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo