Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tp 1 (ZCasino)

Sujet résolu
    22 novembre 2010 à 1:53:06

    Bonsoir !

    J'ai un petit soucis avec le code du ZCasino... Je vois pas où j'ai fais une erreur. =/
    (Bon, mon code est peut-être crade, il faut l'optimiser, mais pour ça j'ai besoin qu'il marche, donc de vos conseils ^^)

    Voilà le code:

    # -*-coding:Latin-1 -*
    
    from os import system # Importation de la fonction system du module os
    from math import ceil # Importation de la fonction ceil du module math (Arrondir)
    from random import randrange # Importation de la fonction randrange du module random (Nombre aléatoire)
    
    argent = 1000 # Valeur de départ d'argent
    
    print("Bienvenue dans le programme ZCasino !\nNous allons jouer à la roulette.")
    print("Vous disposez de",argent,"\nVeuillez indiquer la somme que vous aimeriez miser:")
    mise = int(input()) # Variable mise définie, conversion en valeur
    if argent < mise or mise <= 0: # Si la mise est plus élevée que l'argent disponible
    	print("Veuillez miser entre 1 et",argent,"$")
    	system("pause")
    	exit()
    
    print("Veuillez choisir à présent un numéro entre 0 et 49:")
    num = int(input()) # Variable num définie, conversion en valeur
    if num > 49: # Si le nombre saisi est supérieur à 49
    	print("Vous ne pouvez pas choisir un nombre supérieur à 49.")
    	system("pause")
    	exit()
    
    else:
    	argent = argent - mise
    	numRoulette = randrange(50) # Numéro aléatoire défini
    
    	if num == numRoulette: # Si le numéro est le même
    		argent = mise * 3 + argent
    		print("Félicitations ! Vous avez le numéro gagnant. Vous avez donc gagné",mise*3,"$")
    		print("Vous avez désormais",argent,"en tout.")
    		system("pause")
    		exit()
    
    	elif numRoulette%2 == 0 and num%2 == 0: # Si le numéro aléatoire & le numéro saisi sont pairs
    		print("Désolé, vous n'avez pas le bon numéro. Le numéro gagnant était",numRoulette)
    		print("Mais vous avez cependant gagné la moitié de votre mise grâce à votre numéro qui est pair !")
    		print("Vous remportez donc",math.ceil(mise/2),"$") # Arrondissement de la mise
    		argent = argent + ceil(mise/2)
    		print("Vous avez dorénavant",argent,"$")
    		system("pause")
    		exit()
    
    	elif numRoulette%2 != 0 and num%2 != 0: # Si le numéro aléatoire & le numéro saisi sont impairs
    		print("Désolé, vous n'avez pas le bon numéro. Le numéro gagnant était",numRoulette)
    		print("Mais vous avez cependant gagné la moitié de votre mise grâce à votre numéro qui est impair !")
    		print("Vous remportez donc",math.ceil(mise/2),"$") # Arrondissement de la mise
    		argent = argent + ceil(mise/2)
    		print("Vous avez dorénavant",argent,"$")
    		system("pause")
    		exit()
    
    	else:
    		print("Désolé, mais vous avez perdu. Le numéro gagnant était",numRoulette)
    		print("Il vous reste",argent,"$")
    		system("pause")
    		exit()
    


    Il n'y a que la moitié qui marche...
    Je m'explique:
    Dès que mon chiffre est bon car il est pair/impair, le prog se ferme. Le "system("pause") est pas pris en compte... =/


    (Et j'ai une petite question supplémentaire: si je veux continuer à jouer, je dois créer un boléen, mais je dois placer la boucle où ? Après le "Bienvenue", non ?)

    En tout cas merci !
    • Partager sur Facebook
    • Partager sur Twitter
      22 novembre 2010 à 3:57:15

      Tu pars dans la mauvaise direction : il vaut mieux d'abord essayer de coder proprement, pour que le code soit plus simple à débugger.
      Ici, le code en lui-même est assez propre pour un débutant, à quelques exceptions près : tes commentaires. Il ne servent absolument à rien : ils répètent exactement la même chose que la ligne qu'ils commentent (exemple : if num > 49: # Si le nombre saisi est supérieur à 49). Un article plus détaillé dessus, que tu devrais lire (et que j'écrirais ici si ce n'était pas inutile grâce au lien).

      Ensuite, le system("pause"). En Python, on utilise rarement ça, on préfère la fonction input().

      Tes deux codes où la roulette et le chiffre donné ont la même parité sont presque exactement les mêmes : pour éviter la redondance, il serait astucieux de les regrouper en un seul, avec une seule condition : dans le cas général, tu utiliserais un or sur les deux and, mais là, il suffit de tester l'égalité des deux modulos. Il y a quand même une différence sur l'affichage pair/impair : c'est ici que tu feras la différence entre les deux, à l'aide d'un if.
      Comme ça, si tu veux changer le message, hop, tu ne dois le faire qu'une seule fois.

      Enfin, on conseille en général d'éviter d'utiliser le from module import *, à moins d'avoir une très bonne raison de le faire. Si par exemple, dans le module que tu importes, il y a une fonction print, ça va casser tout le reste de ton code. Et d'ailleurs, c'est de là que vient ton problème. Python a trouvé une fonction qu'il ne connaissait pas dans ton code (parce qu'elle n'est pas importée et utilisée de la même façon à un endroit), et a déclenché une erreur. Du coup, il n'attend pas la suite et s'arrête brutalement.

      Enfin, pour éviter ce genre de problème, je te conseille d'utiliser idle, l'IDE fourni avec Python. Il est très simple à utiliser, permet de faire des choses suffisamment évoluées pour que tu n'aies pas besoin de changer avant un certain temps, et t'évitera ce genre de problème de console qui se ferme instantanément (haha, je me souviens, moi je lançais plein de fois le programme, et je faisais des print screen dans l'espoir de capturer ce qui était affiché. fin de la petite histoire).
      • Partager sur Facebook
      • Partager sur Twitter
        22 novembre 2010 à 4:32:28

        Pour continué à jouer après la fin du programme (qui fonctionne d'ailleur presque comme un programme séquentiel) il faut mettre une boucle infinie ('while 1:' ou 'while true:') entre la ligne 10 et 11 et breaké si la personne est ruiné ou a perdu (j'y connais que d'alle à la roulette :p ). Mais le mieux c'est d'utiliser une(des) fonctions...

        Et aussi les exception try/except/else, parce-que ce genre de programme on peut le planter facilement...
        • Partager sur Facebook
        • Partager sur Twitter
          22 novembre 2010 à 12:35:43

          Hey, il débute, chaque chose en son temps.
          • Partager sur Facebook
          • Partager sur Twitter
            22 novembre 2010 à 16:42:49

            Merci à tout les deux pour vos réponses :)

            Citation : Maxibolt

            Ici, le code en lui-même est assez propre pour un débutant, à quelques exceptions près : tes commentaires.



            J'ai lu ton lien qui m'a bien aidé pour les commentaires (même si je vois toujours pas trop l'utilité d'en faire, je me force ^^)
            Donc, si j'ai bien compris, autant résumer un bloc d'instruction que de commenter inutilement ?

            -

            Citation : Maxibolt

            Ensuite, le system("pause"). En Python, on utilise rarement ça, on préfère la fonction input().



            J'ai changé: au lieu de mettre du system("pause") à la fin de chaque bloc, je l'ai mis à la fin du code. Ça marche ;) (en même temps j'ai retapé plus ou moins entièrement mon code)

            -

            Citation : Maxibolt

            Tes deux codes où la roulette et le chiffre donné ont la même parité sont presque exactement les mêmes : pour éviter la redondance, il serait astucieux de les regrouper en un seul, avec une seule condition : dans le cas général, tu utiliserais un or sur les deux and, mais là, il suffit de tester l'égalité des deux modulos. Il y a quand même une différence sur l'affichage pair/impair : c'est ici que tu feras la différence entre les deux, à l'aide d'un if.
            Comme ça, si tu veux changer le message, hop, tu ne dois le faire qu'une seule fois.



            Effectivement, c'était un peu lourd... J'avais d'abord changé pour:

            elif numRoulette%2 == 0 and num%2 == 0 or (numRoulette%2 != 0 and num%2 != 0):
            


            Mais au final j'ai préféré oublier l'affichage du pair/impair et me baser plus sur l'aspect de la couleur qui est la même ou non.
            Donc c'est devenu:

            elif numRoulette%2 == nombreMise%2:
            


            -

            Citation : Maxibolt

            Enfin, on conseille en général d'éviter d'utiliser le from module import *



            A cause de ça, il y avait un problème dans le code. J'avais importé directement la fonction ceil(), mais j'avais laissé des "math.ceil(mise/2)" trainer, donc le problème de la console est réglé ^^

            -

            Citation : Maxibolt

            (haha, je me souviens, moi je lançais plein de fois le programme, et je faisais des print screen dans l'espoir de capturer ce qui était affiché. fin de la petite histoire)



            Ahahah, je fais exactement la même chose xD





            Citation : ShikiSokuZeku

            Pour continué à jouer après la fin du programme (qui fonctionne d'ailleur presque comme un programme séquentiel) il faut mettre une boucle infinie ('while 1:' ou 'while true:') entre la ligne 10 et 11 et breaké si la personne est ruiné ou a perdu



            J'ai réussi à faire ma boucle. C'est à peu près comme tu le dis ;)
            Et je me suis aidé de ton message pour insérer des try/except, tout ça quoi...

            J'avoue que ça a été dur, mais avec du courage j'y suis arrivé.

            Merci à vous deux ! Et bonne prog :)

            Kivl
            • Partager sur Facebook
            • Partager sur Twitter
              22 novembre 2010 à 18:31:32

              Citation : Kivl


              J'ai lu ton lien qui m'a bien aidé pour les commentaires (même si je vois toujours pas trop l'utilité d'en faire, je me force ^^)
              Donc, si j'ai bien compris, autant résumer un bloc d'instruction que de commenter inutilement ?


              Disons que pour les commentaires, si ce que tu fait est évident ce n'est pas la peine de le commenter, mais si ça ne saute pas vraiment aux yeux il vaut mieux commenter pour qu'une personne qui lirait ton code n'ait pas à se prendre la tête pendant des heures pour comprendre ce que tu es en train de faire.
              Par exemple, une ligne du style :
              #cherche un diviseur de n supérieur à 2, renvoie True si aucun False sinon
              not any(n % i == 0 for i in range(3, int(n**0.5) + 1, 2))
              

              même si ce n'est pas non plus très compliqué à comprendre pour quelqu'un qui utilise Python depuis un moment, on va dire que ça ne saute pas vraiment aux yeux (surtout sans contexte), donc en commentant c'est déjà beaucoup plus évident, et on peut comprendre que ça peut servir à tester si n est premier ou pas.
              • Partager sur Facebook
              • Partager sur Twitter

              Tp 1 (ZCasino)

              × 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