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>
This commit is contained in:
339
representation_construits/evaluation/TP09_Fortnite_aide.md
Normal file
339
representation_construits/evaluation/TP09_Fortnite_aide.md
Normal file
@@ -0,0 +1,339 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user