560 lines
18 KiB
Plaintext
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
|
||
|
|
}
|