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 snake tkinter


Sujet :

Tkinter Python

  1. #141
    Membre du Club
    Femme Profil pro
    Lycéen
    Inscrit en
    Février 2014
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2014
    Messages : 183
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par tarball69 Voir le message
    tout simplement comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def game_over():
        """ c'est fini ! """
     
        import tkMessageBox
     
        tkMessageBox.showinfo(
            "C'est fini !",
            "Perdu ! Vous avez mangé {nb} ronds !".format(nb=nb_rond),
            parent=fenetre,
        )
     
        fenetre.destroy()
     
    # end def
    fallait y penser !

    l'intérêt d'utiliser une fenêtre de dialogue, c'est que cette fenêtre de dialogue bloque la fenêtre parente tant qu'on n'a pas cliqué sur le bouton "OK" => du coup, le code de la fenêtre parente n'est pas exécuté tant que la fenêtre de dialogue n'a pas fini.

    simple, non ?
    c'est vrai on cherche toujours trop compliqué !

    il y a un autre detail a regler ! comment faire pour que les rond ne soient pas trop pres et meme sur les obstacles ?

  2. #142
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par man0n Voir le message
    c'est vrai on cherche toujours trop compliqué !

    il y a un autre detail a regler ! comment faire pour que les rond ne soient pas trop pres et meme sur les obstacles ?
    vous voulez faire vite ou vous voulez réfléchir à la question ?

  3. #143
    Membre du Club
    Femme Profil pro
    Lycéen
    Inscrit en
    Février 2014
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2014
    Messages : 183
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par tarball69 Voir le message
    vous voulez faire vite ou vous voulez réfléchir à la question ?
    je veux bien y reflechir ca m'aide a apprendre quand vous medonnez des pistes de reflexion

  4. #144
    Membre du Club
    Femme Profil pro
    Lycéen
    Inscrit en
    Février 2014
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2014
    Messages : 183
    Points : 64
    Points
    64
    Par défaut
    j'au voulu rajouter des consignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #infos 
    Label(fenetre, text="Cliquez sur 'New Game' pour commencer. Jouez avec les fleches du clavier. Attrapez les ronds verts et evitez les rectangles noirs. A vous de jouer !").pack(padx=0, pady=11)
    mais du coup ca me fait une fentre trop large... comment revenir a la ligne ?

  5. #145
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par man0n Voir le message
    je veux bien y reflechir ca m'aide a apprendre quand vous medonnez des pistes de reflexion
    OK, donc on sait déjà que ce problème va se résoudre dans la fonction new_rond(), puisque c'est là-dedans qu'on crée le rond.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def new_rond ():#faire apparaitre un nouveau rond
        global rondX, rondY, id_rond
        # création de l'objet à attraper
        rondX = randrange(5, 495)
        rondY = randrange(5, 495)
        id_rond = canevas.create_oval(rondX, rondY, rondX+5, rondY+5, outline='white', fill='green')
    # end def
    Ensuite que nous faut-il ?

    1. des coordonnées (rondX, rondY) tirées au hasard
    2. vérifier qu'il n'y a rien dans les alentours de (rondX, rondY)
    3. s'il n'y a rien => placer le rond
    4. s'il y a quelquechose : recommencer à l'étape 1


    on appelle ça une boucle : on part d'un point A, on passe par divers points B, C, D, puis on revient au point A tant que le problème n'est pas résolu.

    comment pourrait-on traduire ça en code Python dans la fonction new_rond() ?

  6. #146
    Membre du Club
    Femme Profil pro
    Lycéen
    Inscrit en
    Février 2014
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2014
    Messages : 183
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par tarball69 Voir le message
    OK, donc on sait déjà que ce problème va se résoudre dans la fonction new_rond(), puisque c'est là-dedans qu'on crée le rond.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def new_rond ():#faire apparaitre un nouveau rond
        global rondX, rondY, id_rond
        # création de l'objet à attraper
        rondX = randrange(5, 495)
        rondY = randrange(5, 495)
        id_rond = canevas.create_oval(rondX, rondY, rondX+5, rondY+5, outline='white', fill='green')
    # end def
    Ensuite que nous faut-il ?

    1. des coordonnées (rondX, rondY) tirées au hasard
    2. vérifier qu'il n'y a rien dans les alentours de (rondX, rondY)
    3. s'il n'y a rien => placer le rond
    4. s'il y a quelquechose : recommencer à l'étape 1


    on appelle ça une boucle : on part d'un point A, on passe par divers points B, C, D, puis on revient au point A tant que le problème n'est pas résolu.

    comment pourrait-on traduire ça en code Python dans la fonction new_rond() ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    rondX = randrange(5, 495)
        rondY = randrange(5, 495)
    if (rondX, rond Y) = 0:
       id_rond = canevas.create_oval(rondX, rondY, rondX+5, rondY+5, outline='white', fill='green')
    else:
    #???

  7. #147
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par man0n Voir le message
    j'au voulu rajouter des consignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #infos 
    Label(fenetre, text="Cliquez sur 'New Game' pour commencer. Jouez avec les fleches du clavier. Attrapez les ronds verts et evitez les rectangles noirs. A vous de jouer !").pack(padx=0, pady=11)
    mais du coup ca me fait une fentre trop large... comment revenir a la ligne ?
    Pour les textes avec retour à la ligne, utilisez l'objet tkinter.Message() au lieu de l'objet tkinter.Label() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #infos
    Message(
        fenetre,
        text="Cliquez sur 'New Game' pour commencer.\n"
                "Jouez avec les fleches du clavier.\n"
                "Attrapez les ronds verts et evitez "
                "les rectangles noirs.\n"
                "A vous de jouer !",
        width=350,
     
    ).pack(pady=5)
    on essaie de ne pas trop se disperser ?

    concentrons-nous sur la fonction new_rond()...

  8. #148
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par man0n Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    rondX = randrange(5, 495)
        rondY = randrange(5, 495)
    if (rondX, rond Y) = 0:
       id_rond = canevas.create_oval(rondX, rondY, rondX+5, rondY+5, outline='white', fill='green')
    else:
    #???
    meurf ! on a déjà vu quelque part dans le script un moyen de détecter des canvasItems dans une zone donnée.

    vous vous souvenez où ?

  9. #149
    Membre du Club
    Femme Profil pro
    Lycéen
    Inscrit en
    Février 2014
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2014
    Messages : 183
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par tarball69 Voir le message
    on essaie de ne pas trop se disperser ?

    concentrons-nous sur la fonction new_rond()...
    oui il ne reste que ca de toute facon

  10. #150
    Membre du Club
    Femme Profil pro
    Lycéen
    Inscrit en
    Février 2014
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2014
    Messages : 183
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par tarball69 Voir le message
    meurf ! on a déjà vu quelque part dans le script un moyen de détecter des canvasItems dans une zone donnée.

    vous vous souvenez où ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # détection de collisions
        d = dep//4
        collisions = canevas.find_overlapping(carreX-d, carreY-d, carreX+10+d, carreY+10+d)

  11. #151
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par man0n Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # détection de collisions
        d = dep//4
        collisions = canevas.find_overlapping(carreX-d, carreY-d, carreX+10+d, carreY+10+d)
    YEAH ! Bravo !

    donc canevas.find_overlapping() nous permet de détecter des objets qui ont au moins une intersection avec la zone de coordonnées (x1, y1, x2, y2) avec (x1, y1) le coin supérieur gauche du rectangle imaginaire de la zone et (x2, y2) le coin inférieur droit de cette zone.

    comment pourrait-on adapter ce concept pour la fonction new_rond() ?

  12. #152
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par tarball69 Voir le message
    Pour les textes avec retour à la ligne, utilisez l'objet tkinter.Message() au lieu de l'objet tkinter.Label() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #infos
    Message(
        fenetre,
        text="Cliquez sur 'New Game' pour commencer.\n"
                "Jouez avec les fleches du clavier.\n"
                "Attrapez les ronds verts et evitez "
                "les rectangles noirs.\n"
                "A vous de jouer !",
        width=350,
     
    ).pack(pady=5)
    au temps pour moi, je dis des bêtises : on peut utiliser tkinter.Label() pour des textes à lignes multiples :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #infos
    Label(
        fenetre,
        text="Cliquez sur 'New Game' pour commencer.\n"
                "Jouez avec les fleches du clavier.\n"
                "Attrapez les ronds verts et evitez "
                "les rectangles noirs.\n"
                "A vous de jouer !",
        justify=LEFT,
     
    ).pack(pady=5)
    c'est peut-être plus simple pour vous, avec Label().

  13. #153
    Membre du Club
    Femme Profil pro
    Lycéen
    Inscrit en
    Février 2014
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2014
    Messages : 183
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par tarball69 Voir le message
    YEAH ! Bravo !

    donc canevas.find_overlapping() nous permet de détecter des objets qui ont au moins une intersection avec la zone de coordonnées (x1, y1, x2, y2) avec (x1, y1) le coin supérieur gauche du rectangle imaginaire de la zone et (x2, y2) le coin inférieur droit de cette zone.

    comment pourrait-on adapter ce concept pour la fonction new_rond() ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    rondX = randrange(5, 495)
        rondY = randrange(5, 495)
    if canevas.find_overlapping(rectX, rectY, rectX+20, rectY+10)
       id_rond = canevas.create_oval(rondX, rondY, rondX+5, rondY+5, outline='white', fill='green')
    else:
    #???

  14. #154
    Membre du Club
    Femme Profil pro
    Lycéen
    Inscrit en
    Février 2014
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2014
    Messages : 183
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par tarball69 Voir le message
    au temps pour moi, je dis des bêtises : on peut utiliser tkinter.Label() pour des textes à lignes multiples :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #infos
    Label(
        fenetre,
        text="Cliquez sur 'New Game' pour commencer.\n"
                "Jouez avec les fleches du clavier.\n"
                "Attrapez les ronds verts et evitez "
                "les rectangles noirs.\n"
                "A vous de jouer !",
        justify=LEFT,
     
    ).pack(pady=5)
    c'est peut-être plus simple pour vous, avec Label().
    je ne trouvespas que ca change grand chose

  15. #155
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par man0n Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    rondX = randrange(5, 495)
        rondY = randrange(5, 495)
    if canevas.find_overlapping(rectX, rectY, rectX+20, rectY+10)
       id_rond = canevas.create_oval(rondX, rondY, rondX+5, rondY+5, outline='white', fill='green')
    else:
    #???
    Ligne 2 : attention aux tabulations, Python y est très sensible !

    Oui, c'est pas mal.

    N'oubliez pas que (rectX, rectY) sont les coordonnées d'un rectangle et que nous, nous travaillons avec (rondX, rondY) pour l'instant.

  16. #156
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par man0n Voir le message
    je ne trouvespas que ca change grand chose
    Non, mais ça vous évite d'apprendre un nouvel objet tkinter.Message() pour rien.

  17. #157
    Membre du Club
    Femme Profil pro
    Lycéen
    Inscrit en
    Février 2014
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2014
    Messages : 183
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par tarball69 Voir le message
    Ligne 2 : attention aux tabulations, Python y est très sensible !

    Oui, c'est pas mal.

    N'oubliez pas que (rectX, rectY) sont les coordonnées d'un rectangle et que nous, nous travaillons avec (rondX, rondY) pour l'instant.
    oui mais c'est le rectangle qu'on cherche a detecter ...

    (pour les tabulations c'est juste le copier coller sur el forum je ne l'aurai pas laissé comme ca sur python

  18. #158
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par man0n Voir le message
    oui mais c'est le rectangle qu'on cherche a detecter ...
    il faut être plus rigoureuse que ça, manon : j'ai dit que la zone de détection était un rectangle imaginaire de coordonnées (x1, y1, x2, y2).

    si vous prenez un point P(x, y) sur un plan orthonormé (i, j), vous pouvez bien tracer un rectangle imaginaire de points H(x-20, y-20) et L(x+20, y+20) tout autour de ce point P, sachant que H représente le coin supérieur gauche de ce rectangle imaginaire et L le coin inférieur droit de ce rectangle imaginaire.

    faites un petit croquis sur un bout de papier, ça vous aidera à y voir plus clair.

    par conséquent, pourquoi ne pourrions-nous pas exploiter les coordonnées (rondX, rondY) pour en tirer un rectangle imaginaire de coin supérieur gauche H(rondX-20, rondY-20) et de coin inférieur droit L(rondX+20, rondY+20) ?

  19. #159
    Membre du Club
    Femme Profil pro
    Lycéen
    Inscrit en
    Février 2014
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2014
    Messages : 183
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par tarball69 Voir le message
    il faut être plus rigoureuse que ça, manon : j'ai dit que la zone de détection était un rectangle imaginaire de coordonnées (x1, y1, x2, y2).

    si vous prenez un point P(x, y) sur un plan orthonormé (i, j), vous pouvez bien tracer un rectangle imaginaire de points H(x-20, y-20) et L(x+20, y+20) tout autour de ce point P, sachant que H représente le coin supérieur gauche de ce rectangle imaginaire et L le coin inférieur droit de ce rectangle imaginaire.

    faite un petit croquis sur un bout de papier, ça vous aidera à y voir plus clair.

    par conséquent, pourquoi ne pourrions-nous pas exploiter les coordonnées (rondX, rondY) pour en tirer un rectangle imaginaire de coin supérieur gauche H(rondX-20, rondY-20) et de coin inférieur droit L(rondX+20, rondY+20) ?
    desolée...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    rondX = randrange(5, 495)
        rondY = randrange(5, 495)
    if canevas.find_overlapping(rondX-20, rondY-20, rondX+20, rondY+20)
       id_rond = canevas.create_oval(rondX, rondY, rondX+5, rondY+5, outline='white', fill='green')
    else:

  20. #160
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par man0n Voir le message
    desolée...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    rondX = randrange(5, 495)
        rondY = randrange(5, 495)
    if canevas.find_overlapping(rondX-20, rondY-20, rondX+20, rondY+20)
       id_rond = canevas.create_oval(rondX, rondY, rondX+5, rondY+5, outline='white', fill='green')
    else:
    ligne 2 : est-ce que vous pourriez me remettre cette ligne 2 d'aplomb, svp ? pour l'instant, le code est faux si mal tabulé.

    ligne 3 : une condition if se termine toujours par ":"

    bon, on sait que canevas.find_overlapping(rondX-20, rondY-20, rondX+20, rondY+20) va nous retourner une liste d'identifiants IDs de tous les canvasItems qu'il détectera dans cette zone.

    si cette liste est vide, la condition if canevas.find_overlapping(rondX-20, rondY-20, rondX+20, rondY+20) vaudra False et donc le code qui suivra ne sera pas exécuté.

    a contrario, si cette liste est pleine, la condition if canevas.find_overlapping(rondX-20, rondY-20, rondX+20, rondY+20) vaudra True et donc le code qui suivra sera exécuté.

    or, nous, on veut justement pouvoir poser notre rond quand il n'y a rien dans les alentours de (rondX, rondY), autrement dit, on voudrait pouvoir tester quand la liste est vide et non pas quand elle est pleine.

    que doit-on changer dans cette condition pour que ça fonctionne ?

Discussions similaires

  1. Problème jeu snake Tkinter
    Par jojo41 dans le forum Tkinter
    Réponses: 0
    Dernier message: 14/05/2014, 15h18
  2. [CS4] jeu Snake avec notion des classes
    Par amineprog dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 29/12/2010, 14h00
  3. Jeu Snake
    Par slim_java dans le forum Téléchargez
    Réponses: 0
    Dernier message: 29/12/2010, 11h22
  4. Aide pour pouvoir ammeliorer mon jeu (Snake)
    Par kump_ dans le forum Projets
    Réponses: 24
    Dernier message: 13/08/2008, 02h26
  5. [ancien jeu] Snake deux joueur en ligne?
    Par Extra-Nitro dans le forum Web
    Réponses: 7
    Dernier message: 28/02/2007, 18h59

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