Projet : Le jeu des Batonnêts

Voici les règles de ce jeu : 

​Ce jeu se joue à deux joueurs.
On dispose d’un certain nombre de bâtonnets disposés sur une table.
Chaque joueur à tour de rôle prend un, deux ou trois bâtonnets.
Le joueur qui prend le dernier bâtonnet a perdu.

Voici une vidéo explicative :

Travail à réaliser

Vous devrez compléter le script fourni afin d’implémenter en Python le jeu des bâtonnets.
Réalisez les étapes qui suivent dans l’ordre et vérifier au fur et à mesure votre code.

Etude du script fourni

a) Ouvrez Thonny et créez un fichier boyard_nom1_nom2.py  dans lequel vous copiez le code donné ci-dessous :

Python

C’est le squelette de votre projet (les fonctions sont déjà présentes mais vous devez créer les fonctions une par une)

b) Observez la structure du code en plusieurs zones délimitées par des commentaires :

  • Importation des modules
  • Fonctions d’affichage
  • Fonctions relatives aux joueurs
  • Fonctions liées aux coups joués
  • Fonction principale

c) Les noms des fonctions et des paramètres associés sont imposés, respectez-les! Les noms de paramètres réutilisés dans plusieurs fonctions différentes correspondent volontairement aux mêmes données (leurs significations respectives ne seront donc fournies qu’une fois dans l’énoncé à traiter)

d) Remarquez le mot-clé pass utilisé dans chaque fonction. Il permet de réserver un espace pour la définition d’une fonction à venir. Autrement dit, tant qu’aucun code n’est écrit dans une fonction, aucune erreur ne sera levée. Veillez donc, à n’enlever les mot-clés pass qu’au fur et à mesure de votre travail.

​e) N’oubliez pas d’écrire au fur et à mesure une docstring adaptée à chaque fonction

Fonctions d’affichage

Affichage du joueur courant

Compléter le code de la procédure affiche_joueur acceptant un seul paramètre de type chaîne de caractères joueur_actuel (correspondant au nom du joueur).Elle affichera un message indiquant au joueur en cours de jouer.

​Par exemple :

>>> affiche_joueur('Bob')
 --> A Bob de jouer​

Affichage de la situation

Compléter le code de la procédure affiche_situation acceptant un seul paramètre de type entier situation (correspondant au nombre de bâtonnets encore présents dans le tas).
Elle affichera ces bâtonnets en utilisant pour chacune d’entre-eux le symbole | (Réaliser pour l’instant un affichage dans lequel les bâtonnets seront alignés horizontalement)

​Par exemple :

>>> affiche_situation(5)
 | | | | | ​

Affichage du choix du joueur

Compléter le code de la procédure affiche_choix acceptant deux paramètres :

  • joueur_actuel
  • choix : un entier correspondant au nombre de bâtonnets que le joueur souhaite prendre.

Elle affichera une phrase présentant le nombre de bâtonnets pris par le joueur en cours.

​Par exemple :

>>> affiche_choix(2, 'Lea')
 Lea prend 2 bâtonnet(s)​

Affichage des coups possibles

Compléter le code de la procédure affiche_coups acceptant un seul paramètre : un entier coups_max représentant le nombre maximal de bâtonnets pouvant être pris par un joueur lors de son tour.

Elle affichera une phrase présentant les choix possibles.

​Par exemple :

>>> affiche_coups(3)
 Vous pouvez prendre 1, 2 ou 3 bâtonnets

>>> affiche_coups(1)
 Vous ne pouvez prendre qu'un seul bâtonnet​

Affichage du résultat de la partie

Compléter le code de la procédure affiche_fin_partie acceptant un seul paramètre : joueur_actuel.
Elle affichera une phrase présentant indiquant que le tas de bâtonnets est vide et présentant le perdant (il s’agira du joueur en cours : celui ayant pris le dernier bâtonnet).

​Par exemple :

>>> affiche_fin_partie('Enzo')
 Enzo a pris le dernier bâtonnet, il a perdu !

Fonctions relatives aux joueurs

Tirage au sort initial

Compléter le code de la fonction premier_joueur acceptant deux paramètres joueur1joueur2 : des chaînes de caractères représentant les noms des deux joueurs.

La fonction devra renvoyer le nom d’un joueur tiré au sort pour être le premier à jouer.

