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.
![]()
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.
![]()
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?
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()
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')
Salut,
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
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!
Bonjour
Balise [code] en début et [/code] à la fin
Sinon quand tu écris ceci...
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 ???
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...
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]
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()
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)).
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]
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.
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]
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:
à quoi sert la variable deja_affiche puisque vous vous contentez de lui assigner une nouvelle valeur sans jamais rien tester?
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()
Si on teste, çà donnerait:
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:
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()
- W
Partager