{ "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 }