- 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>
134 lines
3.4 KiB
Markdown
134 lines
3.4 KiB
Markdown
# Aide - TP02 Minecraft
|
|
|
|
## Rappels utiles
|
|
|
|
### Verifier si une cle existe dans un dictionnaire
|
|
```python
|
|
inventaire = {"bois": 64, "pierre": 32}
|
|
|
|
if "fer" in inventaire:
|
|
print("Vous avez du fer")
|
|
else:
|
|
print("Pas de fer")
|
|
|
|
# Ou avec get (renvoie 0 si absent)
|
|
quantite = inventaire.get("fer", 0)
|
|
```
|
|
|
|
### Modifier un dictionnaire
|
|
```python
|
|
# Ajouter ou modifier
|
|
inventaire["fer"] = 10
|
|
|
|
# Supprimer
|
|
del inventaire["fer"]
|
|
|
|
# Ajouter a une valeur existante
|
|
inventaire["bois"] = inventaire.get("bois", 0) + 5
|
|
```
|
|
|
|
### Trier un dictionnaire par valeur
|
|
```python
|
|
# Trier par valeur decroissante
|
|
items_tries = sorted(inventaire.items(), key=lambda x: x[1], reverse=True)
|
|
# Resultat : [("bois", 64), ("pierre", 32)]
|
|
```
|
|
|
|
---
|
|
|
|
## Exercice 1
|
|
|
|
### 1.1 - Affichage inventaire
|
|
- `sorted(inv.items(), key=lambda x: x[1], reverse=True)` pour trier par quantite
|
|
- Utilisez print() avec des virgules pour afficher
|
|
|
|
```python
|
|
for item, quantite in inventaire.items():
|
|
print(item, ":", quantite)
|
|
```
|
|
|
|
### 1.2 - Operations
|
|
- Pour ajouter : `inv[item] = inv.get(item, 0) + quantite`
|
|
- Pour retirer, **verifiez d'abord** que la quantite est suffisante
|
|
- Ne modifiez l'inventaire que si l'operation est possible
|
|
|
|
### 1.3 - Valeur
|
|
```python
|
|
total = 0
|
|
for item, qte in inv.items():
|
|
if item in valeurs:
|
|
total = total + qte * valeurs[item]
|
|
```
|
|
|
|
---
|
|
|
|
## Exercice 2
|
|
|
|
### 2.1 - Verifier craft possible
|
|
```python
|
|
def peut_crafter(inv, recette):
|
|
for ingredient, qte_necessaire in recette.items():
|
|
if inv.get(ingredient, 0) < qte_necessaire:
|
|
return False
|
|
return True
|
|
```
|
|
|
|
### 2.2 - Effectuer un craft
|
|
1. Verifiez d'abord avec `peut_crafter`
|
|
2. Si possible, retirez les ingredients
|
|
3. Ajoutez le resultat (attention a `quantites_produites`)
|
|
```python
|
|
qte_produite = quantites.get(nom_item, 1) # Par defaut 1
|
|
```
|
|
|
|
### 2.3 - Crafts disponibles
|
|
- Pour chaque recette, calculez combien de fois on peut la faire
|
|
- Le nombre max = minimum des ratios `inv[ingredient] // qte_necessaire`
|
|
```python
|
|
def nb_max_craft(inv, recette):
|
|
ratios = []
|
|
for ing, qte in recette.items():
|
|
if inv.get(ing, 0) < qte:
|
|
return 0
|
|
ratios.append(inv[ing] // qte)
|
|
return min(ratios)
|
|
```
|
|
|
|
---
|
|
|
|
## Exercice 3 (Bonus)
|
|
|
|
### 3.1 - Chaine de craft (recursivite)
|
|
```python
|
|
def ingredients_totaux(nom_item, recettes, quantite):
|
|
if nom_item not in recettes:
|
|
# C'est une matiere premiere
|
|
return {nom_item: quantite}
|
|
|
|
resultat = {}
|
|
for ingredient, qte in recettes[nom_item].items():
|
|
sous_ingredients = ingredients_totaux(ingredient, recettes, qte * quantite)
|
|
for ing, q in sous_ingredients.items():
|
|
resultat[ing] = resultat.get(ing, 0) + q
|
|
return resultat
|
|
```
|
|
|
|
### 3.2 - Meilleur equipement
|
|
- Definissez les tiers : `tiers = {"diamant": 4, "fer": 3, "pierre": 2, "bois": 1}`
|
|
- Pour chaque type (pioche, epee, armure), testez du meilleur au moins bon
|
|
- Utilisez `peut_crafter` pour verifier
|
|
|
|
### 3.3 - Liste de courses
|
|
1. Calculez les ingredients totaux pour chaque objectif
|
|
2. Soustrayez ce qui est deja dans l'inventaire
|
|
3. Ne gardez que les quantites positives (ce qui manque)
|
|
|
|
---
|
|
|
|
## Pieges a eviter
|
|
|
|
1. **Quantites produites** : un craft de planches donne 4 planches, pas 1 !
|
|
2. **Modification de dictionnaire** : creez une copie si necessaire avec `inv.copy()`
|
|
3. **Division entiere** : utilisez `//` pour obtenir un entier
|
|
4. **Recette inexistante** : verifiez que `nom_item in recettes`
|