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 :
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 joueur1
, joueur2
: 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_actuel
, joueur1
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.