Partage
  • Partager sur Facebook
  • Partager sur Twitter

Demande de vérification de code

Code de ZCasino

Sujet résolu
21 août 2010 à 16:57:17

Bonjour à tous ! :)

J'ai besoin de vous aujourd'hui, pour vérifier mon code de ZCasino. Je suis actuellement en train d'apprendre le langage python avec le tutoriel de ce site, et me voilà au point où je dois faire mon programme ZCasino (TP de fin d'introduction à pyhton).

Alors au début ça va, et puis arrive le moment où les erreurs font planter le programme ... Erreur ou quoi que ce soit d'autre.
Alors, dans mon code, il n'y pas de bloc try (bien que j'ai essayé de m'en servir pour déceler les erreurs ...), et Dieu seul sait ce qu'il n'y pas non plus, mais il n'est pas terminé ! Or pour le terminer, j'ai besoin de le tester entre le moment où je le commence et le moment où il est fini !

Seulement là ... Je ne peux rien tester du tout puisqu'à peine ai-je clické sur " Lancer dans un Terminal " que ce Terminal ce ferme ... ... :colere2:

Alors voilà je vous colle mon code actuel et de toute façon pour l'instant incomplet ; afin que peut-être, vous puissiez me dire ce qu'il ne va pas :euh:

#!/usr/bin/python3
# -*-coding:Utf-8 -*

# On importe les modules nécessaires à la réalisation du programme
from random import randrange
from math import ceil

# Boléen à valeur True par défaut
continuer = True

# Somme de départ
print("Indiquez la somme avec laquelle vous souhaitez commencer à jouer")
argent = input()
argent = int(argent)
print("Vous possèdez", argent, "$ pour commencer à jouer")

# Le joueur mise sur un numéro entre 0 et 49
while continuer: # Tant que le joueur peut continuer
    print("Indiquez la somme en dollars que vous souhaitez miser")
    SommeMisee = int(input())
    print("Choisissez un numéro compris entre 0 et 49 sur lequel vous misez", SommeMisee, "$")
    NumMise = int(input())

    # La roulette est lancée, le numéro gagnant est dévoilé au joueur
    NumAffiche = randrange(50)
    print("Après avoir été lancée, la roulette affiche", NumAffiche)

    # On agit en fonction du numéro sur lequel le joueur à misé, et le numéro affiché par la roulette
    if NumMise%2 = NumAffiche%2: # Si la roulette affiche un numéro pair ou impair comme le numéro sur lequel le joueur a misé
        if NumMise == NumAffiche: # Si le joueur a misé sur le bon numéro
            argent == SommeMisee + 3*SommeMisee
            print("Eh bien il semblerait que c'est votre jour ! Voici votre mise, suivie de vos gain !")
            print("Vous disposez à présent de", argent, "$")
        else: # Simplement si les numéros du joueur et de la roulette sont tous les deux (im)pairs
            argent == SommeMisee + SommeMisee/2
            print("C'est pas si mal !")
            print("Vous disposez à présent de", argent, "$")
    elif NumMise%2 != NumAffiche%2: # Si les numéros du joueur et de la roulette ne sont pas tous les deux (im)pairs
        argent == argent - SommeMisee
        print("Dommage, je garde la mise ... Il vous reste", argent, "$ à jouer")
        if argent <= 0:
            continuer = False
        continue

print("Vous êtes ruiné, revenez avec de quoi jouer !")
input()


Vraiment, j'aimerais que vous me disiez pourquoi il se ferme aussitôt qu'il est ouvert, alors qu'il est sensé au moins attendre que je lui donne la valeur de départ ... Je vous demanderais aussi de ne pas me faire part d'autre erreurs que mon code contiendrait, que celle qui ferme le programme dès le début. J'aimerais vraiment trouver les autres erreurs moi-même en le testant (quand je pourrai ... :euh: )

Autre chose qui peut, peut-être, être interessant : Je suis sous GNU/Linux Ubuntu 10.04 LTS et j'écris mon code avec l'éditeur de texte gedit que j'éxecute dans un terminal une fois fini.

Merci à vous :)
  • Partager sur Facebook
  • Partager sur Twitter
21 août 2010 à 17:45:45

Salut,

