TP n°3 - Les fonctions - "7 qui perd"

2ème année maturité
Les TP de programmation se font au travers du site web et les exercices sont à sauvegarder sur votre OnDrive dans le dossier de TP.
Objectifs
  1. Décomposer un programme qui fonctionne déjà en plusieurs fonctions cohérentes.
  2. Faire le lien entre un logigramme et le découpage d'un programme en fonctions.
  3. Réutiliser la syntaxe def, les paramètres et return vus en cours.

Le jeu "7 qui perd" ci-dessous fonctionne déjà, mais tout son code est actuellement écrit "à plat" : il n'utilise aucune fonction. Votre travail n'est pas d'inventer un nouveau jeu, mais de reconstruire les fonctions dont ce programme a besoin.

Le corps du programme reste tel quel (la partie qui n'est pas dans une fonction) : la boucle du jeu, les appels aux fonctions, l'affichage. Ce sont ces appels qui vous indiquent le nom de chaque fonction et ce qu'elle doit recevoir en paramètre.

Point essentiel :
en section 3, le logigramme découpe le déroulement du jeu en blocs d'action. Les blocs en bleu sont exactement les 4 fonctions que vous devez écrire. Le reste du logigramme correspond au code déjà présent dans le corps du programme.

Marche à suivre conseillée :

  • Lisez les règles du jeu (section 2) si ce n'est pas déjà clair.
  • Étudiez le logigramme (section 3) et repérez les 4 blocs bleus.
  • Copiez le code de la section 4 dans Thonny.
  • Pour chaque bloc bleu, écrivez la fonction correspondante juste après from random import *, en vous basant sur la façon dont elle est appelée plus bas dans le programme (nom, paramètres, ce qu'elle doit renvoyer avec return).
  • Testez au fur et à mesure : le programme ne pourra tourner que lorsque les 4 fonctions existent.

"7 qui perd" se joue à 2 joueurs, en alternance.

  • Chaque joueur a un score total, qui commence à 0. Le premier joueur à atteindre 50 points gagne la partie.
  • À son tour, un joueur peut choisir de lancer deux dés, autant de fois qu'il le souhaite.
  • À chaque lancer, on additionne les deux dés :
    • si le total fait 7, le joueur perd tout ce qu'il avait accumulé durant ce tour (mais pas son score déjà validé), et c'est au tour de l'autre joueur ;
    • sinon, le total s'ajoute à un score "du tour" encore risqué : le joueur peut soit relancer les dés, soit s'arrêter.
  • S'il s'arrête, son score du tour est ajouté définitivement à son score total, puis c'est au tour de l'autre joueur.

Bon à savoir : il faut bien distinguer deux scores différents — le score total déjà « en banque » (définitif) et le score du tour en cours (encore risqué, effacé si le total des dés fait 7).

Voici le déroulement complet d'une partie, sous forme de logigramme. Les 4 blocs bordés de bleu sont les actions qui doivent devenir des fonctions dans votre code.

bloc = une fonction à créer bloc = instruction déjà dans le corps du programme parallélogramme = affichage / saisie losange = décision
oui non oui non oui non Début joueur = tirage aléatoire (1 ou 2) scores = [0, 0]   scoreInter = 0 scores[0]<50 et scores[1]<50 ? Demander au joueur : « tu lances les dés ? (o/n) » réponse == 'o' ? lancerDes() → d1, d2 calulScore(d1, d2) → scoreDes scoreInter += scoreDes scoreDes == 0 ? Afficher : « tour perdu, passe » changerJoueur() scoreInter = 0 Afficher le score possible du tour scores[joueur-1] += scoreInter Afficher le score total du joueur changerJoueur() scoreInter = 0 afficherGagnant(scores) Fin

Astuce : sur un petit écran, faites défiler le schéma horizontalement, ou ouvrez cette page sur un ordinateur pour le voir en entier.

À l'aide du bouton "Copier", reproduisez ce code dans Thonny, puis écrivez les 4 fonctions manquantes juste après l'import, à la place du commentaire TODO.

python
                                
from random import *

# TODO : à vous de créer ces 4 fonctions, en vous aidant du logigramme (section 3)
#   - lancerDes()
#   - calulScore(de1, de2)
#   - changerJoueur(tour)
#   - afficherGagnant(scores)


joueur = randint(1, 2)
scores = [0, 0]
scoreInter = 0

while scores[0]<50 and scores[1]<50:
    if input(f'Joueur {joueur} : lance les dés (o/n) ? ') == 'o':
        d1, d2 = lancerDes()

        scoreDes = calulScore(d1, d2)
        scoreInter = scoreInter + scoreDes

        if scoreDes == 0:
            print(f'Tu fais [{d1}, {d2}], tu passes ton tour.')
            print(f'Ton total est de {scores[joueur-1]}')
            print('-'*20)
            joueur = changerJoueur(joueur)
            scoreInter = 0
        else :
            print(f'Tu fais [{d1}, {d2}] soit {scoreDes}, ton total serait de {scores[joueur-1] + scoreInter}')
    else:
        scores[joueur-1] = scores[joueur-1] + scoreInter
        print(f'Ton total est de {scores[joueur-1]}')
        joueur = changerJoueur(joueur)
        print('-'*20)
        scoreInter = 0

afficherGagnant(scores)
                            

Conseils :

  • Regardez comment une fonction est appelée pour savoir combien de paramètres elle prend : par exemple calulScore(d1, d2) prend deux valeurs.
  • Regardez ce que le programme fait du résultat pour savoir quoi return : par exemple d1, d2 = lancerDes() veut dire que la fonction doit renvoyer deux valeurs.
  • Testez votre programme régulièrement, même s'il manque encore des fonctions : Python vous dira clairement laquelle il ne trouve pas.

La syntaxe des fonctions (def, paramètres, return, portée des variables) a été vue en cours. Si besoin, retournez consulter :

Damien Cardinaux © 2024 - 2026. Ce site est sous licence CC BY-NC-SA 4.0