Files
1ereNSI/representation_construits/evaluation/TP09_Fortnite.ipynb
Florian Mathieu 1290ccf453 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>
2026-01-29 23:37:26 +01:00

560 lines
18 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# TP Évaluation - Statistiques Fortnite\n",
"\n",
"**Durée : 1h30**\n",
"\n",
"**Nom :** \n",
"\n",
"**Prénom :**\n",
"\n",
"---\n",
"\n",
"Dans ce TP, vous allez analyser des statistiques de joueurs Fortnite.\n",
"\n",
"**Compétences évaluées :**\n",
"- Dictionnaires imbriqués\n",
"- Algorithmes de calcul statistique\n",
"- Filtrage et tri de données"
]
},
{
"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": [
"# Statistiques des joueurs\n",
"joueurs = {\n",
" \"NinjaMaster\": {\n",
" \"niveau\": 250,\n",
" \"vbucks\": 3500,\n",
" \"stats\": {\n",
" \"solo\": {\"parties\": 450, \"victoires\": 89, \"kills\": 2340},\n",
" \"duo\": {\"parties\": 320, \"victoires\": 65, \"kills\": 1890},\n",
" \"squad\": {\"parties\": 280, \"victoires\": 72, \"kills\": 1650}\n",
" },\n",
" \"inventaire\": [\"Pioche Spectrale\", \"Planeur Dragon\", \"Skin Raven\"]\n",
" },\n",
" \"BuilderPro\": {\n",
" \"niveau\": 180,\n",
" \"vbucks\": 1200,\n",
" \"stats\": {\n",
" \"solo\": {\"parties\": 280, \"victoires\": 42, \"kills\": 1120},\n",
" \"duo\": {\"parties\": 450, \"victoires\": 98, \"kills\": 2450},\n",
" \"squad\": {\"parties\": 380, \"victoires\": 110, \"kills\": 2100}\n",
" },\n",
" \"inventaire\": [\"Pioche Arc-en-ciel\", \"Skin Drift\"]\n",
" },\n",
" \"SniperElite\": {\n",
" \"niveau\": 320,\n",
" \"vbucks\": 8900,\n",
" \"stats\": {\n",
" \"solo\": {\"parties\": 680, \"victoires\": 156, \"kills\": 4200},\n",
" \"duo\": {\"parties\": 220, \"victoires\": 45, \"kills\": 980},\n",
" \"squad\": {\"parties\": 150, \"victoires\": 28, \"kills\": 620}\n",
" },\n",
" \"inventaire\": [\"Pioche Galaxy\", \"Planeur Meteore\", \"Skin Black Knight\", \"Skin Omega\"]\n",
" },\n",
" \"CasualGamer\": {\n",
" \"niveau\": 85,\n",
" \"vbucks\": 500,\n",
" \"stats\": {\n",
" \"solo\": {\"parties\": 120, \"victoires\": 8, \"kills\": 180},\n",
" \"duo\": {\"parties\": 200, \"victoires\": 22, \"kills\": 420},\n",
" \"squad\": {\"parties\": 350, \"victoires\": 45, \"kills\": 680}\n",
" },\n",
" \"inventaire\": [\"Skin Default\", \"Pioche Standard\"]\n",
" },\n",
" \"StreamerKing\": {\n",
" \"niveau\": 450,\n",
" \"vbucks\": 25000,\n",
" \"stats\": {\n",
" \"solo\": {\"parties\": 1200, \"victoires\": 312, \"kills\": 8900},\n",
" \"duo\": {\"parties\": 800, \"victoires\": 245, \"kills\": 5600},\n",
" \"squad\": {\"parties\": 600, \"victoires\": 198, \"kills\": 4200}\n",
" },\n",
" \"inventaire\": [\"Pioche Galaxy\", \"Skin Skull Trooper\", \"Skin Ghoul Trooper\", \"Planeur Dragon\", \"Skin Renegade Raider\"]\n",
" }\n",
"}\n",
"\n",
"# Boutique du jour\n",
"boutique = [\n",
" {\"nom\": \"Skin Crystal\", \"type\": \"skin\", \"rarete\": \"rare\", \"prix\": 1200},\n",
" {\"nom\": \"Skin Aura\", \"type\": \"skin\", \"rarete\": \"uncommon\", \"prix\": 800},\n",
" {\"nom\": \"Skin Raptor\", \"type\": \"skin\", \"rarete\": \"legendary\", \"prix\": 2000},\n",
" {\"nom\": \"Pioche Laser\", \"type\": \"pioche\", \"rarete\": \"rare\", \"prix\": 800},\n",
" {\"nom\": \"Pioche Feu\", \"type\": \"pioche\", \"rarete\": \"uncommon\", \"prix\": 500},\n",
" {\"nom\": \"Planeur Etoile\", \"type\": \"planeur\", \"rarete\": \"epic\", \"prix\": 1200},\n",
" {\"nom\": \"Emote Dance\", \"type\": \"emote\", \"rarete\": \"rare\", \"prix\": 500}\n",
"]\n",
"\n",
"# Historique des parties recentes\n",
"parties_recentes = [\n",
" {\"joueur\": \"NinjaMaster\", \"mode\": \"solo\", \"placement\": 1, \"kills\": 8},\n",
" {\"joueur\": \"NinjaMaster\", \"mode\": \"solo\", \"placement\": 15, \"kills\": 3},\n",
" {\"joueur\": \"BuilderPro\", \"mode\": \"duo\", \"placement\": 1, \"kills\": 6},\n",
" {\"joueur\": \"SniperElite\", \"mode\": \"solo\", \"placement\": 1, \"kills\": 12},\n",
" {\"joueur\": \"SniperElite\", \"mode\": \"solo\", \"placement\": 3, \"kills\": 7},\n",
" {\"joueur\": \"CasualGamer\", \"mode\": \"squad\", \"placement\": 8, \"kills\": 2},\n",
" {\"joueur\": \"StreamerKing\", \"mode\": \"solo\", \"placement\": 1, \"kills\": 15},\n",
" {\"joueur\": \"StreamerKing\", \"mode\": \"duo\", \"placement\": 1, \"kills\": 9},\n",
" {\"joueur\": \"BuilderPro\", \"mode\": \"squad\", \"placement\": 2, \"kills\": 5}\n",
"]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"## Exercice 1 - Analyse des profils (25 min)\n",
"\n",
"### 1.1 Affichage de profil (4 pts)\n",
"\n",
"Écrivez une fonction `afficher_profil(pseudo, joueurs)` qui affiche le profil d'un joueur.\n",
"\n",
"Exemple :\n",
"```\n",
"=== NinjaMaster ===\n",
"Niveau : 250 | V-Bucks : 3500\n",
"Inventaire : 3 items\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def afficher_profil(pseudo, joueurs):\n",
" if pseudo not in joueurs:\n",
" print(\"Joueur non trouve\")\n",
" return\n",
" \n",
" profil = joueurs[pseudo]\n",
" \n",
" # Votre code ici : afficher le pseudo, niveau, vbucks et nb d'items\n",
" pass\n",
"\n",
"# Test\n",
"afficher_profil(\"NinjaMaster\", joueurs)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1.2 Statistiques globales (4 pts)\n",
"\n",
"Écrivez une fonction `stats_globales(pseudo, joueurs)` qui calcule pour un joueur :\n",
"- `parties_totales` : somme de toutes les parties\n",
"- `victoires_totales` : somme de toutes les victoires\n",
"- `kills_totaux` : somme de tous les kills\n",
"- `winrate` : pourcentage de victoires (arrondi à 2 décimales)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def stats_globales(pseudo, joueurs):\n",
" profil = joueurs[pseudo]\n",
" stats = profil[\"stats\"]\n",
" \n",
" parties_totales = 0\n",
" victoires_totales = 0\n",
" kills_totaux = 0\n",
" \n",
" for mode, data in stats.items():\n",
" # Votre code ici : cumuler parties, victoires et kills\n",
" pass\n",
" \n",
" # Calculer le winrate\n",
" # Votre code ici\n",
" winrate = 0\n",
" \n",
" return {\n",
" \"parties_totales\": parties_totales,\n",
" \"victoires_totales\": victoires_totales,\n",
" \"kills_totaux\": kills_totaux,\n",
" \"winrate\": winrate\n",
" }\n",
"\n",
"# Test\n",
"stats = stats_globales(\"SniperElite\", joueurs)\n",
"print(\"Stats de SniperElite :\")\n",
"print(\" Parties :\", stats[\"parties_totales\"])\n",
"print(\" Victoires :\", stats[\"victoires_totales\"])\n",
"print(\" Kills :\", stats[\"kills_totaux\"])\n",
"print(\" Winrate :\", stats[\"winrate\"], \"%\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1.3 Mode préféré (4 pts)\n",
"\n",
"Écrivez une fonction `mode_prefere(pseudo, joueurs)` qui renvoie le mode de jeu (solo, duo, squad) où le joueur a joué le plus de parties."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def mode_prefere(pseudo, joueurs):\n",
" profil = joueurs[pseudo]\n",
" stats = profil[\"stats\"]\n",
" \n",
" meilleur_mode = None\n",
" max_parties = 0\n",
" \n",
" for mode, data in stats.items():\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return meilleur_mode\n",
"\n",
"# Test\n",
"for pseudo in joueurs:\n",
" print(pseudo, \"prefere le mode\", mode_prefere(pseudo, joueurs))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"## Exercice 2 - Classements et boutique (35 min)\n",
"\n",
"### 2.1 Classement par critère (6 pts)\n",
"\n",
"Écrivez une fonction `classement(joueurs, critere)` qui renvoie la liste des pseudos triés selon le critère.\n",
"\n",
"Critères possibles : `\"niveau\"`, `\"victoires\"`, `\"kills\"`, `\"winrate\"`\n",
"\n",
"*Aide : créez d'abord une liste de tuples (pseudo, valeur), triez-la, puis extrayez les pseudos.*"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def classement(joueurs, critere):\n",
" # Creer une liste de tuples (pseudo, valeur)\n",
" liste = []\n",
" \n",
" for pseudo in joueurs:\n",
" if critere == \"niveau\":\n",
" valeur = joueurs[pseudo][\"niveau\"]\n",
" elif critere == \"victoires\":\n",
" stats = stats_globales(pseudo, joueurs)\n",
" valeur = stats[\"victoires_totales\"]\n",
" elif critere == \"kills\":\n",
" stats = stats_globales(pseudo, joueurs)\n",
" valeur = stats[\"kills_totaux\"]\n",
" elif critere == \"winrate\":\n",
" stats = stats_globales(pseudo, joueurs)\n",
" valeur = stats[\"winrate\"]\n",
" else:\n",
" valeur = 0\n",
" \n",
" liste.append((pseudo, valeur))\n",
" \n",
" # Trier par valeur decroissante\n",
" # Votre code ici\n",
" pass\n",
" \n",
" # Extraire les pseudos\n",
" resultat = []\n",
" for item in liste:\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return resultat\n",
"\n",
"# Tests\n",
"print(\"Par niveau :\", classement(joueurs, \"niveau\"))\n",
"print(\"Par victoires :\", classement(joueurs, \"victoires\"))\n",
"print(\"Par winrate :\", classement(joueurs, \"winrate\"))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.2 Articles achetables (5 pts)\n",
"\n",
"Écrivez une fonction `articles_achetables(pseudo, joueurs, boutique)` qui renvoie la liste des articles que le joueur peut acheter avec ses V-Bucks.\n",
"\n",
"Exclure les articles déjà possédés dans l'inventaire."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def articles_achetables(pseudo, joueurs, boutique):\n",
" profil = joueurs[pseudo]\n",
" vbucks = profil[\"vbucks\"]\n",
" inventaire = profil[\"inventaire\"]\n",
" \n",
" achetables = []\n",
" \n",
" for article in boutique:\n",
" # Verifier le prix et si pas deja possede\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return achetables\n",
"\n",
"# Test\n",
"print(\"Articles achetables pour BuilderPro :\")\n",
"for art in articles_achetables(\"BuilderPro\", joueurs, boutique):\n",
" print(\" \", art[\"nom\"], \"-\", art[\"prix\"], \"V-Bucks\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.3 Comparaison de joueurs (6 pts)\n",
"\n",
"Écrivez une fonction `comparer_joueurs(pseudo1, pseudo2, joueurs)` qui compare deux joueurs.\n",
"\n",
"Renvoie un dictionnaire indiquant pour chaque critère (niveau, victoires, kills, winrate) quel joueur est meilleur."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def comparer_joueurs(pseudo1, pseudo2, joueurs):\n",
" stats1 = stats_globales(pseudo1, joueurs)\n",
" stats2 = stats_globales(pseudo2, joueurs)\n",
" \n",
" comparaison = {}\n",
" \n",
" # Comparer le niveau\n",
" # Votre code ici\n",
" pass\n",
" \n",
" # Comparer les victoires\n",
" # Votre code ici\n",
" pass\n",
" \n",
" # Comparer les kills\n",
" # Votre code ici\n",
" pass\n",
" \n",
" # Comparer le winrate\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return comparaison\n",
"\n",
"# Test\n",
"comp = comparer_joueurs(\"NinjaMaster\", \"SniperElite\", joueurs)\n",
"print(\"Comparaison NinjaMaster vs SniperElite :\")\n",
"for critere, gagnant in comp.items():\n",
" print(\" \", critere, \":\", gagnant)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.4 Joueur le plus riche (5 pts)\n",
"\n",
"Écrivez une fonction `plus_riche(joueurs)` qui renvoie le pseudo du joueur ayant le plus de V-Bucks."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def plus_riche(joueurs):\n",
" meilleur = None\n",
" max_vbucks = 0\n",
" \n",
" for pseudo, profil in joueurs.items():\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return meilleur\n",
"\n",
"# Test\n",
"riche = plus_riche(joueurs)\n",
"print(\"Joueur le plus riche :\", riche)\n",
"if riche:\n",
" print(\"V-Bucks :\", joueurs[riche][\"vbucks\"])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"## Exercice 3 - Bonus (20 min)\n",
"\n",
"### 3.1 Performances récentes (5 pts)\n",
"\n",
"Écrivez une fonction `performances_recentes(pseudo, parties)` qui analyse les parties récentes d'un joueur.\n",
"\n",
"Renvoie : `nb_parties`, `victoires`, `kills_moyen` (arrondi à 1 décimale)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def performances_recentes(pseudo, parties):\n",
" nb_parties = 0\n",
" victoires = 0\n",
" total_kills = 0\n",
" \n",
" for partie in parties:\n",
" if partie[\"joueur\"] == pseudo:\n",
" # Votre code ici\n",
" pass\n",
" \n",
" if nb_parties > 0:\n",
" kills_moyen = round(total_kills / nb_parties, 1)\n",
" else:\n",
" kills_moyen = 0\n",
" \n",
" return {\n",
" \"nb_parties\": nb_parties,\n",
" \"victoires\": victoires,\n",
" \"kills_moyen\": kills_moyen\n",
" }\n",
"\n",
"# Test\n",
"for pseudo in [\"NinjaMaster\", \"SniperElite\", \"StreamerKing\"]:\n",
" perf = performances_recentes(pseudo, parties_recentes)\n",
" print(pseudo, \":\", perf[\"victoires\"], \"/\", perf[\"nb_parties\"], \"victoires, \", perf[\"kills_moyen\"], \"kills/partie\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3.2 K/D Ratio (4 pts)\n",
"\n",
"Écrivez une fonction `kd_ratio(pseudo, joueurs)` qui calcule le ratio kills/deaths.\n",
"\n",
"Deaths = parties - victoires (on meurt une fois par partie perdue)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def kd_ratio(pseudo, joueurs):\n",
" stats = stats_globales(pseudo, joueurs)\n",
" \n",
" kills = stats[\"kills_totaux\"]\n",
" deaths = stats[\"parties_totales\"] - stats[\"victoires_totales\"]\n",
" \n",
" # Votre code ici : calculer le ratio (attention division par zero)\n",
" ratio = 0\n",
" \n",
" return ratio\n",
"\n",
"# Test\n",
"print(\"K/D Ratio :\")\n",
"for pseudo in joueurs:\n",
" print(\" \", pseudo, \":\", kd_ratio(pseudo, joueurs))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3.3 Items les plus possédés (5 pts)\n",
"\n",
"Écrivez une fonction `items_populaires(joueurs)` qui compte combien de joueurs possèdent chaque item et renvoie la liste triée par popularité décroissante.\n",
"\n",
"Renvoie une liste de tuples `(nom_item, nb_joueurs)`."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def items_populaires(joueurs):\n",
" compteur = {}\n",
" \n",
" for pseudo, profil in joueurs.items():\n",
" for item in profil[\"inventaire\"]:\n",
" # Votre code ici : incrementer le compteur\n",
" pass\n",
" \n",
" # Convertir en liste de tuples et trier\n",
" liste = []\n",
" for item, nb in compteur.items():\n",
" liste.append((item, nb))\n",
" \n",
" # Votre code ici : trier par nb decroissant\n",
" pass\n",
" \n",
" return liste\n",
"\n",
"# Test\n",
"print(\"Items les plus possedes :\")\n",
"for item, nb in items_populaires(joueurs):\n",
" print(\" \", item, \":\", nb, \"joueur(s)\")"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"name": "python",
"version": "3.9.0"
}
},
"nbformat": 4,
"nbformat_minor": 4
}