- 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>
472 lines
14 KiB
Plaintext
472 lines
14 KiB
Plaintext
{
|
|
"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
|
|
}
|