Jeu de casino

Résolu/Fermé
MakinoJamal - Modifié le 20 janv. 2023 à 13:38
mamiemando Messages postés 32948 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 février 2024 - 6 janv. 2023 à 19:03

Bonjour,

J'aurais besoin d'aide pour écrire un programme Python dont voici l'énoncé :

Soit un Casino : une roulette comporte 13 nombres de (0 - 12) :

Le joueur a plusieurs types de paris possibles :

  • il peut choisir de parier sur le numéro sortant, et dans ce cas, s’il gagne, il remporte douze fois sa mise ;

  • il peut choisir de parier sur la parité du numéro sortant (pair ou impair), et dans ce cas, s’il gagne, il remporte deux fois sa mise ;

  • enfin, il peut choisir de parier sur la couleur du numéro sortant (rouge ou noir), et dans ce cas aussi, s’il gagne, il remporte deux fois sa mise.

Si le joueur perd son pari, il ne récupère pas sa mise.

Pour simplifier, on suppose que le numéro 0 n’est ni rouge ni noir, mais est pair. Pour simplifier encore, on suppose que le joueur mise systématiquement 10 euros.

Écrire un programme qui aide le croupier à déterminer la somme que le casino doit donner au joueur.

Le programme lira, dans l’ordre, deux nombres entiers en entrée : le pari du joueur (représenté par un nombre entre 0 et 16, voir description plus bas), et le numéro issu du tirage (nombre entre 0 et 12). Le programme affichera alors le montant gagné par le joueur.

Entrées pour le pari du joueur :

  • nombre entre 0 et 12 : le joueur parie sur le numéro correspondant

  • 13 : le joueur parie sur pair

  • 14 : le joueur parie sur impair

  • 15 : le joueur parie sur la couleur rouge

  • 16 : le joueur parie sur la couleur noire

Voici mon code : 

a = int(input())
b = int(input())

if b == a:
    print(10 * 12)
elif a == 0 or a == 13 or a == 14 and b % 2 == 0:
    print(10 * 2)
elif a == 15 or a == 16 and b % 2 == 0:
    print(10 * 2)
else :
    print(10 * 0)

Ce code ne fonctionne pas sur tous les couples de chiffres. Pouvez-vous s'il vous plaît m'aider à améliorer ce programme ?

Merci beaucoup.

6 réponses

yg_be Messages postés 22483 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 février 2024 1 445
6 janv. 2023 à 16:00

bonjour, pour quel couple ne fonctionne-t-il pas?

0
yg_be Messages postés 22483 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 février 2024 1 445
6 janv. 2023 à 16:01

connais-tu la priorité d'évaluation des opérateurs logiques?

0

Bonjour,

Merci d'avoir pris le temps de me repondre.

En effet je pense que c'est sur la priorité des opérateurs logiques que je peche.

mon code marche sur les couples suivants : (7et 7: ok) (7 et 9 :ok) et (16 et 4 : ok).

Pensez vous pouvoir améliorer le code?

0
yg_be Messages postés 22483 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 février 2024 1 445
Modifié le 6 janv. 2023 à 16:12

quand tu écris

a == 15 or a == 16 and b % 2 == 0

cela fait ceci

(a == 15) or (a == 16 and b % 2 == 0)

si tu veux une autre évaluation, ajoute des parenthèses

0
Madibajamal Messages postés 14 Date d'inscription vendredi 23 décembre 2022 Statut Membre Dernière intervention 6 janvier 2023
6 janv. 2023 à 16:25

Voici le nouveau code en insérant les parenthèses :

a = int(input())
b = int(input())

if b == a:
    print(10 * 12)
elif (a == 0) or (a == 13) or (a == 14) and b % 2 == 0:
    print(10 * 2)
elif (a == 15) or (a == 16) and b % 2 == 0:
    print(10 * 2)
else :
    print(10 * 0)

Mais ça ne fonctionne pas. Par exemple en rentrant le couple 13 et 1 doit renvoyer 0 me renvoie 20. je pense que c'est la ligne  2 (Pair et impair) qui pose problème.

Qu'en pensez vous?

Merci pour l'aide

0
yg_be Messages postés 22483 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 février 2024 1 445
6 janv. 2023 à 17:43

Je pense que tu n'as pas compris où mettre des parenthèses.

0
mamiemando Messages postés 32948 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 février 2024 7 722
6 janv. 2023 à 16:37

Bonjour,

Plusieurs recommandations :

  • Plutôt qu'utiliser a et b, tu pourrais utiliser des noms de variables plus parlant (par exemple pari et mise). Il est également recommandé de contrôler si les paramètres saisis sont corrects.
pari = int(input("Pari [0-16] ?"))
if not 0 <= pari <= 16:
    raise ValueError(f"Pari invalide: {pari}")
