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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 244
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
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    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]

  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
    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()

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    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]

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    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

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    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

  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
    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!

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