Je suis pas très habitué à Linux mais je pense pas que ton problème vienne directement de Python. Si Python relève une erreur, il l'affiche et s'arrête, mais il ne ferme pas le terminal (du moins, ça ne m'est jamais arrivé). Est-ce que tu lances ce programme en console ? Est-ce que ton code a bien les droits d'exécution ? Désolé de poser ces questions mais je ne connais, encore une fois, pas très bien le système sur lequel tu es :D .

Pour ton code j'ai repéré plusieurs erreurs mais celle qui fâche vraiment Python se trouve à la ligne 26 :

if NumMise%2 = NumAffiche%2:


Tu cherches à comparer, mais tu ne met qu'un seul égal (c'est une faute classique quand on débute). L'opérateur de comparaison d'égalité est ==, pas =. Et un peu plus bas tu as fait l'inverse : ton opérateur d'affectation est un opérateur d'égalité :) . Sinon, sauf le traitement d'erreur, le programme marche assez bien en l'état. Si tu arrives à avoir les erreurs que te retourne Python, tu peux arriver à un truc en béton ;) .

Prolixe
  • Partager sur Facebook
  • Partager sur Twitter
21 août 2010 à 17:58:48

:D

C'est magique en effet ! Je peux tester mon code maintenant !

Pour l'info, moi je débute sous Linux ... Alors console Terminal ou autre chose, je ne vois pas bien la différence s'il y en a une. Mais je lance mon code dans la même chose qui a réussi à faire tourner mon année bissextile, et ma table de multiplication :)

Eh bien ecoute, je te remercie parce que je pense que je n'aurai jamais trouvé : comme le terminal se fermait même avant de me demander la somme de départ, je m'obstinais à chercher une erreur dans ce coin là (assez restreint comme coin ... Je pouvais y rester longtemps ...). Donc je ne comprends pas pourquoi le programme se ferme avant de me demander la somme de départ, et pas seulement après l'erreur que tu as relevé o_O

Enfin bon, maintenant que ça marche, je te remercie encore une fois, pour ta réponse, et pour ton super tutoriel :D

Acerane
  • Partager sur Facebook
  • Partager sur Twitter
21 août 2010 à 18:26:54

Si le programme ne se lance pas c'est que la faute à la ligne 26 est une erreur de syntaxe. Tout comme les erreurs d'indentation, ce sont des erreurs qui empêchent tout simplement le code de s'exécuter, alors que d'autres erreurs feront planter le programme une fois que celui-ci est lancé. La c'est simplement que Python n'arrive pas à analyser le code qu'il se fâche tout rouge ^^ .

Mais dans le terminal tu devrais tout de même avoir l'exception Python qui te dis qu'à la ligne 26, il a relevé une erreur de syntaxe... c'est ça qui est surprenant. Enfin pour ça je ne peux pas beaucoup plus t'aider :D . Bonne continuation, et n'hésites pas si tu as des questions.

Prolixe
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
22 août 2010 à 12:27:03

Un exemple avec ton code de l'utilisation d'un bloc try

while 1:
    print("Indiquez la somme avec laquelle vous souhaitez commencer à jouer")
    try:
        argent = int(input())
        break # on sort de la boucle, on continue le programme
    except ValueError: # Si la commande int(input()) reçoit une mauvaise valeur, on lève une exception
        print("Veuillez entrer un nombre!!!")
        print('-'*len("Veuillez entrer un nombre!!!"))
        continue # on revient au debut de la boucle
    
print("Vous possèdez", argent, "$ pour commencer à jouer")


  • Partager sur Facebook
  • Partager sur Twitter
23 août 2010 à 13:10:26

Alors j'ai reussi à faire fonctionner mon code avec les blocs try et tout et tout, mais une fois terminé, j'ai trouvé mon code vraiment " bricolé " ^^
Alors j'ai étudié la correction, et j'en ai réecrit un (seulement la partie où il a interaction entre utilisateur et programme, la partie calcul des gains est la même)

Je vous le colle ici, j'aurais une question à vous poser à laquelle je n'arrive pas à répondre seul :euh:
Ne lisez peut-être pas tout, ma question concerne surtout les lignes 54 à 65.
En fait, lorsque je regarde mes boucles, je commence par " while " biensûr, et je termine par " continue ", et je remarque que les " continue " sont sur un niveau d'indentation décalé de 4 espaces sur la droite par rapport aux " while " qui leur correspond.
Sauf le " continue " de la ligne 65, qui est 8 espaces sur la droite par rapport à son " while ". J'ai bien voulu le remettre à 4 espaces seulement, mais si je fais ça : j'ai une boucle qui me redemande toute mes variables, et jamais la partie calcul ne s'execute ... Alors ce " continue " reste là ... Mais je ne sais pas pourquoi ... :o

#!/usr/bin/python3
# -*-coding:Utf-8 -*

# Cette version de ZCasino contient un meilleur code que celui du fichier ZCasino.py

