Files
1ereNSI/representation_construits/evaluation/TP09_Fortnite_aide.md
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

8.9 KiB

Aide - TP09 Fortnite

Rappels utiles

Structure des joueurs (dictionnaire imbrique)

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

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

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

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

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

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

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

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

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

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

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