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

Programmation multimédia/Jeux Python Discussion :

Problème de Serpent sur Python


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Problème de Serpent sur Python
    Bonsoir bonsoir,
    J'ai programmé un Snake sur Python (cela va de soit) sauf qu'il est presque terminé mais que je bloque sur un problème que je n'arrive pas à résoudre et dont j'ai peur qu'il n'y ai pas de solution. J'utilise Tkinter et je n'arrive pas à faire avancer le serpent tout seul c'est dire sans que j'appuie sur une touche du clavier. J'ai l'impression que c'est soit il avance tout seul en ligne droite soit je dois appuyer à chaque fois sur le clavier pour le faire avancer et changer de direction. Voilà le programme :

    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
     
    from tkinter import *
    from math import *
    from random import *
     
    def serpent():
        global S,apple,i
        destruct()
        S.append([x,y])
        can.create_oval(S[len(S)-1][0],S[len(S)-1][1],S[len(S)-1][0],S[len(S)-1][1],width=10,outline='violet')
     
     
        #can.create_oval(x-r,y-r,x+r,y+r,outline='yellow',width=...)
     
    def destruct():
        global apple2
        if apple2!=0:
            can.create_oval(S[0][0],S[0][1],S[0][0],S[0][1],width=10,outline='green')
            S.pop(0)
        apple2=1
     
    def dirnb1(event):
        global dir2
        if dir2!=1:
            dir2=-1
        avancer()
     
    def dirnb2(event):
        global dir2
        if dir2!=-1:
            dir2=1
        avancer()
     
    def dirnb3(event):
        global dir2
        if dir2!=2:
            dir2=-2
        avancer()
     
    def dirnb4(event):
        global dir2
        if dir2!=-2:
            dir2=2
        avancer()
     
     
    def tete():
        global x,y
        if dir2==1:
            x=x+10
        if dir2==-1:
            x=x-10
        if dir2==2:
            y=y+10
        if dir2==-2:
            y=y-10
     
     
     
    def pomme():
        global a,b,apple,apple2
        if 'a' in globals() and 'b' in globals():
            can.create_oval(a,b,a,b,width=10,outline='green')
        a=randint(5,495)
        b=randint(5,495)
        can.create_oval(a,b,a,b,width=10,outline='red')
     
        apple=1
        apple2=0
     
     
    def avancer():
        global apple
        if apple==5:
            pomme()
        #La tête avance
        tete()
        #Le corps avance
        serpent()
        print('x=',x,'y=',y)
     
        #test de la pomme mangée ou pas
        if x>=a-5 and x<=a+5 and y>=b-5 and y<=b+5:
            apple=0
        if apple==0:
            pomme()
     
    #========Programme Principal===========
     
    #Initialisation        
    #dir: 1: ==>  -1:<==   2:vers le haut -2:vers le bas   
    dir2=int(1)
    apple=int(5)
    #x,y coordonnées de la tête du serpent
    x,y=int(540),int(400)
    fen=Tk()
    can=Canvas(fen,bg='green',height=600,width=700)
    can.pack()
     
    #création de barrières
    can.create_line(10,10,1190,10,width=10,fill='white')
    can.create_line(10,10,10,790,width=10,fill='white')
    can.create_line(10,790,1190,790,width=10,fill='white')
    can.create_line(1190,10,1190,790,width=10,fill='white')
     
    #S: liste des coordonnées de points qui constituent le serpent
    S=[[500,400],[510,400],[520,400],[530,400],[540,400]]
    oi=can.create_oval(S[0][0],S[0][1],S[0][0],S[0][1],width=10,outline='light yellow')
    for h in range(1,len(S)):
        oi=can.create_oval(S[h][0],S[h][1],S[h][0],S[h][1],width=10,outline='yellow')
     
    #Réceptionneur d'evts
    touche=Entry(fen)
    touche.pack(side=LEFT)
    touche.bind('<Left>', dirnb1)
    touche.bind('<Right>', dirnb2)
    touche.bind('<Up>', dirnb3)
    touche.bind('<Down>', dirnb4)
    Pas la peine de tout lire je pense, je voudrai qu'il y ai récurrence des fonctions tete() et serpent() tant que je n'appuie sur rien. Après plusieurs essais, je me demande en fait si c'est possible. Voilà si vous avez une idée pour me sortir de l'impasse, je vous en serai très reconnaissant

    NovaVI

    NB il y aura peut-être des adaptations à faire en fonction des systèmes d'exploitation si vous voulez le faire fonctionner

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 442
    Points : 37 034
    Points
    37 034
    Par défaut
    Salut,

    Citation Envoyé par NovaVI Voir le message
    Après plusieurs essais, je me demande en fait si c'est possible. Voilà si vous avez une idée pour me sortir de l'impasse, je vous en serai très reconnaissant
    Douter qu'un ordinateur puisse lancer une action a intervalles réguliers?
    Hu?!? Dans le tutoriel prefere, vous avez des exemples de réalisation d'animation avec Tk.
    Bonne lecture,
    - W

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Je pense que j'ai mal expliqué:
    je veux que le gestionnaire d'événement puisse recevoir une commande (changer de direction) tout en ayant une boucle qui permette au serpent d'avancer. Le problème que je rencontre, c'est que dès que je lance la boucle pour le faire avancer, il est impossible d'envoyer une commande au gestionnaire d'événement.

    Merci pour le tuto Swinnen, j'avais déjà pas mal lu la section sur Tkinter mais elle ne répond qu'aux commandes extérieures ou aux animations récursives, pas les deux en même temps.

    Peut-être que je cherche un peu compliqué mais bon je bricole avec ce que j'ai !

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 442
    Points : 37 034
    Points
    37 034
    Par défaut
    Reprenez l'exemple du Swinnen, les animations passent par une utilisation judicieuse de la méthode .after. Essayez de comprendre comment ça fonctionne et essayez de l'utiliser dans votre code.

    - W

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Cool ! Merci beaucoup c'est la méthode qui me manquait, j'ai lu un peu trop en biais le tuto ...
    Le serpent coure de plus en plus vite mais c'est amusant. Enfin bref quelques réglages suffiront. Merci encore !

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 442
    Points : 37 034
    Points
    37 034
    Par défaut
    Citation Envoyé par NovaVI Voir le message
    Le serpent coure de plus en plus vite mais c'est amusant. Enfin bref quelques réglages suffiront. Merci encore !
    Sauf bug dans votre code, il ne devrait pas courir de "plus en plus vite".
    - W

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    En fait je créais une boucle dans une boucle en changeant de direction. J'ai résolu le problème en stoppant la boucle précédente avec deux indices mvt (nombres de changement de direction) et h (un indice décalé de -1 à chaque changement de direction puis revient à la même valeur que mvt).

Discussions similaires

  1. Problème avec fonction tuple sur Python 3.4.1
    Par inconnito2 dans le forum Général Python
    Réponses: 4
    Dernier message: 28/12/2014, 13h57
  2. problème sur python 3.3
    Par bosskev62 dans le forum Général Python
    Réponses: 1
    Dernier message: 09/11/2014, 19h35
  3. Problème de commandes sur Tkinter (Python)
    Par Inariuss dans le forum Général Python
    Réponses: 4
    Dernier message: 14/05/2014, 21h03
  4. problème d'installation de python 2.7 sur windows 7
    Par stephane52 dans le forum Général Python
    Réponses: 1
    Dernier message: 27/02/2014, 09h26
  5. [CR] Problème de sélection sur un champ date
    Par noluc dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 21/11/2003, 17h56

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