# ZCasino vous permet de simuler un jeu de roulette dans lequel vous misez sur un numéro
# Si vous misez sur un numéro de la même couleur (pair ou impair) que celui sur lequel s'arrête la bille, vous gagnez 50% de votre mise
# Si vous misez sur le même numéro, vous gagnez 3 fois votre mise
# Sinon, vous perdez votre mise, le jeu s'arrête lorsque vous n'avez plus d'argent")

# Importation modules nécessaires
from random import randrange
from math import ceil

# Boléen à valeur True par défaut
continuer = True

# Somme de départ OK
argent = -1
while argent == -1:
    print("A combien s'élève votre somme initiale ?")
    argent = input()
    try:
        argent = int(argent)
    except ValueError:
        argent = 0
        print("C'est très mal vu de quitter la table sans avoir joué le premier tour !")
    if argent <= 0:
        argent = -1
        print("Sans argent, on ne joue pas !")
    continue

while continuer:
    # Somme misée OK
    SommeMisee = 0
    while SommeMisee == 0:
        print("Combien souhaitez-vous miser ?")
        SommeMisee = input()
        try:
            SommeMisee = int(SommeMisee)
        except ValueError:
            SommeMisee = 0
            print("Il va falloir miser plus !")
        if SommeMisee > argent:
            print("Depuis que vous êtes assis, vous avez pondu des oeufs d'or ?")
            SommeMisee = 0
        elif SommeMisee <= 0:
            print("Il va falloir miser plus !")
            SommeMisee = 0
        continue

    # Numéro choisi OK
    NumMise = -1
    while NumMise == -1:
        print("Choisissez un numéro compris entre 0 et 49")
        NumMise = input()
        try:
            NumMise = int(NumMise)
        except ValueError:
            NumMise = -1
            print("Ne m'obligez pas à être violent : choisissez un numéro !")
        if NumMise <= 0 or NumMise > 49:
            print("Vous vous fichez de moi ?")
            NumMise = -1
            continue

    # La roulette est lancée, le numéro gagnant est dévoilé au joueur OK
        NumAffiche = randrange(50)
        print("On lance la roulette ... ... Et la bille s'arrête sur le", NumAffiche, "!")

    # On agit en fonction du numéro sur lequel le joueur à misé, et le numéro affiché par la roulette OK
        if NumMise%2 == NumAffiche%2: # Si la roulette affiche un numéro pair ou impair comme le numéro sur lequel le joueur a misé
            if NumMise == NumAffiche: # Si le joueur a misé sur le bon numéro
                argent += ceil(3*SommeMisee)
                print("Eh bien il semblerait que ce soit votre jour ! Voici votre mise, suivie de vos gain !")
                print("Vous disposez à présent de", argent, "$")
            else: # Simplement si les numéros du joueur et de la roulette sont tous les deux (im)pairs
                argent += ceil((SommeMisee/2))
                print("C'est pas si mal !")
                print("Vous disposez à présent de", argent, "$")
        elif NumMise%2 != NumAffiche%2: # Si les numéros du joueur et de la roulette ne sont pas tous les deux (im)pairs
            argent -= SommeMisee
            print("Dommage, je garde la mise ... Il vous reste", argent, "$ à jouer")
            if argent <= 0:
                continuer = False
    continue

print("Vous êtes ruiné, revenez avec de quoi jouer !")
input()