tirage = int(input("Tirage [0-16] ?"))
if not 0 <= tirage <= 16:
    raise ValueError(f"Tirage invalide: {tirage}")
  • Afin d'améliorer la lisibilité de ton programme tu peux définir des "constantes" (en fait il n'y a pas de constante en python mais bref c'est l'idée) qui permettent d'abstraire les paris spéciaux :
PARI_PAIR = 13
PARI_IMPAIR = 14
PARI_ROUGE = 15
PARI_NOIR = 16

... ou de manière plus concise :

(PARI_PAIR, PARI_IMPAIR, PARI_ROUGE, PARI_NOIR) = range(13, 17)
  •  Tu peux écrire une fonction qui étant donné un pari, détermine si le tirage correspond à une case rouge (respectivement à une case noire, respectivement à un nombre pair, respectivement à nombre impair).
def est_pair(tirage):
    return tirage % 2 == 0

def est_rouge(tirage):
    return tirage in {1, 3, 5, 7, 9, 12}

# etc...
  • Les tests appliqués permettront de déterminer le multiplicateur de gain (*2, *12, *0) selon la nature du pari et si celui-ci est réussi.
if pari == PARI_ROUGE and est_rouge(tirage):
    multiplicateur = 2
elif pari == PARI_PAIR and est_pair(tirage):
    multiplicateur = 2
...
  • Tu peux factoriser les tests qui conduisent au même multiplicateur, mais attention car l'opérateur logique ET est prioritaire sur l'opérateur logique OU :
if (
    (pari == PARI_ROUGE and est_rouge(tirage)) or
    (pari == PARI_PAIR and est_pair(tirage)) or 
    ...
):
    multiplicateur = 2
elif ...:
   ...
...
  • Tu peux définir une variable gain qui est calculée en fonction de mise et de multiplicateur.

Bonne chance 

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Madibajamal Messages postés 14 Date d'inscription vendredi 23 décembre 2022 Statut Membre Dernière intervention 6 janvier 2023
6 janv. 2023 à 16:53

Bonjour @mamiemando StatutModérateur

D'abord merci pour ton retour très complet et très riche par les détails apportés. Je note que vous avez un niveau beaucoup trop avancé pour moi. Malheureusement je ne comprends pas tout.

Je suis d'accord sur l'effet de nommer directement le nom de variable que a et b. et j'en prends bonne note.

Pour être totalement transparent, je suis un MOOC Apprendre à coder avec Python pour débutant. Je découvre la matière étape par étape et sur chaque exercice j'ai des contraintes d'appliquer les notions abordées jusqu'alors. C'est pourquoi j'ai dit que je ne comprenais pas tous les détails dans ta raponse bien que j'ai saisi certaines nuances par exemple sur la priorité des opérateurs logique.

Ainsi j'ai amélioré mon code. Mais ca ne fonctionne toujours pas. Peux tu stp le corrigé avec les notions simples ?

a = int(input())
b = int(input())

if b == a:
    print(10 * 12)
elif (a == 0 and b % 2 == 0) or (a == 14 and b % 2 == 0) or (a == 14 and b % 2 == 1):
    print(10 * 2)
elif (a == 13) and b % 2 == 0:
    print(10 * 2)
elif (a == 15) or (a == 16) and b % 2 == 0:
    print(10 * 2)
else :
    print(10 * 0)

Comment exprimer la parité sur impair avec le modulo %, soit pour impair peut on écrire : b % 2 == 1 pour exprimer lMPAIR?

Encore merci pour ton aide

0
mamiemando Messages postés 32948 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 février 2024 7 722
6 janv. 2023 à 17:14
  • l1 à l5 : ok
  • l6 : je suppose que a désigne le pari et que b désigne le tirage ?
    • Le test parait faux car b est forcément pair ou impair, donc le test se simplifie en :
      if (a == 0 and b % 2 == 0) or (a == 14)

      ... soit "le joueur parie sur 0 est tire un numéro pair, ou bien le joueur parie impair". En particulier, si le joueur parie impair, il rentre dans ce test peu importe la valeur du tirage. Je doute que c'est ce que tu veux écrire.

  • l8 : le test signifie "le joueur pari pair" et obtient un nombre pair, donc ça semble correct

  • l10 : le test signiifie "le joueur parie rouge, ou il parie noir et le tirage est pair". Là aussi c'est douteux, car on entre dans ce test dès que le pari est rouge, peut importe le tirage. Ensuite la couleur et la parité ne correspondent pas, donc la deuxième partie du test semble également incorrecte.

Comment exprimer la parité sur impair avec le modulo %, soit pour impair peut on écrire : b % 2 == 1 pour exprimer lMPAIR?

Oui. L'opérateur x % y retourne le reste de la division euclidienne x / y et est toujours compris entre 0 et y - 1.

