ajout exercices, corrections diverses, glossaire

- Ajout des 10 TPs d'évaluation (sans PDF)
- Création GLOSSAIRE.md et AMELIORATIONS.md
- Corrections f-strings, eval(), sommaires

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-29 23:37:26 +01:00
parent 9ee1dcba80
commit 1290ccf453
43 changed files with 8682 additions and 42 deletions

View File

@@ -0,0 +1,471 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# TP Évaluation - Pokédex\n",
"\n",
"**Durée : 1h30**\n",
"\n",
"**Nom :** \n",
"\n",
"**Prénom :**\n",
"\n",
"---\n",
"\n",
"Dans ce TP, vous allez créer un système de gestion de Pokédex.\n",
"\n",
"**Compétences évaluées :**\n",
"- Manipulation de tuples et listes\n",
"- Dictionnaires et structures imbriquées\n",
"- Algorithmes de filtrage et tri"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Données initiales\n",
"\n",
"**Exécutez cette cellule avant de commencer.**"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Pokedex (liste de tuples)\n",
"# Chaque Pokemon : (nom, types, pv, attaque, defense, vitesse, evolution)\n",
"# types est un tuple de 1 ou 2 types\n",
"# evolution est None si pas d'evolution\n",
"\n",
"pokedex = [\n",
" (\"Bulbizarre\", (\"Plante\", \"Poison\"), 45, 49, 49, 45, \"Herbizarre\"),\n",
" (\"Herbizarre\", (\"Plante\", \"Poison\"), 60, 62, 63, 60, \"Florizarre\"),\n",
" (\"Florizarre\", (\"Plante\", \"Poison\"), 80, 82, 83, 80, None),\n",
" (\"Salameche\", (\"Feu\",), 39, 52, 43, 65, \"Reptincel\"),\n",
" (\"Reptincel\", (\"Feu\",), 58, 64, 58, 80, \"Dracaufeu\"),\n",
" (\"Dracaufeu\", (\"Feu\", \"Vol\"), 78, 84, 78, 100, None),\n",
" (\"Carapuce\", (\"Eau\",), 44, 48, 65, 43, \"Carabaffe\"),\n",
" (\"Carabaffe\", (\"Eau\",), 59, 63, 80, 58, \"Tortank\"),\n",
" (\"Tortank\", (\"Eau\",), 79, 83, 100, 78, None),\n",
" (\"Pikachu\", (\"Electrique\",), 35, 55, 40, 90, \"Raichu\"),\n",
" (\"Raichu\", (\"Electrique\",), 60, 90, 55, 110, None),\n",
" (\"Evoli\", (\"Normal\",), 55, 55, 50, 55, \"Multiple\"),\n",
" (\"Aquali\", (\"Eau\",), 130, 65, 60, 65, None),\n",
" (\"Voltali\", (\"Electrique\",), 65, 65, 60, 130, None),\n",
" (\"Pyroli\", (\"Feu\",), 65, 130, 60, 65, None),\n",
" (\"Mewtwo\", (\"Psy\",), 106, 110, 90, 130, None),\n",
" (\"Mew\", (\"Psy\",), 100, 100, 100, 100, None),\n",
" (\"Dracolosse\", (\"Dragon\", \"Vol\"), 91, 134, 95, 80, None),\n",
" (\"Leviator\", (\"Eau\", \"Vol\"), 95, 125, 79, 81, None),\n",
" (\"Lokhlass\", (\"Eau\", \"Glace\"), 130, 85, 80, 60, None)\n",
"]\n",
"\n",
"# Table des faiblesses (type_attaquant -> liste des types faibles)\n",
"faiblesses = {\n",
" \"Feu\": [\"Plante\", \"Glace\"],\n",
" \"Eau\": [\"Feu\", \"Sol\"],\n",
" \"Plante\": [\"Eau\", \"Sol\"],\n",
" \"Electrique\": [\"Eau\", \"Vol\"],\n",
" \"Glace\": [\"Dragon\", \"Vol\", \"Plante\"],\n",
" \"Psy\": [\"Poison\"],\n",
" \"Dragon\": [\"Dragon\"],\n",
" \"Vol\": [\"Plante\"]\n",
"}\n",
"\n",
"# Equipe du joueur (liste de noms)\n",
"mon_equipe = [\"Pikachu\", \"Dracaufeu\", \"Tortank\", \"Dracolosse\", \"Mewtwo\", \"Evoli\"]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"## Exercice 1 - Exploration du Pokédex (25 min)\n",
"\n",
"### 1.1 Affichage d'un Pokémon (4 pts)\n",
"\n",
"Écrivez une fonction `afficher_pokemon(pokemon)` qui affiche les infos d'un Pokémon.\n",
"\n",
"Exemple :\n",
"```\n",
"DRACAUFEU (Feu/Vol)\n",
"PV: 78 | ATK: 84 | DEF: 78 | VIT: 100\n",
"Evolution: Forme finale\n",
"```\n",
"\n",
"*Rappel : pokemon[0] = nom, pokemon[1] = types, pokemon[2] = pv, pokemon[3] = attaque, pokemon[4] = defense, pokemon[5] = vitesse, pokemon[6] = evolution*"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def afficher_pokemon(pokemon):\n",
" nom = pokemon[0]\n",
" types = pokemon[1]\n",
" pv = pokemon[2]\n",
" attaque = pokemon[3]\n",
" defense = pokemon[4]\n",
" vitesse = pokemon[5]\n",
" evolution = pokemon[6]\n",
" \n",
" # Afficher le nom et les types\n",
" # Votre code ici\n",
" pass\n",
" \n",
" # Afficher les stats\n",
" # Votre code ici\n",
" pass\n",
" \n",
" # Afficher l'evolution (\"Forme finale\" si None)\n",
" # Votre code ici\n",
" pass\n",
"\n",
"# Test\n",
"afficher_pokemon(pokedex[5]) # Dracaufeu"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1.2 Recherche par type (4 pts)\n",
"\n",
"Écrivez une fonction `pokemon_par_type(dex, type_recherche)` qui renvoie tous les Pokémon ayant ce type (principal ou secondaire), triés par PV décroissants.\n",
"\n",
"*Aide : utilisez `sorted(liste, key=lambda p: p[2], reverse=True)` pour trier par PV*"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def pokemon_par_type(dex, type_recherche):\n",
" resultats = []\n",
" \n",
" for pokemon in dex:\n",
" types = pokemon[1]\n",
" # Verifier si le type recherche est dans les types du pokemon\n",
" # Votre code ici\n",
" pass\n",
" \n",
" # Trier par PV (indice 2) decroissants\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return resultats\n",
"\n",
"# Test\n",
"print(\"Pokemon de type Eau :\")\n",
"for p in pokemon_par_type(pokedex, \"Eau\"):\n",
" print(\" \", p[0], \"-\", p[2], \"PV\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1.3 Compter les types (4 pts)\n",
"\n",
"Écrivez une fonction `compter_types(dex)` qui renvoie un dictionnaire `{type: nombre}` comptant combien de Pokémon ont chaque type."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def compter_types(dex):\n",
" compteur = {}\n",
" \n",
" for pokemon in dex:\n",
" types = pokemon[1]\n",
" for t in types:\n",
" # Ajouter le type au compteur\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return compteur\n",
"\n",
"# Test\n",
"print(\"Nombre de Pokemon par type :\")\n",
"types_compteur = compter_types(pokedex)\n",
"for t, nb in types_compteur.items():\n",
" print(\" \", t, \":\", nb)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"## Exercice 2 - Gestion d'équipe (35 min)\n",
"\n",
"### 2.1 Charger une équipe (5 pts)\n",
"\n",
"Écrivez une fonction `charger_equipe(noms, dex)` qui renvoie la liste des tuples Pokemon correspondant aux noms donnés.\n",
"\n",
"Si un nom n'existe pas dans le Pokédex, l'ignorer."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def charger_equipe(noms, dex):\n",
" equipe = []\n",
" \n",
" for nom_recherche in noms:\n",
" # Chercher le pokemon dans le pokedex\n",
" for pokemon in dex:\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return equipe\n",
"\n",
"# Test\n",
"equipe = charger_equipe(mon_equipe, pokedex)\n",
"print(\"Equipe chargee :\")\n",
"for p in equipe:\n",
" print(\" \", p[0])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.2 Force totale de l'équipe (5 pts)\n",
"\n",
"Écrivez une fonction `force_equipe(equipe)` qui calcule la force totale de l'équipe.\n",
"\n",
"Force d'un Pokémon = PV + Attaque + Défense + Vitesse"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def force_equipe(equipe):\n",
" force_totale = 0\n",
" \n",
" for pokemon in equipe:\n",
" # Calculer la force du pokemon et l'ajouter au total\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return force_totale\n",
"\n",
"# Test\n",
"print(\"Force totale de l'equipe :\", force_equipe(equipe))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.3 Pokémon le plus fort (5 pts)\n",
"\n",
"Écrivez une fonction `plus_fort(equipe)` qui renvoie le Pokémon ayant la meilleure attaque."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def plus_fort(equipe):\n",
" if len(equipe) == 0:\n",
" return None\n",
" \n",
" meilleur = equipe[0]\n",
" meilleure_attaque = equipe[0][3]\n",
" \n",
" for pokemon in equipe:\n",
" # Comparer l'attaque avec la meilleure\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return meilleur\n",
"\n",
"# Test\n",
"fort = plus_fort(equipe)\n",
"if fort:\n",
" print(\"Pokemon le plus fort :\", fort[0], \"avec\", fort[3], \"d'attaque\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.4 Types couverts par l'équipe (6 pts)\n",
"\n",
"Écrivez une fonction `types_couverts(equipe)` qui renvoie la liste (sans doublons) de tous les types présents dans l'équipe."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def types_couverts(equipe):\n",
" types_liste = []\n",
" \n",
" for pokemon in equipe:\n",
" types = pokemon[1]\n",
" for t in types:\n",
" # Ajouter le type s'il n'est pas deja dans la liste\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return types_liste\n",
"\n",
"# Test\n",
"print(\"Types couverts par l'equipe :\", types_couverts(equipe))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"## Exercice 3 - Bonus (20 min)\n",
"\n",
"### 3.1 Chaîne d'évolution (5 pts)\n",
"\n",
"Écrivez une fonction `chaine_evolution(nom, dex)` qui renvoie la chaîne d'évolution complète d'un Pokémon.\n",
"\n",
"Exemple : `chaine_evolution(\"Bulbizarre\", pokedex)` → `[\"Bulbizarre\", \"Herbizarre\", \"Florizarre\"]`"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def chaine_evolution(nom, dex):\n",
" chaine = [nom]\n",
" \n",
" # Chercher le pokemon actuel\n",
" pokemon_actuel = None\n",
" for p in dex:\n",
" if p[0] == nom:\n",
" pokemon_actuel = p\n",
" break\n",
" \n",
" if pokemon_actuel == None:\n",
" return chaine\n",
" \n",
" # Suivre les evolutions\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return chaine\n",
"\n",
"# Tests\n",
"print(chaine_evolution(\"Bulbizarre\", pokedex))\n",
"print(chaine_evolution(\"Pikachu\", pokedex))\n",
"print(chaine_evolution(\"Mewtwo\", pokedex))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3.2 Vérifier efficacité (5 pts)\n",
"\n",
"Écrivez une fonction `est_efficace(attaquant, defenseur, faiblesses)` qui renvoie `True` si l'attaquant a un type efficace contre le défenseur."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def est_efficace(attaquant, defenseur, faiblesses):\n",
" types_attaquant = attaquant[1]\n",
" types_defenseur = defenseur[1]\n",
" \n",
" # Pour chaque type de l'attaquant, verifier s'il est efficace\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return False\n",
"\n",
"# Tests\n",
"pikachu = pokedex[9]\n",
"tortank = pokedex[8]\n",
"dracaufeu = pokedex[5]\n",
"\n",
"print(\"Pikachu efficace contre Tortank ?\", est_efficace(pikachu, tortank, faiblesses))\n",
"print(\"Dracaufeu efficace contre Tortank ?\", est_efficace(dracaufeu, tortank, faiblesses))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3.3 Meilleur contre un adversaire (4 pts)\n",
"\n",
"Écrivez une fonction `meilleur_contre(adversaire, equipe, faiblesses)` qui renvoie le Pokémon de l'équipe le plus efficace contre l'adversaire.\n",
"\n",
"S'il n'y a pas de Pokémon efficace, renvoyer le plus fort en attaque."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def meilleur_contre(adversaire, equipe, faiblesses):\n",
" # D'abord chercher un pokemon efficace\n",
" # Votre code ici\n",
" pass\n",
" \n",
" # Sinon renvoyer le plus fort en attaque\n",
" return plus_fort(equipe)\n",
"\n",
"# Test\n",
"leviator = pokedex[18]\n",
"choix = meilleur_contre(leviator, equipe, faiblesses)\n",
"if choix:\n",
" print(\"Meilleur choix contre Leviator :\", choix[0])"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"name": "python",
"version": "3.9.0"
}
},
"nbformat": 4,
"nbformat_minor": 4
}