Files
1ereNSI/representation_construits/evaluation/TP02_Minecraft_aide.md

134 lines
3.4 KiB
Markdown
Raw Normal View History

# 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`