Pourtant, lorsque je demande à ma fonction print(i.note_x), cela fonctionne correctement...
J'ai tout de même rajouté le paramètre i, mais le problème persiste toujours...
Pourtant, lorsque je demande à ma fonction print(i.note_x), cela fonctionne correctement...
J'ai tout de même rajouté le paramètre i, mais le problème persiste toujours...
Ok, peut être j'ai mal interprété le code, ou que dans la partie non copiée, il y a la réponse à ce détail. Peu importe.
Dans la fonction Scoring :
Cela supprime toujours la note la plus basse, peu importe sa position. C'est pour ça, que vous devez passer la note à la fonction Scoring et faire un :
Code : Sélectionner tout - Visualiser dans une fenêtre à part del Liste_note[0] #Suppression de la Note que l'on vient de faire
Enfin, c'est ce que je pense.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Liste_node.remove(note)
Essayez de simplifier le code, d'avoir de meilleur nom de variables et aussi, peut être, d'éviter d'utiliser trop les variables globales (en les passant en paramètre au fonction qui en ont besoin).
Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi
Ma page sur DVP
Mon Portfolio
Qui connaît l'erreur, connaît la solution.
J'essaye de rendre mon code le plus clair possible avec les commentaires, cependant, la majorité des choses du code seront présentées et détaillées à l'oral, je ne peux donc pas mettre énormément de choses :/
Pour quelques détails rapides :
(Le Tps_spawn de la classe Note correspond au temps d'apparition de la Note. Par exemple, si Tps_spawn = 1000, on attend que Timer == 1000 pour faire apparaitre la Note)
Ensuite, la variable globale Check_Note permet d'afficher l'état de la Note plus tard, càd que si Check_Note == 0, alors la dernière Note est un "Miss" (ou un "0 pts"), un Check_Note == 1 est une Note "+50pts", etc...Elle permet l'affichage des scores visuellement, dans une autre boucle que j'ai omis de mettre (mais elle n'influence normalement en rien le problème)
Et enfin, les variables Nb_Miss, Nb_50 etc...sont juste des "compteurs" pour pouvoir afficher à la fin le nombre de Miss, 50 etc... que l'utilisateur a fait
En fait, pour les paramètres de fonctions et variables globales, j'utilise les variables globales surtout parce que je dois les réutiliser plus tard dans la boucle d'évènements. Je peux peut-être les transformer en paramètres de fonctions, mais j'avoue que je n'en vois pas vraiment l'utilité
En remplacant par
Cela me permet bien de supprimer la Note correspondant à la colonne, cependant, un autre problème tout aussi bizarre apparait :
Code : Sélectionner tout - Visualiser dans une fenêtre à part Liste_node.remove(note)
Supposons que l'on ait 2 Notes qui sont dans la même colonne. Lorsque j'appuie sur la touche du clavier correspondant, ce n'est pas que la 1ere Note de la colonne qui disparait, mais les 2 Notes de la colonne. Cela arrive environ 1 fois sur 10. Je soupçonne plus ou moins un problème sur le temps d'appui sur la touche, mais même après plusieurs tests, je n'en suis pas sur (je vois juste qu'appuyer très rapidement sur la touche diminue les chances de produire ce bug)
Mais supposons maintenant que l'on ait 3 Notes. Si j'appuie sur la touche du clavier, ce sont la 1ere et la 3e touche qui disparaisse, tandis que la 2e reste
Je suis désolé de ne pas pouvoir donner plus de détails quant à la nature du problème, j'avoue que cela me surprend...Normalement, la fonction n'est censée supprimer qu'un et un seul élément, je ne vois pas ou, quand, et comment peut-elle supprimer deux éléments, et donc exécuter la fonction Scoring 2 fois, et donc probablement exécuter la fonction Check_Colonne 2 fois, sachant pourtant que je n'ai rien mis pour que le programme comprenne la pression maintenue d'une touche...Est-ce du à la boucle For de la boucle d'évènements ?
Il n'y a pas eu de réels changements sur le code depuis la dernière fois, mis à la part le Liste_Note.remove
Un code clair, ce n'est pas que des commentaires. Surtout que les commentaires doivent expliquer des choses de manière générales et raconter exactement le code. Par exemple, le commentaire explique la pensée du programmeur (pourquoi il a écrit la ligne de cette façon), ou encore, il explique l'algorithme implémenté.
Le code est clair par les points suivants :
- code expliquant la réflexion, la façon de concevoir (oui, c'est abstrait comme explication) ;
- le nom des variable clair/précis/concis (on doit, juste en lisant le nom de la variable savoir exactement ce qu'elle fait) ;
- pareil pour le nom des fonctions ;
- des algorithmes simples. Des fonctions simples et logique. La fonction ne doit pas faire le café, mais simplement une tache unique et précise (genre, moudre le café) ;
- surement d'autres détails, mais là, je n'ai pas en tête.
Nommage des variables : vous mélangez le mot anglais et une abréviation française. De plus vous utilisez une notation inhabituelle/pas "belle" (subjectif encore une fois). On fait normalement du CamelCase : le nom de variable commence par une minuscule et chaque mot suivant dans le nom aura sa première lettre en majuscule.Pour quelques détails rapides :
(Le Tps_spawn de la classe Note correspond au temps d'apparition de la Note. Par exemple, si Tps_spawn = 1000, on attend que Timer == 1000 pour faire apparaitre la Note)
Donc votre variable je l'appèlerai : spawnTime. La première lettre une minuscule me dit direct que c'est une variable (dans le cas contraire, cela aurait été une classe ), et on voit, que c'est le temps à laquelle elle apparait.
Check_Note semble être le nom d'une fonction. Une fonction, c'est une action, donc une fonction, c'est un verbe. Une variable c'est un nom. Vous voyez, Check_Note (que j'appèlerai checkNote()), ça sent la fonction, mais pas chez vousEnsuite, la variable globale Check_Note permet d'afficher l'état de la Note plus tard, càd que si Check_Note == 0, alors la dernière Note est un "Miss" (ou un "0 pts"), un Check_Note == 1 est une Note "+50pts", etc...Elle permet l'affichage des scores visuellement, dans une autre boucle que j'ai omis de mettre (mais elle n'influence normalement en rien le problème)
De plus, il me semble, d'après l'explication, que en fait, cela contient un état (state), donc j'appèlerai ça : noteState.
Ok (juste nbMiss, nbMedium, nbGood, nbPerfect (par exemple)).Et enfin, les variables Nb_Miss, Nb_50 etc...sont juste des "compteurs" pour pouvoir afficher à la fin le nombre de Miss, 50 etc... que l'utilisateur a fait
Pour l'instant, les variables globales ça me va. En programmation, généralement, on évite (et il y a mille raisons pour ça), mais là, faisons au plus simple.En fait, pour les paramètres de fonctions et variables globales, j'utilise les variables globales surtout parce que je dois les réutiliser plus tard dans la boucle d'évènements. Je peux peut-être les transformer en paramètres de fonctions, mais j'avoue que je n'en vois pas vraiment l'utilité
Il est possible que cela supprime deux notes, car le jeu, il est dans une boucle. Ça veut dire que le programme va exécuter deux fois la même fonction et cela, plus rapidement que le joueur ait le temps de relacher la touche. Donc, pouf, deux notes en moins.En remplacant par
Cela me permet bien de supprimer la Note correspondant à la colonne, cependant, un autre problème tout aussi bizarre apparait :
Code : Sélectionner tout - Visualiser dans une fenêtre à part Liste_node.remove(note)
Supposons que l'on ait 2 Notes qui sont dans la même colonne. Lorsque j'appuie sur la touche du clavier correspondant, ce n'est pas que la 1ere Note de la colonne qui disparait, mais les 2 Notes de la colonne. Cela arrive environ 1 fois sur 10. Je soupçonne plus ou moins un problème sur le temps d'appui sur la touche, mais même après plusieurs tests, je n'en suis pas sur (je vois juste qu'appuyer très rapidement sur la touche diminue les chances de produire ce bug)
Mais supposons maintenant que l'on ait 3 Notes. Si j'appuie sur la touche du clavier, ce sont la 1ere et la 3e touche qui disparaisse, tandis que la 2e reste
Je suis désolé de ne pas pouvoir donner plus de détails quant à la nature du problème, j'avoue que cela me surprend...Normalement, la fonction n'est censée supprimer qu'un et un seul élément, je ne vois pas ou, quand, et comment peut-elle supprimer deux éléments, et donc exécuter la fonction Scoring 2 fois, et donc probablement exécuter la fonction Check_Colonne 2 fois, sachant pourtant que je n'ai rien mis pour que le programme comprenne la pression maintenue d'une touche...Est-ce du à la boucle For de la boucle d'évènements ?
Il n'y a pas eu de réels changements sur le code depuis la dernière fois, mis à la part le Liste_Note.remove
Oui, votre for est une bonne piste et peut être problématique. Encore une fois, les print peuvent aider à repérer ce qui se passe en marquant sur le terminal des points dans lequel le programme passe. Il faut aussi penser à utiliser un débogueur par la suite, c'est encore plus puissant que la technique du for.
Ça serait cool de modifier votre code pour tenir compte de mes remarques et après, on voit comment régler les derniers soucis
Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi
Ma page sur DVP
Mon Portfolio
Qui connaît l'erreur, connaît la solution.
Je prends note pour les nommages de variables
Je me suis renseigné un peu sur le camelCase, mais il est aussi possible de faire du CamelCase avec une majuscule au début ? D'ailleurs, quels genres de "conventions" existe-t-il par rapport aux nommages ? Est-ce spécifique au Python ou général à tous les langages ?
Pour le soucis des Notes qui s'en allaient par deux, je n'ai pas trouvé la solution, supposant que c'était plus un problème de compréhension par l'ordinateur, ou quelque chose comme ça. Du coup, j'ai "dévié" le problème en rajoutant, lors de la création des Notes :
Ainsi, deux notes successives n'auront jamais la même abscisse, donc, n'apparaitront jamais dans la même colonne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 for i in range(10): # Création de dix éléments Note Liste_note.append(Note(pygame.image.load('note.jpg').convert(), random.randrange(2, 345, 57), 30, (2000 + i*1000))) while Liste_note[i].note_x == Liste_note[i - 1].note_x: #Pour éviter d'avoir 2 notes successives dans la même colonne Liste_note[i].note_x = random.randrange(2, 344, 57)
(Je vais par ailleurs changer les valeurs dans le random.randrange, pas d'inquiétudes ^^)
Bonjour,
Les conventions d'écriture en Python sont données par la PEP 8.
Clodion
Comme je l'ai dit (ou je l'ai amené sans le dire), la première lettre, si elle est majuscule, cela indiquera que c'est le nom d'une structure/classe (et non d'une instance de cette structure/classe). Si c'est une minuscule, c'est une variable.
Ainsi, très rapidement, on repère si c'est un type, ou une variable.
Ces conventions existent dans tous les langages. Elles ont certaines variations, mais très faibles.
Pour la correction du bogue ... hum ... j'aurais préféré comprendre pourquoi avant cela ne fonctionnait pas. De plus :
Absolument pas !c'était plus un problème de compréhension par l'ordinateur,
L'ordinateur est une machine prédictible qui ne fait que lire ce que vous avez écrit. Le soucis, c'est plus : vous n'avez pas réussi à bien exprimer ce que vous vouliez faire faire à l'ordinateur.
Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi
Ma page sur DVP
Mon Portfolio
Qui connaît l'erreur, connaît la solution.
Bonjour Clodion,
Merci du lien, j'essaierai de modifier mon code en amont pour correspondre au maximum aux conventions
Pour la correction du bogue ... hum ... j'aurais préféré comprendre pourquoi avant cela ne fonctionnait pas. De plus :
"c'était plus un problème de compréhension par l'ordinateur,"
Absolument pas !
L'ordinateur est une machine prédictible qui ne fait que lire ce que vous avez écrit. Le soucis, c'est plus : vous n'avez pas réussi à bien exprimer ce que vous vouliez faire faire à l'ordinateur.
C'est vrai que c'est logiquement mon programme qui bug et non pas l'ordinateur qui le comprend mal, cependant, dans ce cas, je pense que l'ordinateur applique deux fois ma fonction, étant donné qu'il n'y a que ma fonction qui supprime une et une seule fois la Note. Je pense donc que ma boucle/mes conditions ont soit été mal crées, soit sont prises en compte deux fois. C'est assez difficile à expliquer :/
En fait, même en retracant le code avec deux Notes exemples, je ne vois pas dans quelle mesure deux Notes qui ont la même abscisse (donc, le même x, donc, sont dans la même colonne) peuvent disparaitre en même temps. La seule option possible selon moi serait dans la fonction qui vérifie la colonne de la Note, cependant, elle n'est censée vérifier QUE la Note d'indice 0
Voici la fonction en question (enfin, un extrait) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 if event.type == KEYDOWN: if event.key == K_s and Liste_note[0].note_x == 5: Scoring(pts) if event.key == K_d and Liste_note[0].note_x == 55: Scoring(pts) [...]
C'est toujours à dire le pourquoi, lorsque l'on ne voit pas le contenu de telle une telle fonction (notamment Scoring). Je vais faire l'hypothèse que Scoring(), à la fin de la fonction, fait un top() sur Liste_note.
Déroulant ce que fait le programme.
Ok, l'utilisateur appui sur une touche.
Code : Sélectionner tout - Visualiser dans une fenêtre à part if event.type == KEYDOWN:
Ok, cela rentre dans cette condition.
Code : Sélectionner tout - Visualiser dans une fenêtre à part if event.key == K_s and Liste_note[0].note_x == 5:
Cela fait le score et notamment le top() sur Liste_note
Code : Sélectionner tout - Visualiser dans une fenêtre à part Scoring(pts)
Et là, la note testée, ce n'est pas la même que celle d'avant. En effet, à cause du tope, la note se trouvant en Liste_note[0] n'est plus la même. Donc la condition peux se retrouver encore une fois juste.
Code : Sélectionner tout - Visualiser dans une fenêtre à part if event.key == K_d and Liste_note[0].note_x == 55:
Enfin, là, je fais beaucoup d'hypothèse
Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi
Ma page sur DVP
Mon Portfolio
Qui connaît l'erreur, connaît la solution.
Oups, c'est vrai que j'ai oublié de donner la fonction Scoring() :c
Dans les grandes lignes, ça modifie/crée quelques variables utiles pour la gestion du score, et tout à la fin, ça supprime la Note d'indice 0 avec :
Code : Sélectionner tout - Visualiser dans une fenêtre à part del Liste_note[0] #Suppression de la Note que l'on vient de faire
Peut-être que les Notes vérifiées ne sont pas les mêmes, mais dans tous les cas, cela devrait ne supprimer qu'une seule Note, or, rien, à part cette fonction, ne supprime des Notes. Or, cette fonction ne supprime bien qu'une Note. Donc, si deux Notes sont supprimées, cela veut dire que la fonction a été appelée deux fois. Donc, soit dans la fonction Check_Colonne (celle donnée dans mon post précédent), les conditions ne sont pas respectées et appelle donc deux fois la fonction Scoring(), soit c'est dans ma boucle d'évènements, lorsque j'appelle ma fonction Check_Colonne
Voici le passage ou j'appelle Check_Colonne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 if Liste_note[0].note_y > (696 - 15) and Liste_note[0].note_y < (696 + 15) and event.type == KEYDOWN: #Si la note est éloignée de la barre if Liste_note[0].note_y > (696 - 10) and Liste_note[0].note_y < (696 + 10) and event.type == KEYDOWN: #Si la note se rapproche de la barre if Liste_note[0].note_y > (696 - 5) and Liste_note[0].note_y < (696 + 5) and event.type == KEYDOWN:#Si la note est +- sur la barre Check_Colonne(300) else: Check_Colonne(100) else: Check_Colonne(50) else: #Si la note est beaucoup trop éloignée de la barre (= si l'user rate la note) Check_Colonne(0) if Liste_note[0].note_y > (696 + 15): #Si la note passe en dessous, la note est ratée Scoring(0)
Relisez ce que j'ai décrit comme comportement (car vous tombez dans le cas de mon hypothèse) et vous verrez que oui, Scoring() peut être appelé deux fois.
Après, il vous suffit de rajouter des print, genre à chaque début de fonction, pour vous en convaincre.
Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi
Ma page sur DVP
Mon Portfolio
Qui connaît l'erreur, connaît la solution.
En vérifiant avec les print(), c'est bien la fonction Check_Colonne() qui est appelée plusieurs fois. En réalité, elle est même appelée tout le temps, ce sont donc mes conditions qui ne sont pas respectées
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 if Liste_note[0].note_y > (696 - 15) and Liste_note[0].note_y < (696 + 15) and event.type == KEYDOWN: #Si la note est éloignée de la barre if Liste_note[0].note_y > (696 - 10) and Liste_note[0].note_y < (696 + 10) and event.type == KEYDOWN: #Si la note se rapproche de la barre if Liste_note[0].note_y > (696 - 5) and Liste_note[0].note_y < (696 + 5) and event.type == KEYDOWN:#Si la note est +- sur la barre Check_Colonne(300) else: Check_Colonne(100) else: Check_Colonne(50) else: #Si la note est beaucoup trop éloignée de la barre (= si l'user rate la note) Check_Colonne(0)
Ce que je souhaitais faire avec cette condition, c'était vérifier l'ordonnée de la Note ET vérifier si une touche du clavier a été pressée. En vérifiant, la 2e condition est toujours vraie
Si vous avez des doutes, décomposez vos tests (pour en avoir qu'un par if) et rajouter des print, qui affiche aussi les valeurs testées
Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi
Ma page sur DVP
Mon Portfolio
Qui connaît l'erreur, connaît la solution.
Au final, mes conditions fonctionnaient bien correctement...Mais je pense avoir identifié le problème : certes, mes conditions étaient bonnes, mais les Else, eux, fonctionnent justement en opposition aux If. Ainsi, si on une conditionl'opposé (le Else) s'applique lorsque aucune touche n'est pressée, càd tout le temps. Ainsi, il suffisait juste d'ajouter des
Code : Sélectionner tout - Visualiser dans une fenêtre à part event.type == KEYDOWNà la fin de chaque Else
Code : Sélectionner tout - Visualiser dans une fenêtre à part If event.type == KEYDOWN
Ou, plus logiquement (en reprenant le code du dessus) :
Ce qui est genre, mille fois plus clair/propre/logique
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 if event.type == KEYDOWN: if Liste_note[0].note_y > (696 - 15) and Liste_note[0].note_y < (696 + 15): #Si la note est éloignée de la barre if Liste_note[0].note_y > (696 - 10) and Liste_note[0].note_y < (696 + 10): #Si la note se rapproche de la barre if Liste_note[0].note_y > (696 - 5) and Liste_note[0].note_y < (696 + 5):#Si la note est +- sur la barre Check_Colonne(300) else: Check_Colonne(100) else: Check_Colonne(50) else: #Si la note est beaucoup trop éloignée de la barre (= si l'user rate la note) Check_Colonne(0)
Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi
Ma page sur DVP
Mon Portfolio
Qui connaît l'erreur, connaît la solution.
Désolé de ne pas avoir répondu plus tôt
Oui, c'est en effet bien meilleur ^^
Le projet touche quasiment à sa vie, il reste quelques éléments à modifier/ajuster/améliorer, sinon, tout est fini ! Un grand merci pour votre aide, qui m'a vraiment bien aidée et bien guidée tout au long du projet !
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager