# Python - Mise en pratique

Nous allons mettre en pratique ce que nous avons vu jusqu'à maintenant dans un programme un peu plus conséquent.

L'objectif est de créer un mini jeu dans lequel vous pourrez jouer à la roulette. Les règles seront évidemment simplifiées.

- Le joueur mise sur un nombre (entier) entre 0 et 49, et annonce une mise en jetons (par exemple : 20 jetons).
- La croupière lance la roulette, et celle-ci déterminera le numéro gagnant. Les numéros impairs ont une couleur rouge, les numéros pairs sont noirs.
    - Si le joueur a misé sur le numéro gagnant, il remporte 3 fois sa mise
    - Si le joueur a misé sur un nombre de même couleur (donc de même parité que le numéro gagnant), il remporte 0,5 fois sa mise (arrondi à l'entier supérieur, car les jetons sont toujours entiers)
    - Sinon, le joueur perd sa mise. Notons qu'il la garde dans les deux autres cas, en plus de ses gains.
- Le joueur aura 100 jetons disponibles au début de la partie. Il ne peut miser qu'un nombre entier de jeton, et seulement des jetons qu'il possède.
- Si le joueur tombe à zéro jetons, la partie est finie.
- Sinon, il peut rejouer (mais n'est pas obligé).

Imprégnez-vous bien des règles du jeu.

1. Créez un nouveau fichier appelé `roulette.py`.
2. Copiez le contenu suivant dedans. Ce sera la structure du script, que vous complèterez à l'aide des questions suivantes. 

    Il y a de nombreux `#TODO` (parfois `"#TODO"`) qu'il faudra remplacer par le code adéquat.

    L'instruction `pass` sert à ne rien faire tout en ayant un script valide qui pourra donc s'exécuter sans erreur pour que vous puissiez avancer et tester votre code. Vérifiez que le code ci-dessous fonctionne sans erreur (il ne fera évidemment pas ce qui est demandé, ça c'est votre job !)

    ~~~python
    from random import randint
    #TODO

    def miser(jetons_restants):
        #TODO
        return 7, 12

    def choisir_nombre():
        nombre = -1
        while "#TODO condition" :
            nombre = "#TODO demander un nombre à l'utilisatrice"
            if "#TODO condition":
                print("Erreur : le nombre doit être compris entre 0 et 49")
        return nombre

    #TODO fonction miser_jetons

    def tourner_la_roulette():
        numero = 8 #TODO
        print(f"Le croupier tourne la roulette. Le numéro {numero} est le numéro gagnant !")
        return numero

    def calculer_gains_couleur(mise):
        pass #TODO

    def calculer_gains_numero(mise):
        pass #TODO

    def continuer_de_jouer(jetons_restants):
        return #TODO Effacer cette ligne quand ce sera demandé
        if "#TODO condition":
            print("Vous êtes ruiné.e. C'est la fin de la partie.")
            #TODO Retourner une valeur
        else:
            #TODO Afficher les jetons restants (avec une phrase)
            rejouer = input("Souhaitez-vous continuer ? (o/n)")
            if rejouer == "o" or rejouer == "O":
                pass #TODO Retourner une valeur
            else:
                #TODO Annoncer qu'on quitte le jeu avec le nombre de jetons restants
                pass #TODO Retourner une valeur

    jetons = 100
    continuer = True

    while continuer:
        gains = 0
        numero_misé, mise = miser(jetons)

        numero_gagnant = tourner_la_roulette()
        #TODO Écrire ici la condition principale, pour déterminer les gains

        jetons += gains
        continuer = continuer_de_jouer(jetons)
    ~~~

3. Expliquez les étapes du programme qui se déroulent dans la boucle à la fin du script, et quand est-ce qu'elle s'arrête.
1. Complétez les fonctions suivantes à l'aide des règles du jeu :
    1. `calculer_gains_numero`
    1. `calculer_gains_couleur`. Comme nous voulons arrondir à l'entier supérieur, il faudra importer et utiliser la fonction `ceil` du module `math`. 
    
    Pour vérifier vos résultats, vous pouvez soit utiliser l'interpréteur en console, soit appeler les fonctions dans votre script et utiliser `print` pour afficher le résultat

2. Allez à la ligne `#TODO Écrire ici la condition principale, pour déterminer les gains`. Cette condition est celle qui permet de savoir si un joueur a gagné ou non.
    1. Écrivez la condition en utilisant les fonctions `calculer_gains_couleur` et `calculer_gains_numero`. N'oubliez pas le cas où le joueur perd.
    2. Ajoutez des `print` dans chaque branche pour annoncer les gains ou pertes.
    3. Testez les différents cas possibles en modifiant les valeurs retournées par la fonction `tourner_la_roulette`
1. Maintenant que nous sommes sûrs que nos trois cas fonctionnent, nous allons pouvoir réellement tirer un nombre au hasard. Pour cela, nous avons déjà importé la fonction `randint` du module `random` dont voici la [documentation](https://docs.python.org/3.13/library/random.html#random.randint) :
    > random.**randint**(a, b)
    >
    > Return a random integer N such that a <= N <= b. Alias for randrange(a, b+1).
    
    1. Expliquez brièvement ce que fait `randint`
    2. Modifiez la fonction `tourner_la_roulette` de façon à ce qu'elle retourne un nombre entre 0 et 49 tiré aléatoirement.

1. Le coeur du jeu semble maintenant fonctionner. Il ne reste plus qu'à permettre à la joueuse d'interagir avec le programme. Commençons par la mise.
    1. Complétez la fonction `choisir_nombre` de façon à ce que l'on demande à la joueuse un nombre tant que celui-ci n'est pas valide. Pour simplifier, considérons que personne ne s'amusera à entrer autre chose que des nombres (nous verrons plus tard dans l'année un moyen bien plus efficace de gérer les erreurs).
    2. Complétez la fonction `miser` pour qu'elle utilise notre fonction nouvellement complétée. Vérifiez que tout fonctionne comme prévu.
    3. Sur le même modèle que `choisir_nombre`, écrivez une fonction `miser_jetons` qui permettra à la joueuse de choisir un nombre de jetons à miser. Attention : il faudra vérifier qu'elle ne mise pas plus de jetons que ce qu'elle a. Vous aurez donc besoin d'un paramètre pour passer le nombre de jetons restants à votre fonction.
    4. Complétez la fonction `miser` pour qu'elle utilise notre nouvelle fonction. Vérifiez que tout fonctionne comme prévu.

1. Maintenant, il ne reste plus qu'à demander au joueur s'il souhaite continuer de jouer, et mettre fin à la partie s'il n'a plus de jetons. Dans la fonction `continuer_de_jouer`, retirez la première ligne, celle qui contient un `return`. Complétez le reste de la fonction en remplaçant les lignes contenant la mention `#TODO`. Testez votre programme de bout en bout.

1. Mettez le programme final dans votre compte rendu. 