Pour écrire ton programme, je te recommande de faire un test par situation (les pairs, les impairs, les rouges, les noirs) quitte à rassembler certains tests dans un second temps.

Bonne chance

0
Madibajamal Messages postés 14 Date d'inscription vendredi 23 décembre 2022 Statut Membre Dernière intervention 6 janvier 2023 > mamiemando Messages postés 32948 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 février 2024
6 janv. 2023 à 17:56

@mamiemando StatutModérateur

Mon code fonctionne avec persistance et surtout votre aide qui a été très précieux. vraiment un grand merci pour votre gentillesse, aide et patience, voici le code :

a = int(input())
b = int(input())

if b == a:
    print(10 * 12)
elif (a == 14) and b % 2 == 1:
    print(10 * 2)
elif (a == 13 and b % 2 == 0):
    print(10 * 2)
elif (a == 15) and (b == 1 or b == 3 or b == 5 or b == 7 or b == 9 or b == 12):
    print(10 * 2)
elif (a == 16) and (b == 2 or b == 4 or b == 8 or b == 11 or b == 10):
    print(10 * 2)
else :
    print(10 * 0)

En effet il fallait comparer à chaque valeur. Dans l'état je sais que ce code peut encore être amélioré et être plus concis avec les notions évoquées précédemment dans vos explications. A ce jour je ne suis pas encore en mesure de comprendre toutes ces subtilités et ne maitrise pas tout ça.

Je tenais vraiment à vous remercier pour votre pédagogie démontrée ici.

Aussi j'aimerai vous demander si vous même vous étiez développeur (se) informatique ou vous travaillez dans ce domaine?

Puis je vous demander votre carte de visite ?(mail?)

Par avance merci.

0
mamiemando Messages postés 32948 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 février 2024 7 722
6 janv. 2023 à 19:03

Bonjour,

Tout d'abord toutes mes félicitations, le code semble désormais correct.

Quelques parenthèses peuvent être omises (notamment celles l6, l8 + celles concernant l'opérande gauche du and des lignes 10 et 12).

Voici à quoi pourrait ressembler le programme une fois remis en forme selon les recommandations que je t'ai faites :

#!/usr/bin/env python3

PARI_PAIR = 13
PARI_IMPAIR = 14
PARI_ROUGE = 15
PARI_NOIR = 16

def est_pair(n: int) -> bool:
    return n % 2 == 0

def est_impair(n: int) -> bool:
    return n % 2 == 1

def est_rouge(n: int) -> bool:
    return n in {1, 3, 5, 7, 9, 12}

def est_noir(n: int) -> bool:
    return n in {2, 4, 5, 6, 8, 10, 11}

def saisie():
    pari = int(input("Pari [0-16] ?"))
    if not 0 <= pari <= 16:
        raise ValueError(f"Pari invalide: {pari}")

    tirage = int(input("Tirage [0-12] ?"))
    if not 0 <= tirage <= 12:
        raise ValueError(f"Tirage invalide: {tirage}")

    return (pari, tirage)

def calculer_multiplicateur(pari: int, tirage: int) -> int:
    if (
        (pari == PARI_PAIR   and est_pair(tirage))   or
        (pari == PARI_IMPAIR and est_impair(tirage)) or
        (pari == PARI_ROUGE  and est_rouge(tirage))  or
        (pari == PARI_NOIR   and est_noir(tirage))
    ):
        return 2
    elif pari == tirage:
        return 12
    else:
        return 0
    return 69

def main():
    (pari, tirage) = saisie()
    multiplicateur = calculer_multiplicateur(pari, tirage)
    mise = 10
    gains = multiplicateur * mise
    print(f"Pari: {pari} tirage: {tirage} --> Gains = {multiplicateur} * {mise}€ = {gains}€")

def test():
    for pari in range(0, 17):
        for tirage in range(0, 13):
            multiplicateur = calculer_multiplicateur(pari, tirage)
            print(f"Pari: {pari}, tirage: {tirage} --> multiplicateur: {multiplicateur}")

main()

Je tenais vraiment à vous remercier pour votre pédagogie démontrée ici.

Merci, ça fait toujours plaisir d'avoir des compliments et une part de la pédagogie revient aussi à yg_be.

Aussi j'aimerai vous demander si vous même vous étiez développeur (se) informatique ou vous travaillez dans ce domaine?

Oui je travaille dans le domaine.

Puis je vous demander votre carte de visite ?(mail?)

Pardonne-moi mais je ne communique jamais d'informations personnelles par le biais du forum. Tu peux cependant m'écrire par message privé ou poser d'autres questions sur le forum si le besoin s'en fait sentir.

Je te souhaite une excellente continuation et un bon apprentissage du python ;-)

0