340 lines
8.9 KiB
Markdown
340 lines
8.9 KiB
Markdown
|
|
# 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
|