Aussi, la troisième ligne de commentaire dit que ce code est meilleur que le fichier ZCasino. Je parle bien évidemment de mon acien code à moi (d'après moi), pas du code de la correction :p

Acerane
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
23 août 2010 à 13:36:02

while 1:


equivalent à:

while True:


Alors quand tu dis

continuer=True


C'est inutile!
Le code

argent = -1
while argent == -1:
    print("A combien s'élève votre somme initiale ?")
    argent = input()
    try:
        argent = int(argent)
    except ValueError:
        argent = 0
        print("C'est très mal vu de quitter la table sans avoir joué le premier tour !")
    if argent <= 0:
        argent = -1
        print("Sans argent, on ne joue pas !")
    continue


Mieux vaut

while 1: # tant que c'est vrai
    try:
        argent = int(input("A combien s'élève votre somme initiale ?"))# on factorise
        if argent>0: break # on sort de la boucle, sinon on revient au départ
    except ValueError: continue # plus logique est de redemander une valeur correcte


Edit: Fait l'essai de ce petit code et tu verras qu'il fait la même chose que ce que tu souhaites, sans les commentaires bien sûr

Faire la même chose pour la suite et c'est nickel :)

Tu peux voir mon code Zcasino, j'ai essayé de le faire le plus complet possible, mais en format POO, donc teste le juste en cherchant toutes les erreurs possibles de l'utilisateur, puis en jouant vraiment avec.

  • Partager sur Facebook
  • Partager sur Twitter
24 août 2010 à 22:41:50

Je pense que je comprends à peu près ton code fred1599, mais est-ce que tu pourrais m'eclairer pour mon histoire d'indentation là ?
  • Partager sur Facebook
  • Partager sur Twitter
25 août 2010 à 0:17:31

Si ta console se ferme immédiatement après avoir démarré le script, c'est sans doute parce que tu l'as exécuté en double-cliquant sur le fichier. Quand tu fais cela, python initie une console rien que pour lui. Or, quand il crash ou qu'il atteint la fin du programme, il n'a plus rien à faire, donc il ferme la console (et les précieuses informations qu'elle contenait).
Pour éviter ce comportement, il suffit de démarrer tes scripts depuis un terminal que tu as toi-même ouvert (cmd.exe sous Windows, sous Linux ça s'appelle Terminal) et de faire python tonscript.py (en te plaçant dans le bon répertoire avant, grâce à la commande cd). Ainsi, quand le programme termine, le terminal te redonne la main sans se fermer !

Pour ce qui est de l'indentation, tu peux mettre un continue ou un break à n'importe quel niveau dans ton while (ou dans ton for). Python sait que le continue fait forcément référence au while le plus proche. C'est d'ailleurs tout à fait normal, car mettre un continue au premier niveau d'indentation dans ton while, c'est un peu stupide (à moins de vouloir sauter le reste du code à des fins de debug) car c'est le comportement logique de while lorsque son bloc de code est terminé. Il est plus courant de voir un continue dans une condition par exemple, donc à un ou plusieurs niveaux d'indentations supplémentaires.

Par ailleurs fred1599, quand tu fais :
try:
   blabla
except Exception:
   print "oops"

tu ne lèves pas une exception, tu la captures. C'est un peu l'inverse de lever une exception, c'est-à-dire la provoquer expressément avec le keyword raise .
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
25 août 2010 à 10:09:17

En effet Zopieux, merci pour la précision :D
  • Partager sur Facebook
  • Partager sur Twitter
25 août 2010 à 17:01:53

J'ai pas tout compris pour l'indentation de " continue ", mais je suis OK pour l'histoire du Terminal, alors merci encore à vous ;)

Je passe le sujet en résolu :)
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
25 août 2010 à 17:31:08

Citation

J'ai pas tout compris pour l'indentation de " continue "



On met "continue" ou "break" qui permet de revenir au début de la boucle (continue) ou en sortir (break) après une condition.

Exemple:

while True:
    line = file.readline()
    if not line:
        break


  • Partager sur Facebook
  • Partager sur Twitter
25 août 2010 à 22:40:35

Ce qu'on veut simplement t'expliquer, c'est que les mots-clés break et continue peuvent être à n'importe quel niveau d'indentation, ils agiront sur la dernière boucle mise en place. Donc :
while True:
   if test == "bar":
      for item in mylist:
         if not item:
             if prout > 3:
                continue # n'execute pas la suite du code et passe à l'élément suivant dans le for
         else:
             print "blabla"
   elif test == "foo":
      break # sort de la boucle while à cet endroit, sans exécuter le reste
   print "blau blou"
  • Partager sur Facebook
  • Partager sur Twitter
26 août 2010 à 21:21:44

D'accord mais alors, testez mon code.
Pourquoi il tourne en rond à me demander ce que je mise et sur quel numéro sans jamais passer au résultat quand je décale le " continue " comme j'en ai parlé ?
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
26 août 2010 à 22:45:04

Mais la place de ton continue dépend seulement de la condition pour laquelle tu veux revenir au début de la boucle.

Après c'est juste une histoire d'algorithmie, c'est à toi d'essayer de comprendre pourquoi tu as placé ton continue à cet endroit. Pour moi si tu l'as placé à cet endroit,

if NumMise <= 0 or NumMise > 49:
            print("Vous vous fichez de moi ?")
            NumMise = -1
            continue


C'est simplement parce-que tu voulais revenir au début de la boucle sous la condition que le mec a rentré une valeur de mise <=0 ou >49.

Si c'est le cas, il va redemander de miser un numéro entre 1 et 49.

Pas besoin de tester le programme pour cela.

Si maintenant tu mettais ton continue avec une indentation de 4, ta boucle infinie ne se terminera jamais, il va te demander sans arrêt le numéro à miser.

C'est de la logique que tu as perdu dans ta réflexion, et il faut que tu revois l'algorithme (voir sur papier) pour comprendre cela.

  • Partager sur Facebook
  • Partager sur Twitter