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