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:
2026-01-29 23:37:26 +01:00
parent 9ee1dcba80
commit 1290ccf453
43 changed files with 8682 additions and 42 deletions

View 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