Examen Python 13

EXAMEN EN PYTHON SUJET 13

Examen Mini-Jeu d'Aventure

 

Partie 1 : Gestion de l'Inventaire

Exercice 1 : Création de l'inventaire

Analysez ce code :

# Initialisation de l'inventaire inventaire = { "or": 100, "potion": 3, "epee": 1, "bouclier": 0, "cle": False } print("=== INVENTAIRE DU HÉROS ===") for objet, quantite in inventaire.items(): print(f"{objet}: {quantite}")

a) Quel est le type de la variable inventaire ? .............................

b) Que signifie .items() dans la boucle for ? .............................

c) Modifiez le code pour ajouter 50 pièces d'or supplémentaires et afficher le nouveau total.

Correction Exercice 1 :

a) La variable inventaire est de type dict (dictionnaire).

b) .items() permet de parcourir simultanément les clés et les valeurs d'un dictionnaire.

c) Code modifié :

# Initialisation de l'inventaire inventaire = { "or": 100, "potion": 3, "epee": 1, "bouclier": 0, "cle": False } # Ajout de 50 pièces d'or inventaire["or"] = inventaire["or"] + 50 print("=== INVENTAIRE DU HÉROS ===") for objet, quantite in inventaire.items(): print(f"{objet}: {quantite}") print(f"\nTotal d'or: {inventaire['or']} pièces")

Explication : Pour modifier une valeur dans un dictionnaire, on utilise la syntaxe inventaire["or"] = inventaire["or"] + 50

Partie 2 : Combat Avancé

Exercice 2 : Système de combat avec plusieurs monstres

Complétez ce code de combat :

pv_joueur = 100 force_joueur = 15 monstres = ["Gobelin", "Orc", "Dragon"] pv_monstre = [30, 50, 100] print("Début du combat !") for i in range(len(monstres)): print(f"\nVous affrontez un {monstres[i]} avec {pv_monstre[i]} PV") # Le joueur attaque pv_monstre[i] = _______________ # Complétez if pv_monstre[i] <= 0: print(f"Vous avez vaincu le {monstres[i]} !") else: print(f"Il reste {pv_monstre[i]} PV au {monstres[i]}") # Le monstre contre-attaque pv_joueur = _______________ # Complétez (perte de 10 PV) print(f"Le {monstres[i]} vous inflige 10 dégâts !")

a) Complétez les lignes manquantes :

b) Que fait range(len(monstres)) ? .............................

c) Modifiez le code pour que le combat s'arrête si le joueur tombe à 0 PV :

Correction Exercice 2 :

a) Code complété :

pv_joueur = 100 force_joueur = 15 monstres = ["Gobelin", "Orc", "Dragon"] pv_monstre = [30, 50, 100] print("Début du combat !") for i in range(len(monstres)): print(f"\nVous affrontez un {monstres[i]} avec {pv_monstre[i]} PV") # Le joueur attaque pv_monstre[i] = pv_monstre[i] - force_joueur # Correction if pv_monstre[i] <= 0: print(f"Vous avez vaincu le {monstres[i]} !") else: print(f"Il reste {pv_monstre[i]} PV au {monstres[i]}") # Le monstre contre-attaque pv_joueur = pv_joueur - 10 # Correction print(f"Le {monstres[i]} vous inflige 10 dégâts !")

b) range(len(monstres)) génère une séquence de 0 à 2 (car il y a 3 monstres), ce qui permet de parcourir tous les éléments des deux listes en parallèle.

c) Version avec arrêt si PV ≤ 0 :

pv_joueur = 100 force_joueur = 15 monstres = ["Gobelin", "Orc", "Dragon"] pv_monstre = [30, 50, 100] print("Début du combat !") for i in range(len(monstres)): if pv_joueur <= 0: # Vérification des PV print("\nVous êtes trop faible pour continuer !") break print(f"\nVous affrontez un {monstres[i]} avec {pv_monstre[i]} PV") # Le joueur attaque pv_monstre[i] = pv_monstre[i] - force_joueur if pv_monstre[i] <= 0: print(f"Vous avez vaincu le {monstres[i]} !") else: print(f"Il reste {pv_monstre[i]} PV au {monstres[i]}") pv_joueur = pv_joueur - 10 print(f"Le {monstres[i]} vous inflige 10 dégâts !") print(f"Vos PV restants: {pv_joueur}") if pv_joueur <= 0: print("\nGame Over !") else: print("\nFélicitations, vous avez survécu à tous les monstres !")

