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

Python Discussion :

Boucles Pygame (For)


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2016
    Messages : 5
    Par défaut Boucles Pygame (For)
    Bonjour à tous!

    Quelqu'un peut me dire ce qui ne va pas avec mes boucles?

    Chacune d'elles prends près de vingt secondes à se compléter alors que ça ne devrait en prendre que 8 au maximum.

    Merci d'avance.

    Nom : Hanoi.PNG
Affichages : 235
Taille : 59,2 Ko

  2. #2
    Membre chevronné Avatar de licardentaistor
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2021
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2021
    Messages : 345
    Par défaut
    je voulais copier ton code, mais avec un screenshot, pourquoi tu update à chaque tour de boucle et pour chaque boucle ?

    un simple update à la fin ne suffit pas?

  3. #3
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2016
    Messages : 5
    Par défaut
    Chaque boucle sert à placer les disques sur la colonne de départ. C'est une tour d'Hanoi!
    Je veux que chaque disque apparaisses avec 600ms de décalage c'est pour ça le update dans chaque boucle.
    Sinon, ils apparaissent tous d'un coup avec un update à la fin.

    J'ai remarqué que si j'insère un print pour voir la variable, je vois que la boucle s'exécute près de 20 fois au lieu du nombre donné par le joueur.

    J'ai collé le code mais je n'arrive pas à maintenir le formatage!

    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
    while True:
     
    #Capture de la réponse de l'utilisateur
        for event in pygame.event.get():
     
            if event.type == pygame.QUIT:
                pygame.quit()
                exit()
            if event.type == pygame.KEYDOWN:
     
                if event.key == pygame.K_BACKSPACE:
                    texte_util = texte_util[:-1]
                else:
                    texte_util += event.unicode
     
     
    #Affichage du nombre de disques selon réponse
            if texte_util == ('4'):
                nombre_de_disque_util = 4
                ps_verticale = 300
     
                for x in range  (1, (nombre_de_disque_util+1)):
                    screen.blit(formes[x], ((170+15)-(formes[x].get_width()/2),ps_verticale))
                    screen.blit(text_surface,(635,0))
                    pygame.display.update()
                    pygame.time.wait(600)
                    ps_verticale = ps_verticale - 30            
     
            if texte_util == ('5'):
                nombre_de_disque_util = 5
                ps_verticale = 300
     
                for x in range  (1, (nombre_de_disque_util+1)):
                    screen.blit(formes[x], ((170+15)-(formes[x].get_width()/2),ps_verticale))
                    pygame.display.update()
                    pygame.time.wait(600)
                    ps_verticale = ps_verticale - 30
     
            if texte_util == ('6'):
                nombre_de_disque_util = 6
                ps_verticale = 300
     
                for x in range  (1, (nombre_de_disque_util+1)):
                    screen.blit(formes[x], ((170+15)-(formes[x].get_width()/2),ps_verticale))
                    pygame.display.update()
                    pygame.time.wait(600)
                    ps_verticale = ps_verticale - 30
     
            if texte_util == ('7'):
                nombre_de_disque_util = 7
                ps_verticale = 300
     
                for x in range  (1, (nombre_de_disque_util+1)):
                    screen.blit(formes[x], ((170+15)-(formes[x].get_width()/2),ps_verticale))
                    pygame.display.update()
                    pygame.time.wait(600)
                    ps_verticale = ps_verticale - 30
     
            text_surface = base_font.render(texte_util,True,(255,255,255))
     
     
        pygame.display.update()

  4. #4
    Membre chevronné Avatar de licardentaistor
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2021
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2021
    Messages : 345
    Par défaut
    et en introduisant un booléen, car tu boucles à l'infini tant que l'utilisateur n'a pas changé texte_util c'est pour ç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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    deja_affiche = False  # Une nouvelle variable pour suivre si les disques ont déjà été affichés
     
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                exit()
     
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_BACKSPACE:
                    texte_util = texte_util[:-1]
                else:
                    texte_util += event.unicode
                deja_affiche = False  # Réinitialiser à chaque nouvelle saisie de l'utilisateur
     
        if not deja_affiche:  # Vérifier si les disques ont déjà été affichés
            if texte_util == '4':
                nombre_de_disque_util = 4
                ps_verticale = 300
     
                for x in range(1, nombre_de_disque_util + 1):
                    # Votre code ici pour afficher les disques
     
                deja_affiche = True  # Mettre à jour la variable à 'True' pour indiquer que les disques ont été affichés
     
            # Faites de même pour les autres valeurs ('5', '6', '7')

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 690
    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 690
    Par défaut
    Salut,

    Citation Envoyé par Irolaan_A Voir le message
    Quelqu'un peut me dire ce qui ne va pas avec mes boucles?
    Toutes vos boucles sont un copie/coller d'instructions où ne change que nombre_de_disque_util qui se calcule via int( texte_util). Ce qui ne facilite pas la lecture du code (pour comprendre ce qui ne va pas, ça aide!).

    Et dans la pratique, vous avez surtout un problème d'indentation!
    Il n'y a que lorsqu'on reçoit un keydown qu'on va (éventuellement) "bouger" les disques.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2016
    Messages : 5
    Par défaut
    Bonjour!

    Je sais que mon code est loin d'être parfait, je suis en ré-apprentissage du Python.

    J'en ai fait il y a quelques années, mais j'ai pratiquement tout oublié.

    Je ne connais pas encore touts les subtilités du langage!

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 814
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Irolaan_A Voir le message
    J'ai collé le code mais je n'arrive pas à maintenir le formatage!
    Balise [code] en début et [/code] à la fin
    Sinon quand tu écris ceci...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if texte_util=('4')   # Déjà là on sent immédiatement que tu as bien perçu l'utilité des parenthèses !!!
    	nb_disque=4
    	...tout un code de deplacement...
    if texte_util=('5')
    	nb_disque=5
    	...tout le même code à l identique...
    if texte_util=('6')
    	nb_disque=6
    	...tout le même code à l identique...
    etc etc...
    tu ne sens pas qu'il y a là un gros souci de factorisation ? Au moment où tu écris ce même code encore et encore tu ne te dis pas que programmer c'est commencer par réfléchir ???

    Hanoi c'est déplacer n disques. Donc tu écris une fois comment déplacer un disque et tu appliques n fois ce déplacement.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2016
    Messages : 5
    Par défaut
    Comme je disais ça fait très longtemps que je n'ai pas codé en Python (plus de 20 ans), faut me laisser une chance de réapprendre.
    Hier soir, j'ai révisé et je suis arrivé à cette version plus compacte et corrigé.
    Mais la boucle prends toujours près de 20 secondes à se compléter.

    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
    deja_affiche = False  # Une nouvelle variable pour suivre si les disques ont déjà été affichés
     
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                exit()
     
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_BACKSPACE:
                    texte_util = texte_util[:-1]
                else:
                    texte_util += event.unicode
                deja_affiche = False  # Réinitialiser à chaque nouvelle saisie de l'utilisateur
     
     
    #Affichage du nombre de disques selon réponse
            ps_verticale = 300
            if texte_util == '4':
                nombre_de_disque_util = 4
            if texte_util == '5':
                nombre_de_disque_util = 5
            if texte_util == '6':
                nombre_de_disque_util = 6
            if texte_util == '7':
                nombre_de_disque_util = 7
     
     
            for x in range  (1, (nombre_de_disque_util+1)):
                text_surface = base_font.render(texte_util,True,(255,255,255))
                screen.blit(formes[x], ((170+15)-(formes[x].get_width()/2),ps_verticale))
                screen.blit(text_surface,(635,0))
                pygame.display.update()
                pygame.time.wait(500)
                ps_verticale = ps_verticale - 30   
                deja_affiche = True 
     
     
     
        pygame.display.update()

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 814
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Irolaan_A Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            if texte_util == '4':
                nombre_de_disque_util = 4
            if texte_util == '5':
                nombre_de_disque_util = 5
            if texte_util == '6':
                nombre_de_disque_util = 6
            if texte_util == '7':
                nombre_de_disque_util = 7
    Avec des "elif" ça optimise (si le premier test est ok, il ne fait pas les autres). Tu as aussi match qui vient d'arriver sur le marché (équivalent d'un switch/case C). Mais pour ce cas précis, on peut y aller directement: if text_util in "4567": nombre_de_disque_util = int(text_util). Et pour les plus faignants (le développeur est faignant et c'est ce qui fait sa force) on peut remplacer "4567" par map(str, range(4, 8)).

    Citation Envoyé par Irolaan_A Voir le message
    Mais la boucle prends toujours près de 20 secondes à se compléter.
    Et si tu réduis le time.wait(500) ?
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2016
    Messages : 5
    Par défaut
    J'utilise la commande time.wait(500) pour que les disques s'affiche un par demi-seconde.
    Si je réduis ce délais (100) , la boucle prends toujours autant de temps. Si j'enlève cette commande, elle se termine comme elle doit, mais les disques s'affichent tous en même temps.
    En bas de 30ms, le délais est acceptable, mais ce n'est pas ce que je veux faire.

  11. #11
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 814
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Irolaan_A Voir le message
    J'ai remarqué que si j'insère un print pour voir la variable, je vois que la boucle s'exécute près de 20 fois au lieu du nombre donné par le joueur.
    Il n'y aurait pas une piste à creuser ? Si à la base tu veux boucler jusqu'à n et que tu boucles jusqu'à 20 le minimum c'est de régler ce souci préalable non ?
    Et t'as essayé de chronométrer à l'estime l'affichage des print? Parce que si chaque print s'affiche avec une seconde d'écart avec le précédent, et que ta boucle tourne 20 fois, quelque part il y a un lien.
    De là tu peux essayer de remonter à savoir ensuite pourquoi le traitement interne (entre deux tours de boucles) prend 1 seconde. En inhibant certaines instructions tu peux arriver à trouver l'origine du délai.

    Mais avant de s'attaquer au délai de traitement, il faut d'abord avoir un traitement correct. Donc régler le souci du "je veux boucler 5 fois et je boucle 20 fois"...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #12
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 690
    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 690
    Par défaut
    Citation Envoyé par Irolaan_A Voir le message
    Hier soir, j'ai révisé et je suis arrivé à cette version plus compacte et corrigé.
    Mais la boucle prends toujours près de 20 secondes à se compléter.
    S'il y a le même problème, c'est que vous n'avez pas appliqué correctement une des solutions proposées et que quelque part, vous n'avez pas trop compris la nature du problème.

    Dans la version proposée:
    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
    deja_affiche = False  # Une nouvelle variable pour suivre si les disques ont déjà été affichés
     
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                exit()
     
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_BACKSPACE:
                    texte_util = texte_util[:-1]
                else:
                    texte_util += event.unicode
                deja_affiche = False  # Réinitialiser à chaque nouvelle saisie de l'utilisateur
     
     
    #Affichage du nombre de disques selon réponse
            ps_verticale = 300
            if texte_util == '4':
                nombre_de_disque_util = 4
            if texte_util == '5':
                nombre_de_disque_util = 5
            if texte_util == '6':
                nombre_de_disque_util = 6
            if texte_util == '7':
                nombre_de_disque_util = 7
     
     
            for x in range  (1, (nombre_de_disque_util+1)):
                text_surface = base_font.render(texte_util,True,(255,255,255))
                screen.blit(formes[x], ((170+15)-(formes[x].get_width()/2),ps_verticale))
                screen.blit(text_surface,(635,0))
                pygame.display.update()
                pygame.time.wait(500)
                ps_verticale = ps_verticale - 30   
                deja_affiche = True 
     
        pygame.display.update()
    à quoi sert la variable deja_affiche puisque vous vous contentez de lui assigner une nouvelle valeur sans jamais rien tester?
    Si on teste, çà donnerait:
    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
    deja_affiche = False  # Une nouvelle variable pour suivre si les disques ont déjà été affichés
     
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                exit()
     
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_BACKSPACE:
                    texte_util = texte_util[:-1]
                else:
                    texte_util += event.unicode
                deja_affiche = False  # Réinitialiser à chaque nouvelle saisie de l'utilisateur
     
     
    #Affichage du nombre de disques selon réponse
            if deja_affiche:
                ps_verticale = 300
                nombre_de_disque_util = int(texte_util)
                ...
                for x in range  (1, (nombre_de_disque_util+1)):
                ...            
                deja_affiche = True 
     
        pygame.display.update()
    Et normalement, vous devriez vous rendre compte que cette variable ne sert à rien, i.e. on peut tout aussi bien écrire:
    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
    #deja_affiche = False  # Une nouvelle variable pour suivre si les disques ont déjà été affichés
     
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                exit()
     
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_BACKSPACE:
                    texte_util = texte_util[:-1]
                else:
                    texte_util += event.unicode
                #deja_affiche = False  # Réinitialiser à chaque nouvelle saisie de l'utilisateur
     
     
    #Affichage du nombre de disques selon réponse
            #if deja_affiche:
                ps_verticale = 300
                nombre_de_disque_util = int(texte_util)
                ...
                for x in range  (1, (nombre_de_disque_util+1)):
                ...            
                #deja_affiche = True 
     
        pygame.display.update()
    Tout çà parce qu'on a poussé les instructions qui font le déplacement dans le bloc ouvert par le if event.type == pygame.KEYDOWN:

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Problème de boucle avec for
    Par ions dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 20/11/2007, 08h58
  2. boucles while/for : syntaxe incompréhensible
    Par Loceka dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 14/12/2006, 21h04
  3. Boucle infinie for
    Par shnouf dans le forum Langage
    Réponses: 5
    Dernier message: 25/10/2006, 18h46
  4. boucle <xsl:for-each>
    Par Mike35 dans le forum XSL/XSLT/XPATH
    Réponses: 17
    Dernier message: 13/02/2006, 11h58

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