Annonce

Réduire
Aucune annonce.

Ebook de programmation : invent computer games with python

Réduire
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • Ebook de programmation : invent computer games with python

    Bonsoir,

    J'ai trouvé hier soir un ebook gratuit qui apprend la programmation en python et c'est mon préféré jusqu'à maintenant.

    C'est invent computer games with python et voici le lien (en anglais) https://inventwithpython.com/chapters/

    Ce que j'aime particulièrement du livre c'est que sa marche par projet: on apprend la matière avec un 'gros' programme au lieu de faire que de petits scripts de quelques lignes (perso, lorsque c'est le cas je décroche )

    Je viens de terminer le chapitre 9 et j'ai fait le programme hangman sans regarder le code source du programme original pour pouvoir comparer par après. Je trouve que c'est pas mal lien: non ?

    Présentement je refais le programme tictactoe (le chapitre 10) et je suis en train de programmer un AI plus intelligent. Si quelqu'un est intéressé, je pourrai le poster après

    Bonne soirée

    nalfein

  • #2
    Je trouve que le problème de ton code est plutôt conceptuel, c'est à dire au niveau du jeu, lui même

    Mieux vaut tester dans une liste de caractères acceptables par le jeu (être clair sur ce qui est accepté ou pas) et surtout vérifier que la lettre proposée par l'utilisateur, n'a pas déjà été proposée...

    Ensuite concernant la longueur de la chaîne proposée par l'utilisateur, on l'impose, en ne prenant que le 1er caractère de sa proposition.

    Ça donne rapidement un code assez complet en peu de lignes

    Code:
    from string import ascii_lowercase as alphabet
    
    propositions = ['a', 'c'] # propositions apportées par l'utilisateur à titre d'exemple
    # propositions doit être vide en début de partie
    
    def user_input():
    	
    	while True:
    		
    		guess = input ('Enter your guess : ')[0] # retourne obligatoirement la 1ère lettre
    		
    		if guess not in alphabet or \
    		   guess in propositions:
    			print('This is not a valid guess, please retry ')
    			continue
    			
    		break
    	
    	propositions.append(guess)
    	
    	return guess 
    
    print(user_input())
    global hangman_state
    Si le tutoriel t'expliques ce mot clé, ce n'est pas un bon tutoriel, oublie le, il a de mauvaises manières de faire, surtout pour des codes aussi simples. Je n'ai pas lu le tutoriel, donc je ne sais pas si ça vient de toi ou du tuto ces mauvaises habitudes.

    Commentaire


    • #3
      @fred,
      Je n'ai pas lu le tutoriel, donc je ne sais pas si ça vient de toi ou du tuto ces mauvaises habitudes.
      Je viens de voir le code du tutoriel en question, je crois que ces mauvaises habitudes viennent du tutos!
      Pas bon du tout!
      <?php
      $signature = NULL;
      ?>

      Commentaire


      • #4
        Comme je l'ai dit précédemment, j'ai fait le jeu sans regarder le code source que voici http://pastebin.com/bKYhQgsj.

        Je me doutais que venant de mes précédentes expériences (et peut être du tuto ?) j'avais pris quelques mauvaises habitudes mais je savais pas que utiliser global 'variable' en était une .. (pas dans le code source)

        Je vais essayer d'améliorer mais y a t'il une liste qui dit en python ce que on doit faire/pas faire (je connais le pep8 mais à part sa..)

        Commentaire


        • #5
          Salut,

          j'ai moi même pas mal de problèmes pour faire de beaux scripts , et après avoir lu ta réponse , j'ai cherché une liste de ce qu'il faudrait faire. Donc je partages deux liens en français.

          lien1:http://sametmax.com/le-pep8-en-resume/
          lien2:http://media.jehaisleprintemps.net/t...talk/#slide104
          Dernière modification par blend, 10 août 2015, 16h04.

          Commentaire


          • #6
            Merci, je regarde sa !

            Commentaire


            • #7
              mais y a t'il une liste qui dit en python ce que on doit faire/pas faire
              Il n'y a pas qu'une PEP, mais énormément ! il faut se les taper...

              à part ça, tu vas sur google, tu poses ta question en anglais et tu fais une recherche sur le site stackoverflow

              Commentaire


              • #8
                Envoyé par fred Voir le message
                global hangman_state
                Comme le dit fred, les variables globales sont à éviter, il est préférable d'utiliser des variables déclarées dans un contexte local, en effet l'utilisation de ce genre de variable rend difficile la compréhension d'un programme ainsi que son débogage (adieu les tests unitaires). De plus, si tu développes un programme plus élaboré qu'un HangMan, où tu pourrais être amené à faire du développement collaboratif, dit-toi que chaque fonction développée peut être utilisée dans plusieurs instances de ton projet.

                Commentaire


                • #9
                  j'ai regardé les peps (bon d'accord on pourrait plus dire survolé puisque je fait du python uniquement dans mon temps libre) et retapé des bouts code un peu partout pour mettre 4 espace après une déclaration d'une fonction, moins de ligne blanche et etc.

                  J'ai entièrement refait le user_input(merci fred) je voulais pas recopier exactement son code donc je l'ai un peu modifié. C'est mieux ou moins bon ?
                  J'ai aussi entièrement refait la détection des lettres dans le mots ainsi que le remplacement (avant c'était très lourd et difficile) avec la fonction enumerate que j'adore ainsi que adopté un système pour qui montre les lettres qui on déjà été essayés pour empêché de accumuler les erreurs.

                  Finalement j'ai enlever le global( pas très utile j'admet et après vérification il n'était pas dans le livre) comme recommandé

                  lien pastebin:
                  vieux code : lien
                  nouveau code : lien

                  Merci Nalfein

                  Commentaire


                  • #10
                    C'est pas mal, plusieurs remarques plus ou moins pinailleuses

                    Au niveau du jeu, pas grand chose à dire, sauf sur la fin, si l'on perd, je ne vois pas pourquoi on ne voit pas le pendu avec toutes ses jambes.

                    Au niveau du code, par contre pas mal à dire
                    Ton 6 qui se trimballe dans le code, plutôt prendre une constante que tu nommes par exemple MAX_MOVE.
                    Code:
                    MAX_MOVE = 6 # en haut du code après la déclaration des modules
                    list_of_words n'a pas à être déclaré avant les fonctions, mais après, c'est une convention que l'on préfère respecter.
                    Si tu réfléchis bien, cette condition est inutile (pour cela pense à la condition pour sortir de ta boucle while)
                    Code:
                        if hangman_state == 6:
                            print('You have lost :( ')
                            print('The word was : ',word)
                            print()
                    Ta fonction random_word peut être supprimée, il existe la fonction choice du module random
                    Code:
                    from random import choice
                    
                    print(choice(list_of_words))
                    Je ne sais pas pourquoi tu mets un espace après ton tiret du 8 ('_ '), en fait ce n'est pas utile, vire l'espace et modifie ta condition if en conséquence.
                    Pourquoi mettre une fonction main alors que tu as un programme principal par la suite ? La fonction main est généralement utilisé en fin de programme sous cette forme...
                    Code:
                    import sys
                    
                    main(sys.argv)
                    Pour terminer, je dirais que tu aurais pu créer ta propre fonction de replay.

                    Il y a du mieux, mais, et c'est ça le plus difficile, il faut réfléchir à la conception du jeu avant de coder au fur et à mesures et modifier quand on voit que la conception n'est pas celle attendue.

                    Un programme principal pour un pendu pourrait être
                    Code:
                    Tant que replay
                        play
                        replay = ?
                    tout simplement...

                    Avec une implémentation du play tout aussi simple

                    Code:
                    Tant que mot différent secret et que compteur inférieur au maximum
                        demander lettre
                        afficher mot
                    Voilà je pense que l'on peut faire beaucoup plus simple !

                    Commentaire


                    • #11
                      Pour faire un pendu assez complet, et en suivant un peu les étapes de ton pendu, voilà un aperçu de ce que je ferais, il s'exécute de cette manière

                      Code:
                      python3 pendu.py 6
                      6 étant le nombre de coups maximum

                      Commentaire


                      • #12
                        Merci pour l'exemple !

                        Je m'en suis inspiré pour améliorer mon code. Pour rendre mon proramme plus flexible et plus simple, j'ai décidé de faire sauté le 6 et plutôt me fier sur le nombre d'images de pendus (avec la fonction len): sa évite des index out of range et simplifie le procédé de rajouter des chances (plus d'images = plus de chances).

                        J'ai changé le nom de ma fonction pour the_game (merci pour l'exemple avec main c'est maintenant beaucoup plus clair) et fait une fonction dédié pour l'affichage pour faire me pratiquer pour faire un gui plus tard et pour alléger la fonction the_game

                        J'ai utillisé choice pour le random (tellement pratique ), maintenant mon code 'actif' fait 3 lignes et il y a plusieurs autres changements que j'ai oublié.

                        Le seul problème que je vois, c'est lors du user_input : Si on entre enter, on a une erreur et je ne vois pas de façon simple et en peu de ligne de la régler.

                        Nouveau code : http://pastebin.com/MKwnf5Nd

                        Merci

                        Commentaire


                        • #13
                          Ligne 71, le break est en trop, après il n'y a plus d'erreur dans le user_input, je te laisse chercher peut-être dans l'utilisation de celle-ci au cas où l'erreur persiste...

                          Commentaire


                          • #14
                            Break enlevé merci. !

                            Non je parlais du fait que si l'utilisateur entre rien (juste enter) il y a une erreur (string index out of range) et je me demandais quelle est la façon la plus 'pythonic' de s'en débarasser..

                            edit : Voici la façon la moins longue et la plus 'pythonic' que j'ai trouvé

                            Code:
                                while True:
                                    guess = input ('Enter your guess : ')
                                    if guess in alphabet and guess not in already_asked and guess !='':
                                        guess = guess[0]
                                        already_asked.append(guess)
                                        return guess
                            Dernière modification par nalfein, 24 août 2015, 19h23.

                            Commentaire


                            • #15
                              Code:
                              if guess and guess in alphabet \
                                       and guess not in already_asked:

                              Commentaire

                              Chargement...
                              X