Explication : On ajoute une condition avec break pour sortir de la boucle si les PV tombent à 0 ou moins.

Partie 3 : Fonctions Avancées

Exercice 3 : Création d'un système de magie

Écrivez une fonction qui gère les sorts magiques :

def lancer_sort(nom_sort, mana_joueur, pv_cible): """ Lance un sort magique. Retourne un tuple (nouveau_mana, nouveaux_pv_cible, message) """ if nom_sort == "boule_de_feu": if mana_joueur >= 20: # À compléter : coûte 20 mana, inflige 40 dégâts pass else: return (mana_joueur, pv_cible, "Pas assez de mana !") elif nom_sort == "soin": if mana_joueur >= 15: # À compléter : coûte 15 mana, soigne 30 PV pass else: return (mana_joueur, pv_cible, "Pas assez de mana !") else: return (mana_joueur, pv_cible, "Sort inconnu !") # Test de la fonction resultat = lancer_sort("boule_de_feu", 25, 100) print(resultat)

a) Complétez la fonction pour les sorts "boule_de_feu" et "soin"

b) Quelle est l'utilité des docstrings (triples guillemets) ? .............................

c) Testez la fonction avec différents paramètres

Correction Exercice 3 :

a) Fonction complétée :

def lancer_sort(nom_sort, mana_joueur, pv_cible): """ Lance un sort magique. Retourne un tuple (nouveau_mana, nouveaux_pv_cible, message) """ if nom_sort == "boule_de_feu": if mana_joueur >= 20: nouveau_mana = mana_joueur - 20 nouveaux_pv = pv_cible - 40 if nouveaux_pv < 0: nouveaux_pv = 0 return (nouveau_mana, nouveaux_pv, "Boule de feu lancée ! 40 dégâts infligés.") else: return (mana_joueur, pv_cible, "Pas assez de mana !") elif nom_sort == "soin": if mana_joueur >= 15: nouveau_mana = mana_joueur - 15 nouveaux_pv = pv_cible + 30 if nouveaux_pv > 100: # PV maximum de 100 nouveaux_pv = 100 return (nouveau_mana, nouveaux_pv, "Sort de soin lancé ! +30 PV.") else: return (mana_joueur, pv_cible, "Pas assez de mana !") else: return (mana_joueur, pv_cible, "Sort inconnu !") # Tests de la fonction print("=== TESTS DES SORTS ===") # Test 1 : Boule de feu réussie resultat = lancer_sort("boule_de_feu", 25, 100) print(f"Test 1 - Boule de feu: {resultat}") # Test 2 : Boule de feu échouée (pas assez de mana) resultat = lancer_sort("boule_de_feu", 10, 100) print(f"Test 2 - Boule de feu (échec): {resultat}") # Test 3 : Soin réussi resultat = lancer_sort("soin", 20, 50) print(f"Test 3 - Soin: {resultat}") # Test 4 : Sort inconnu resultat = lancer_sort("éclair", 30, 100) print(f"Test 4 - Sort inconnu: {resultat}")

b) Les docstrings servent à :

  • Documenter ce que fait la fonction
  • Expliquer les paramètres attendus
  • Décrire la valeur de retour
  • Être accessible via help(lancer_sort)

c) Tests supplémentaires :

# Test avec PV négatifs potentiels print("\n=== TESTS AVANCÉS ===") resultat = lancer_sort("boule_de_feu", 50, 30) print(f"Monstre avec peu de PV: {resultat}") # Résultat : (30, 0, "Boule de feu lancée ! 40 dégâts infligés.") # Test de soin avec PV déjà élevés resultat = lancer_sort("soin", 20, 90) print(f"Soin avec PV élevés: {resultat}") # Résultat : (5, 100, "Sort de soin lancé ! +30 PV.")

