Partage
  • Partager sur Facebook
  • Partager sur Twitter

Aide projet "Copter" - LE SCORE

Sujet résolu
    17 mars 2015 à 19:44:00

    Bonjour,

    Dans le cadre d'un projet en informatique, j'ai choisi de réaliser le jeu "Copter", avec python et pygame. J'ai bien avancé, d'ailleurs mon programme est presque fini, mais j'aimerais ajouter une fonctionnalité plutôt primaire : la gestion de score.

    Pour être plus précis, j'aimerais que, chaque seconde, le score augmente de 5 (par exemple). Donc si on arrive à survivre 10 secondes, on aura un score de 50.

    J'aurais donc besoin de savoir comment mettre ça en place, à savoir que j'aimerais intégrer à mon programme un truc du genre :

    --------------------------------------------------------------------------------------------------------------------------- 

    highscore = 0 (j'initialise le meilleur score à 0 vu que je n'ai jamais joué)

    score = secondes * 5 -> Voilà le problème. Comment définir "secondes" pour que ça augmente de 1 à chaque seconde ?

    -> Donc au cours de la partie, la valeur de score augmentera de 5 chaque seconde

    ensuite j'aimerais mettre en place le highscore, donc quelque chose de cette forme.

    ------------------------- 

    if score > highscore:

             highscore = score

    -------------------------

    Est-ce que au niveau de la structure c'est correct ou je dois m'y prendre autrement ?

    Est-ce que quand la partie sera finie, la valeur de highscore sera sauvegardée ?

    Voilà ça fait beaucoup de questions mais malgré toutes mes recherches je n'ai pas réussi à aboutir à un résultat probant.

    Quand j'aurais terminé ça, je me pencherais aussi sur une fonction qui me permette d'ajouter du texte à l'écran (quand j'arrive à l'écran d'accueil, j'ai un point de coordonnées (x,y) ou va s'afficher la valeur du meilleur score !

    Merci d'avance pour vos réponses. :)

    -
    Edité par saul.goodman12400 17 mars 2015 à 19:46:32

    • Partager sur Facebook
    • Partager sur Twitter
      17 mars 2015 à 20:49:37

      Salut

      Pour les secondes tu as le module time.

      Ensuite, pour ton highscore, si tu quittes le programme sans le sauvegarder dans un fichier, évidemment, tout va s'effacer. Pour rappel, les programmes fonctionnent grâce à la mémoire vive qui est tout le temps réaménagée, contrairement au disque dur, où cela reste jusqu'à suppression.

      score = 100
      
      highest = fonctionQuiRecupereLeScoreLePlusHautDansTonFichier()
      
      with open('highscore', 'wb') as fichier:
          if score > highest:
              fichier.write(score)
      
          fichier.close()



      • Partager sur Facebook
      • Partager sur Twitter
        17 mars 2015 à 21:16:53

        Ok donc grâce à 

        score = time.clock() * 5

        J'arrive à avoir un score en temps réel, sauf que du coup y'a plein de décimales.. Comment je pourrais arranger ça ? Pour avoir un nombre entier... Ou sinon y'a-t-il un autre moyen d'augmenter le score, autre que le module time ? (qui serait plus adapté)

        Une fois que j'ai ce score qui augmente en temps réel, comment l'afficher en haut de ma fenêtre ? Je trouve parfois des fonctions sur ce site ou d'autres pour afficher du texte mais ça ne fonctionne pas

        • Partager sur Facebook
        • Partager sur Twitter
          17 mars 2015 à 21:37:44

          Pour passer une décimale en entier tu peux utiliser int(), mais ce n'est sûrement pas trop recommandé avec des secondes, utilise plutôt floor ou ceil du module math.
          • Partager sur Facebook
          • Partager sur Twitter
            17 mars 2015 à 21:46:31

            Ah génial ! Merci beaucoup pour ta réponse, j'ai maintenant un score entier !

            Maintenant pour ce qui est de l'affichage, j'ai trouvé et adapté un truc d'internet et ça me donne ça :

            myfont = pygame.font.SysFont("monospace", 16) 
            
            scoretext = myfont.render("Score {0}".format(score), 1, (0,0,0))
            
            screen.blit(scoretext, (5, 10))

            Par contre ça ne marche pas... je n'ai rien qui s'affiche et je ne trouve rien d'autre pour un affichage dynamique du score !



            • Partager sur Facebook
            • Partager sur Twitter
              17 mars 2015 à 22:27:31

              Mon domaine s'arrête là désolé, je ne connais pas pygame :(

              Je te conseil de bien relire la source de laquelle tu as pris ce code et de réfléchir de pourquoi ça ne fonctionne pas chez toi, essaie de réfléchir à haute voix, ça aide en général.

              • Partager sur Facebook
              • Partager sur Twitter
                18 mars 2015 à 21:59:09

                Voilà j'ai réussi à me débrouiller pour avoir un affichage du score :

                affichscore = font.render("Score : {0}".format(score), True,(255, 255, 0))
                screen.blit (affichscore, (15, 15))

                dans la boucle du jeu, et au début dans l'initialisation :

                font = pygame.font.SysFont("monospace", 30)

                En fait c'était vraiment simple !

                Par contre maintenant je me heurte à un nouveau problème : Quand mon hélicoptère entre en collision avec la bordure, ça lance la fonction gameover(), qui affiche une image que j'ai créé avec écrit dessus "Game Over". Maintenant j'aimerais qu'en dessous il y ait affiché le score qu'on vient de faire, sauf que je change de fonction, du coup les valeurs du score de la fonction principale se perdent, et le score n'est plus défini. Comment faire ? Merci


                • Partager sur Facebook
                • Partager sur Twitter
                  19 mars 2015 à 17:50:15

                  Si j'ai bien compris, plusieurs solutions s'offrent à toi :

                  1. Faire une variable globale

                  2. Transmettre ton score dans ton appel/retour de fonction

                  3. Stocker le score dans un fichier comme indiqué avant et relire l'info dans ton autre fonction

                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 mars 2015 à 18:16:06

                    Dans ce cas là quelle serait la plus simple ? Faire une variable globale je pense non ? ou Transmettre mon score dans l'autre fonction ?

                    Dans les deux cas, comment procéder ? Merci d'avance !

                    • Partager sur Facebook
                    • Partager sur Twitter
                      19 mars 2015 à 19:07:10

                      Faire une class me se semble plus aisé...
                      • Partager sur Facebook
                      • Partager sur Twitter
                        19 mars 2015 à 21:32:38

                        Je ne suis pas très à l'aise avec les class... Y'a pas d'autre alternative ? Sinon en attendant je me renseigne sur les class et je vais essayer d'apprendre
                        • Partager sur Facebook
                        • Partager sur Twitter
                          19 mars 2015 à 22:55:36

                          Ben ce qui a de bien avec les classes c'est que tu n'as pas besoin de te faire chier à faire des globales, toutes les variables que tu déclares avec le préfixe self seront accessible dans toute la class, c'est une énorme facilité de travail. :)
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            20 mars 2015 à 8:24:00

                            Les classes ne sont pas le seul moyen, d'ailleurs je conseille fortement d'utiliser les namedTuple...

                            Il y a d'autres possibilités d'éviter les variables globales comme l'utilisation du module pickle, et autres modules liées à la sérialisation.

                            On peut aussi utiliser les objets list, dict, ...

                            >>> d = {'var': 0}
                            >>> def inc():
                            ...     d['var'] += 1
                            ... 
                            >>> inc()
                            >>> inc()
                            >>> inc()
                            >>> inc()
                            >>> d['var']
                            4
                            

                            Bref, non les classes ne sont certainement pas le moyen simple, mettre des classes partout n'est pas une solution

                            • Partager sur Facebook
                            • Partager sur Twitter
                              20 mars 2015 à 18:21:44

                              @oldProgrammer, je vais me renseigner là dessus, car ce que tu as mis ne me dit rien du tout ^^ !
                              • Partager sur Facebook
                              • Partager sur Twitter
                                20 mars 2015 à 18:27:10

                                oldProgrammer a écrit:

                                Les classes ne sont pas le seul moyen, d'ailleurs je conseille fortement d'utiliser les namedTuple...

                                Il y a d'autres possibilités d'éviter les variables globales comme l'utilisation du module pickle, et autres modules liées à la sérialisation.

                                On peut aussi utiliser les objets list, dict, ...

                                >>> d = {'var': 0}
                                >>> def inc():
                                ...     d['var'] += 1
                                ... 
                                >>> inc()
                                >>> inc()
                                >>> inc()
                                >>> inc()
                                >>> d['var']
                                4
                                

                                Bref, non les classes ne sont certainement pas le moyen simple, mettre des classes partout n'est pas une solution


                                Oui sauf que les classes permettent d'utiliser à fond l'orienté objet de Python et quand on fait un gros projet comme ça, je trouverais stupide de ne pas en profiter, alors que ce n'est pas si compliqué que cela. :)
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Anonyme
                                  20 mars 2015 à 18:43:00

                                  S'il arrive déjà à faire sans, ça sera déjà pas mal, ensuite connaître les classes impliquent de connaître certaines notions de l'orienté objet, et je pense que c'est déjà bien assez lourd...

                                  D'ailleurs je veux bien voir ce que va donner la finalité de ce projet, mais des débutants python qui utilisent pygame, sans connaître les bases (types, fonctions, modules, ...) ça risque d'être sportif.

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    20 mars 2015 à 19:06:13

                                    Je le mettrais dès qu'il sera achevé. Je vous explique le processus de mon jeu :

                                    -> fonction principale() avec la boucle. Dans cette boucle, j'ai mon score qui augmente constamment. Si je me mange un mur, je suis renvoyé à :

                                    -> fonction gameover() : affiche une image sur la fenêtre avec écrit "game over". J'aimerais pouvoir mettre une variable globale qui fasse que de la fonction principale() à la fonction gameover() la valeur du score se conserve et que je puisse afficher à côté du game over le score que je viens de faire. 

                                    Quelqu'un aurait une idée de comment procéder ? Merci d'avance

                                    -
                                    Edité par saul.goodman12400 20 mars 2015 à 19:06:57

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      20 mars 2015 à 19:12:22

                                      Après pour le meilleur score j'ai trouvé le module shelve :) !

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Anonyme
                                        20 mars 2015 à 19:26:07

                                        shelve ou pickle -> pickle
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          20 mars 2015 à 19:28:29

                                          Oui mais ma priorité est d'afficher le score que je viens de faire, je m'en occuperais plus tard

                                          EDIT :

                                          Dans ma boucle de jeu, mon score augmente. Lorsqu'il y a collision, la boucle s'arrete, et donc le score s'arrête. Comment pourrais-je faire pour que lors de chaque boucle, la valeur de mon score soit rendue globale et donc utilisable dans une autre fonction ? J'ai bien essayé global score, mais ça ne fonctionne pas, ça me dit quand même que ça n'est pas défini. Une idée ?? Merci d'avance! 

                                          RE-EDIT : Je suis bête, il suffit de mettre global AVANT d'assigner une valeur au score !

                                          -
                                          Edité par saul.goodman12400 20 mars 2015 à 19:38:31

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            20 mars 2015 à 19:36:34

                                            Je pense que oldProgrammer dit pickle à la place de shelve car j'ai remarqué durant un bug de shelve qui m'est arrivé, qu'il utilisait.. pickle, donc bon, quitte à se servir de pickle autant s'en servir directement :D (même si je préfère la syntaxe de shelve personnellement).

                                            Et justement tu peux afficher le score en l'enregistrant temporairement (ou non) dans un fichier avec le module pickle, et ensuite le récupérer pour l'afficher dans ta fonction gameover()

                                            C'est simple, lors qu'il y a une collision tu enregistres le score actuel et tu lances ta fonction gameover(), quel est le problème ?

                                            -
                                            Edité par InhumanRampage 20 mars 2015 à 19:38:33

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              20 mars 2015 à 19:43:04

                                              Merci beaucoup, dans ce cas je vais me renseigner sur PICKLE et je reviendrais quand j'aurais avancé !

                                              ---> Voilà après quelques recherches j'ai finalement utilisé le module shelve, il est beaucoup plus simple d'utilisation que pickle d'après ce que j'ai pu voir sur internet, 2 lignes pour charger le meilleur score et 2 lignes pour le remplacer si score > meilleur score !

                                              Du coup je vais m'occuper des sons et après si j'ai encore un peu d'imagination je rajouterais d'autres fonctionnalités :D

                                              -
                                              Edité par saul.goodman12400 20 mars 2015 à 21:23:23

                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              Aide projet "Copter" - LE SCORE

                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                              • Editeur
                                              • Markdown