# Aide - TP09 Fortnite ## Rappels utiles ### Structure des joueurs (dictionnaire imbrique) ```python joueurs = { "NinjaMaster": { "niveau": 250, "vbucks": 3500, "stats": { "solo": {"parties": 450, "victoires": 89, "kills": 2340, "top10": 180}, "duo": {"parties": 320, "victoires": 65, "kills": 1890, "top5": 110}, "squad": {"parties": 280, "victoires": 72, "kills": 1650, "top3": 95} }, "inventaire": ["Pioche Spectrale", "Planeur Dragon"] } } # Acceder aux stats solo d'un joueur solo = joueurs["NinjaMaster"]["stats"]["solo"] victoires_solo = solo["victoires"] # Parcourir tous les joueurs for pseudo, profil in joueurs.items(): print(pseudo, ": niveau", profil["niveau"]) ``` ### Structure de la boutique ```python boutique = { "skins": [ {"nom": "Skin Crystal", "rarete": "rare", "prix": 1200}, {"nom": "Skin Phoenix", "rarete": "epique", "prix": 1500} ], "pioches": [...], "planeurs": [...] } # Parcourir toutes les categories for categorie, articles in boutique.items(): for article in articles: print(article["nom"], ":", article["prix"], "V-Bucks") ``` --- ## Exercice 1 ### 1.1 - Affichage de profil ```python def afficher_profil(pseudo, joueurs): if pseudo not in joueurs: print("Joueur non trouve") return profil = joueurs[pseudo] print("===", pseudo, "===") print("Niveau:", profil["niveau"]) print("V-Bucks:", profil["vbucks"]) print() print("Statistiques:") for mode, stats in profil["stats"].items(): print(" ", mode, ":", stats["victoires"], "victoires /", stats["parties"], "parties") ``` ### 1.2 - Statistiques globales ```python def stats_globales(pseudo, joueurs): profil = joueurs[pseudo] stats = profil["stats"] # Calculer les totaux parties = 0 victoires = 0 kills = 0 for mode, s in stats.items(): parties = parties + s["parties"] victoires = victoires + s["victoires"] kills = kills + s["kills"] # Winrate if parties > 0: winrate = round(victoires * 100 / parties, 2) else: winrate = 0 # KD = kills / morts, morts = parties - victoires morts = parties - victoires if morts > 0: kd = round(kills / morts, 2) else: kd = kills # Mode prefere = celui avec le plus de parties mode_prefere = None max_parties = 0 for mode, s in stats.items(): if s["parties"] > max_parties: mode_prefere = mode max_parties = s["parties"] return { "parties_totales": parties, "victoires_totales": victoires, "kills_totaux": kills, "winrate": winrate, "kd_ratio": kd, "mode_prefere": mode_prefere } ``` ### 1.3 - Classement des joueurs ```python def classement(joueurs, critere): liste_joueurs = [] if critere == "niveau": for pseudo, profil in joueurs.items(): liste_joueurs.append((pseudo, profil["niveau"])) liste_joueurs = sorted(liste_joueurs, key=lambda x: x[1], reverse=True) elif critere == "victoires": for pseudo, profil in joueurs.items(): total_victoires = 0 for mode, s in profil["stats"].items(): total_victoires = total_victoires + s["victoires"] liste_joueurs.append((pseudo, total_victoires)) liste_joueurs = sorted(liste_joueurs, key=lambda x: x[1], reverse=True) # Renvoyer juste les pseudos pseudos = [] for pseudo, valeur in liste_joueurs: pseudos.append(pseudo) return pseudos ``` --- ## Exercice 2 ### 2.1 - Articles achetables ```python def articles_achetables(pseudo, joueurs, boutique): budget = joueurs[pseudo]["vbucks"] inventaire = joueurs[pseudo]["inventaire"] achetables = [] for categorie, articles in boutique.items(): for article in articles: if article["prix"] <= budget and article["nom"] not in inventaire: achetables.append(article) return achetables ``` ### 2.2 - Panier optimise ```python def panier_optimal(pseudo, joueurs, boutique, priorites): budget = joueurs[pseudo]["vbucks"] inventaire = joueurs[pseudo]["inventaire"] panier = [] for categorie in priorites: if categorie not in boutique: continue # Trier par prix croissant pour maximiser le nombre d'achats articles = sorted(boutique[categorie], key=lambda a: a["prix"]) for article in articles: if article["nom"] not in inventaire and article["prix"] <= budget: panier.append(article) budget = budget - article["prix"] return panier, budget ``` ### 2.3 - Analyse des inventaires ```python def analyser_inventaires(joueurs): # Compter les occurrences de chaque item compteur = {} for pseudo, profil in joueurs.items(): for item in profil["inventaire"]: if item not in compteur: compteur[item] = 0 compteur[item] = compteur[item] + 1 # Items communs (possedes par plusieurs joueurs) items_communs = [] for item, count in compteur.items(): if count >= 2: items_communs.append(item) # Items rares (possedes par un seul joueur) items_rares = [] for item, count in compteur.items(): if count == 1: items_rares.append(item) # Collectionneur (le plus d'items) collectionneur = None max_items = 0 for pseudo, profil in joueurs.items(): if len(profil["inventaire"]) > max_items: collectionneur = pseudo max_items = len(profil["inventaire"]) return { "items_communs": items_communs, "items_rares": items_rares, "joueur_collectionneur": collectionneur } ``` --- ## Exercice 3 (Bonus) ### 3.1 - Performances recentes ```python def performances_recentes(pseudo, parties): # Filtrer les parties du joueur mes_parties = [] for p in parties: if p["joueur"] == pseudo: mes_parties.append(p) if len(mes_parties) == 0: return None # Calculer les statistiques victoires = 0 total_kills = 0 total_degats = 0 total_duree = 0 for p in mes_parties: if p["placement"] == 1: victoires = victoires + 1 total_kills = total_kills + p["kills"] total_degats = total_degats + p["degats"] total_duree = total_duree + p["duree"] kills_moyen = round(total_kills / len(mes_parties), 1) degats_moyens = round(total_degats / len(mes_parties)) duree_moyenne = round(total_duree / len(mes_parties)) # Meilleure partie meilleure = mes_parties[0] for p in mes_parties: if p["kills"] > meilleure["kills"]: meilleure = p return { "nb_parties": len(mes_parties), "victoires": victoires, "kills_moyen": kills_moyen, "degats_moyens": degats_moyens, "duree_moyenne": duree_moyenne, "meilleure_partie": meilleure } ``` ### 3.2 - Comparaison de joueurs ```python def comparer_joueurs(pseudo1, pseudo2, joueurs): stats1 = stats_globales(pseudo1, joueurs) stats2 = stats_globales(pseudo2, joueurs) comparaison = {} # Comparer les stats if stats1["kills_totaux"] > stats2["kills_totaux"]: comparaison["kills"] = pseudo1 else: comparaison["kills"] = pseudo2 if stats1["winrate"] > stats2["winrate"]: comparaison["winrate"] = pseudo1 else: comparaison["winrate"] = pseudo2 if stats1["kd_ratio"] > stats2["kd_ratio"]: comparaison["kd"] = pseudo1 else: comparaison["kd"] = pseudo2 return comparaison ``` ### 3.3 - Prediction de rang ```python def calculer_rang(pseudo, joueurs): stats = stats_globales(pseudo, joueurs) profil = joueurs[pseudo] # Winrate solo solo = profil["stats"]["solo"] if solo["parties"] > 0: winrate_solo = solo["victoires"] * 100 / solo["parties"] else: winrate_solo = 0 # Calcul des points points = 0 points = points + winrate_solo * 3 points = points + stats["kd_ratio"] * 50 points = points + stats["victoires_totales"] * 0.1 points = points + profil["niveau"] * 0.05 # Attribution du rang if points >= 100: rang = "Champion" elif points >= 70: rang = "Diamond" elif points >= 50: rang = "Platinum" elif points >= 30: rang = "Gold" elif points >= 15: rang = "Silver" else: rang = "Bronze" return rang, round(points) ``` --- ## Pieges a eviter 1. **KD ratio** : attention a la division par zero ! `morts = parties - victoires` peut etre 0 2. **Stats par mode** : solo a "top10", duo a "top5", squad a "top3" 3. **Inventaire = liste de strings** : utilisez `in` pour verifier si un item est possede 4. **V-Bucks** : ne pas oublier de soustraire apres chaque achat 5. **Parties recentes** : filtrer d'abord par joueur avant de calculer les stats