Partie 4 : Défi Final - Extension du Jeu

Exercice 4 : Système de quêtes et d'expérience

Créez un système de quêtes qui donne de l'expérience :

# Variables initiales experience = 0 niveau = 1 quetes_terminees = [] quetes_disponibles = [ {"nom": "Tuer 3 gobelins", "xp": 100, "terminee": False}, {"nom": "Trouver le trésor perdu", "xp": 200, "terminee": False}, {"nom": "Sauver le village", "xp": 300, "terminee": False} ] def terminer_queste(nom_quete): # À compléter : trouve la quête, la marque comme terminée # ajoute l'XP et vérifie le niveau up pass def afficher_progression(): # À compléter : affiche XP, niveau et quêtes pass # Test print("=== SYSTÈME DE QUÊTES ===") terminer_queste("Tuer 3 gobelins") afficher_progression()

a) Complétez la fonction terminer_queste()

b) Complétez la fonction afficher_progression()

c) Ajoutez un système de montée de niveau (1000 XP par niveau)

Correction Exercice 4 :

a) et b) Code complet :

# Variables initiales experience = 0 niveau = 1 quetes_terminees = [] quetes_disponibles = [ {"nom": "Tuer 3 gobelins", "xp": 100, "terminee": False}, {"nom": "Trouver le trésor perdu", "xp": 200, "terminee": False}, {"nom": "Sauver le village", "xp": 300, "terminee": False} ] def terminer_queste(nom_quete): global experience, niveau, quetes_terminees # Recherche de la quête for quete in quetes_disponibles: if quete["nom"] == nom_quete and not quete["terminee"]: # Marquer comme terminée quete["terminee"] = True quetes_terminees.append(nom_quete) # Ajouter l'XP experience += quete["xp"] # Vérifier la montée de niveau while experience >= niveau * 1000: niveau += 1 print(f"Félicitations ! Vous passez niveau {niveau} !") print(f"Quête '{nom_quete}' terminée ! +{quete['xp']} XP") return True print(f"Quête '{nom_quete}' non trouvée ou déjà terminée") return False def afficher_progression(): print("\n" + "="*40) print(f"NIVEAU {niveau} | XP: {experience}/{niveau * 1000}") print("="*40) print("\n=== QUÊTES TERMINÉES ===") if quetes_terminees: for q in quetes_terminees: print(f"✓ {q}") else: print("Aucune quête terminée") print("\n=== QUÊTES DISPONIBLES ===") quetes_restantes = [q for q in quetes_disponibles if not q["terminee"]] if quetes_restantes: for i, quete in enumerate(quetes_restantes, 1): print(f"{i}. {quete['nom']} (+{quete['xp']} XP)") else: print("Toutes les quêtes sont terminées !") print("="*40) # Tests du système print("=== SYSTÈME DE QUÊTES ===") # Test 1 : Terminer une quête terminer_queste("Tuer 3 gobelins") afficher_progression() # Test 2 : Terminer une autre quête print("\n" + "-"*40) terminer_queste("Trouver le trésor perdu") afficher_progression() # Test 3 : Essayer de terminer une quête déjà faite print("\n" + "-"*40) terminer_queste("Tuer 3 gobelins") # Déjà terminée # Test 4 : Terminer la dernière quête print("\n" + "-"*40) terminer_queste("Sauver le village") afficher_progression() # Test avec beaucoup d'XP (pour tester le niveau up) print("\n=== TEST NIVEAU UP ===") experience = 2500 # Assez pour niveau 3 niveau = 1 while experience >= niveau * 1000: niveau += 1 print(f"XP: {experience} -> Niveau atteint: {niveau}")

c) Explication du système de niveau :

  • Chaque niveau nécessite 1000 XP de plus que le précédent
  • Niveau 1 → 0-999 XP
  • Niveau 2 → 1000-1999 XP
  • Niveau 3 → 2000-2999 XP, etc.
  • On utilise une boucle while pour gérer les montées multiples de niveau
 

Questions / Réponses

Aucune question. Soyez le premier à poser une question.
Aucune note. Soyez le premier à attribuer une note !

Ajouter un commentaire

Anti-spam