Vous utiliserez la fonction random() du module random (pensez à l’importer dans la zone réservée et étudiez la documentation correspondante).

Si le nombre tiré au sort est inférieur à 0,5 choisissez joueur1, dans le cas contraire choisissez joueur2.  

Par exemple :

>>> premier_joueur('Mike', 'Cindy')
 'Cindy'​

Changement de joueur tour après tour

Compléter le code de la fonction change_joueur acceptant trois paramètres : joueur_actueljoueur1 et joueur2

La fonction devra renvoyer le nom du joueur, qui n’est pas le joueur en cours.

​Par exemple :

>>> change_joueur('Leo', 'Bob', 'Leo')
 'Bob'

Fonctions liées aux coups joués

Existe-t-il un coup possible?

Compléter le code du prédicat existe_coup acceptant un seul paramètre situation.

Le booléen renvoyé indiquera si un coup est-encore possible pour le joueur (s’il reste donc au moins un bâtonnet dans le tas)

​Par exemple :

>>> existe_coup(8)
 True

>>> existe_coup(0)
 False​

Quels sont les coups possibles?

Compléter le code de la fonction coups_possibles acceptant un seul paramètre situation.

L’entier renvoyé par la fonction correspondra aux nombre maximum de bâtonnets pouvant être pris par le joueur (attention ce nombre dépend du nombre de bâtonnets encore restants)

​Par exemple :

>>> coups_possibles(9)
 3

>>> coups_possibles(2)
 2​

Choisir le nombre de bâtonnets à prendre

Compléter le code de la fonction choix_coups acceptant un seul paramètre coups_max.

La fonction devra demander à l’utilisateur le nombre d’allumettes qu’il souhaite prendre. Attention ce nombre devra être compatible avec la valeur de coups_max (on le rappelle : le nombre maximal de bâtonnets pouvant être pris par un joueur lors de son tour). Cette demande s’effectuera tant que la valeur choisie ne sera pas possible. La fonction retournera cette valeur.

Mettre à jour le nombre de bâtonnetss après le choix d’un joueur

Compléter le code de la fonction msj_situation acceptant deux paramètres : choix et situation.

La fonction doit renvoyer le nombre d’allumettes restantes après le choix du joueur en cours.

Par exemple :

>>> msj_situation(2, 15)
 13

>>> msj_situation(3, 8)
 5

Fonction principale de jeu

La fonction jouer est la seule fonction directement appelée par l’utilisateur pour exécuter le jeu. Son rôle est d’appeler les fonctions précédentes afin de réaliser une partie complète de jeu des bâtonnets entre deux joueurs humains.

Voici l’algorithme écrit en pseudo-code décrivant les instructions réalisées par cette fonction.

1:  situation ← 18
2:  joueur1 ← Demandez le nom d'un joueur
3:  joueur2 ← Demandez le nom de l'autre joueur
4:  joueur_actuel ← tirage au sort du premier joueur
5:  Afficher le nombre de bâtonnets encore présents
6:  TANT QUE un coup est encore possible faire :
7:     SI un bâtonnet a déjà été pris avant faire:
8:         joueur_actuel ← nouveau joueur
9:     fin SI
10:    Afficher le nom du joueur qui doit jouer
11:    coups_max ← Nombre de bâtonnets maximum pouvant être pris par le joueur actif
12:    Afficher le nombre précédent
13:    choix ← Demander le nombre de bâtonnets à prendre
14:    situation ← nombre de bâtonnets restants après le choix du joueur
15:    Afficher le choix réalisé par le joueur
16:    Afficher le nombre de bâtonnets restants
17:  fin TANT QUE
18:  Afficher le perdant

Ecrivez la définition de la fonction jouer en réutilisant toutes les fonctions précédentes.
Puis, tester le fonctionnement du jeu en l’appelant.

Approfondissement

Si vous décidez de réaliser tout ou partie de ces approfondissements rendez en plus du script précédent d’autres scripts nommés différemment.   

​1) Sans changer les règles du jeu, proposez une ou plusieurs fonctionnalités supplémentaires au jeu  

​2) Créez un script qui simule une partie contre une machine qui choisirait lorsque c’est son tour de jouer de façon aléatoire entre 1, 2 ou 3 bâtonnets

​​3) En vous inspirant de la vidéo suivante où une méthode est donnée pour gagner à ce jeu, créez un script qui simule une partie contre un ordinateur qui utiliserai cette méthode.