{ "cells": [ { "cell_type": "markdown", "id": "cell-0", "metadata": {}, "source": [ "# TP Évaluation - Système d'inventaire Minecraft\n", "\n", "**Durée : 1h30**\n", "\n", "**Nom :** \n", "\n", "**Prénom :**\n", "\n", "---\n", "\n", "Dans ce TP, vous allez créer un système de gestion d'inventaire et de craft inspiré de Minecraft.\n", "\n", "**Compétences évaluées :**\n", "- Manipulation de dictionnaires\n", "- Parcours et modification de structures\n", "- Algorithmes de vérification" ] }, { "cell_type": "markdown", "id": "cell-1", "metadata": {}, "source": [ "## Données initiales\n", "\n", "**Exécutez cette cellule avant de commencer.**" ] }, { "cell_type": "code", "execution_count": null, "id": "cell-2", "metadata": {}, "outputs": [], "source": [ "# Inventaire du joueur : {nom_item: quantite}\n", "inventaire = {\n", " \"bois\": 64,\n", " \"pierre\": 128,\n", " \"fer\": 32,\n", " \"or\": 8,\n", " \"diamant\": 3,\n", " \"charbon\": 45,\n", " \"cuir\": 12,\n", " \"plume\": 24,\n", " \"ficelle\": 16\n", "}\n", "\n", "# Recettes de craft : {nom_resultat: {ingredient: quantite_necessaire}}\n", "recettes = {\n", " \"planche\": {\"bois\": 1},\n", " \"baton\": {\"planche\": 2},\n", " \"torche\": {\"baton\": 1, \"charbon\": 1},\n", " \"pioche_bois\": {\"planche\": 3, \"baton\": 2},\n", " \"pioche_pierre\": {\"pierre\": 3, \"baton\": 2},\n", " \"pioche_fer\": {\"fer\": 3, \"baton\": 2},\n", " \"pioche_diamant\": {\"diamant\": 3, \"baton\": 2},\n", " \"epee_fer\": {\"fer\": 2, \"baton\": 1},\n", " \"epee_diamant\": {\"diamant\": 2, \"baton\": 1},\n", " \"coffre\": {\"planche\": 8},\n", " \"four\": {\"pierre\": 8}\n", "}\n", "\n", "# Quantites produites par craft (par defaut 1, sauf exceptions)\n", "quantites_produites = {\n", " \"planche\": 4,\n", " \"baton\": 4,\n", " \"torche\": 4\n", "}\n", "\n", "# Valeurs des items en emeraudes\n", "valeurs = {\n", " \"bois\": 1, \"pierre\": 1, \"fer\": 5, \"or\": 10, \"diamant\": 50,\n", " \"charbon\": 2, \"cuir\": 3, \"plume\": 1, \"ficelle\": 2,\n", " \"planche\": 1, \"baton\": 1, \"torche\": 3\n", "}" ] }, { "cell_type": "markdown", "id": "cell-3", "metadata": {}, "source": [ "---\n", "\n", "## Exercice 1 - Gestion de l'inventaire (25 min)\n", "\n", "### 1.1 Affichage de l'inventaire (4 pts)\n", "\n", "Écrivez une fonction `afficher_inventaire(inv)` qui affiche l'inventaire de manière formatée.\n", "\n", "Exemple de sortie :\n", "```\n", "=== INVENTAIRE ===\n", "bois : 64\n", "pierre : 128\n", "fer : 32\n", "...\n", "==================\n", "```" ] }, { "cell_type": "code", "execution_count": null, "id": "cell-4", "metadata": {}, "outputs": [], "source": [ "def afficher_inventaire(inv):\n", " print(\"=== INVENTAIRE ===\")\n", " \n", " for item, quantite in inv.items():\n", " # Votre code ici\n", " pass\n", " \n", " print(\"==================\")\n", "\n", "# Test\n", "afficher_inventaire(inventaire)" ] }, { "cell_type": "markdown", "id": "cell-5", "metadata": {}, "source": [ "### 1.2 Ajouter un item (4 pts)\n", "\n", "Écrivez une fonction `ajouter_item(inv, item, quantite)` qui ajoute la quantité à l'item.\n", "\n", "Si l'item n'existe pas dans l'inventaire, il doit être créé.\n", "\n", "*Aide : utilisez `inv.get(item, 0)` pour obtenir la quantité actuelle (0 si l'item n'existe pas)*" ] }, { "cell_type": "code", "execution_count": null, "id": "cell-6", "metadata": {}, "outputs": [], "source": [ "def ajouter_item(inv, item, quantite):\n", " # Votre code ici\n", " pass\n", "\n", "# Tests\n", "test_inv = {\"bois\": 10}\n", "ajouter_item(test_inv, \"bois\", 5)\n", "print(\"Apres ajout de 5 bois :\", test_inv)\n", "ajouter_item(test_inv, \"fer\", 3)\n", "print(\"Apres ajout de 3 fer :\", test_inv)" ] }, { "cell_type": "markdown", "id": "cell-7", "metadata": {}, "source": [ "### 1.3 Retirer un item (4 pts)\n", "\n", "Écrivez une fonction `retirer_item(inv, item, quantite)` qui retire la quantité de l'item.\n", "\n", "- Renvoie `True` si le retrait a réussi\n", "- Renvoie `False` si la quantité est insuffisante (et ne modifie pas l'inventaire)" ] }, { "cell_type": "code", "execution_count": null, "id": "cell-8", "metadata": {}, "outputs": [], "source": [ "def retirer_item(inv, item, quantite):\n", " # Verifier si l'item existe et en quantite suffisante\n", " quantite_actuelle = inv.get(item, 0)\n", " \n", " if quantite_actuelle < quantite:\n", " return False\n", " \n", " # Retirer la quantite\n", " # Votre code ici\n", " pass\n", "\n", "# Tests\n", "test_inv = {\"bois\": 10, \"pierre\": 5}\n", "print(\"Retirer 5 bois :\", retirer_item(test_inv, \"bois\", 5))\n", "print(\"Inventaire :\", test_inv)\n", "print(\"Retirer 100 bois :\", retirer_item(test_inv, \"bois\", 100))\n", "print(\"Inventaire :\", test_inv)" ] }, { "cell_type": "markdown", "id": "cell-9", "metadata": {}, "source": [ "### 1.4 Valeur de l'inventaire (4 pts)\n", "\n", "Écrivez une fonction `calculer_valeur(inv, valeurs)` qui renvoie la valeur totale de l'inventaire.\n", "\n", "*Note : si un item n'a pas de valeur définie, il vaut 0*" ] }, { "cell_type": "code", "execution_count": null, "id": "cell-10", "metadata": {}, "outputs": [], "source": [ "def calculer_valeur(inv, valeurs):\n", " total = 0\n", " \n", " for item, quantite in inv.items():\n", " # Recuperer la valeur de l'item (0 si pas definie)\n", " valeur_unitaire = valeurs.get(item, 0)\n", " # Votre code ici\n", " pass\n", " \n", " return total\n", "\n", "# Test\n", "print(\"Valeur totale :\", calculer_valeur(inventaire, valeurs), \"emeraudes\")" ] }, { "cell_type": "markdown", "id": "cell-11", "metadata": {}, "source": [ "---\n", "\n", "## Exercice 2 - Système de craft (35 min)\n", "\n", "### 2.1 Vérifier si un craft est possible (5 pts)\n", "\n", "Écrivez une fonction `peut_crafter(inv, recette)` qui renvoie `True` si l'inventaire contient tous les ingrédients nécessaires pour la recette, `False` sinon.\n", "\n", "*Note : `recette` est un dictionnaire `{ingredient: quantite_necessaire}`*" ] }, { "cell_type": "code", "execution_count": null, "id": "cell-12", "metadata": {}, "outputs": [], "source": [ "def peut_crafter(inv, recette):\n", " for ingredient, quantite_necessaire in recette.items():\n", " quantite_disponible = inv.get(ingredient, 0)\n", " \n", " # Verifier si on a assez\n", " # Votre code ici\n", " pass\n", " \n", " return True\n", "\n", "# Tests\n", "print(\"Peut crafter planche ?\", peut_crafter(inventaire, recettes[\"planche\"]))\n", "print(\"Peut crafter pioche_diamant ?\", peut_crafter(inventaire, recettes[\"pioche_diamant\"]))" ] }, { "cell_type": "markdown", "id": "cell-13", "metadata": {}, "source": [ "### 2.2 Effectuer un craft (6 pts)\n", "\n", "Écrivez une fonction `crafter(inv, nom_item, recettes, quantites_produites)` qui :\n", "1. Vérifie si le craft est possible\n", "2. Si oui, retire les ingrédients et ajoute le résultat\n", "3. Renvoie `True` si le craft a réussi, `False` sinon\n", "\n", "*Note : utilisez `quantites_produites.get(nom_item, 1)` pour obtenir la quantité produite (1 par défaut)*" ] }, { "cell_type": "code", "execution_count": null, "id": "cell-14", "metadata": {}, "outputs": [], "source": [ "def crafter(inv, nom_item, recettes, quantites_produites):\n", " # Verifier que la recette existe\n", " if nom_item not in recettes:\n", " print(\"Recette inconnue :\", nom_item)\n", " return False\n", " \n", " recette = recettes[nom_item]\n", " \n", " # Verifier si le craft est possible\n", " if not peut_crafter(inv, recette):\n", " print(\"Ingredients insuffisants pour\", nom_item)\n", " return False\n", " \n", " # Retirer les ingredients\n", " for ingredient, quantite in recette.items():\n", " retirer_item(inv, ingredient, quantite)\n", " \n", " # Ajouter le resultat\n", " quantite_produite = quantites_produites.get(nom_item, 1)\n", " # Votre code ici\n", " pass\n", "\n", "# Test\n", "test_inv = {\"bois\": 10, \"charbon\": 5}\n", "print(\"Inventaire avant :\", test_inv)\n", "\n", "crafter(test_inv, \"planche\", recettes, quantites_produites)\n", "print(\"Apres craft de planches :\", test_inv)\n", "\n", "crafter(test_inv, \"baton\", recettes, quantites_produites)\n", "print(\"Apres craft de batons :\", test_inv)\n", "\n", "crafter(test_inv, \"torche\", recettes, quantites_produites)\n", "print(\"Apres craft de torches :\", test_inv)" ] }, { "cell_type": "markdown", "id": "cell-15", "metadata": {}, "source": [ "### 2.3 Lister les crafts possibles (6 pts)\n", "\n", "Écrivez une fonction `lister_crafts_possibles(inv, recettes)` qui renvoie la **liste des noms** de tous les items qu'il est possible de crafter avec l'inventaire actuel." ] }, { "cell_type": "code", "execution_count": null, "id": "cell-16", "metadata": {}, "outputs": [], "source": [ "def lister_crafts_possibles(inv, recettes):\n", " possibles = []\n", " \n", " for nom_item, recette in recettes.items():\n", " # Votre code ici\n", " pass\n", " \n", " return possibles\n", "\n", "# Test\n", "print(\"Crafts possibles :\")\n", "print(lister_crafts_possibles(inventaire, recettes))" ] }, { "cell_type": "markdown", "id": "cell-17", "metadata": {}, "source": [ "---\n", "\n", "## Exercice 3 - Bonus (20 min)\n", "\n", "### 3.1 Nombre maximum de crafts (5 pts)\n", "\n", "Écrivez une fonction `nb_max_craft(inv, recette)` qui renvoie le nombre maximum de fois qu'on peut effectuer un craft avec l'inventaire actuel.\n", "\n", "*Aide : pour chaque ingrédient, calculez `quantite_disponible // quantite_necessaire`, puis prenez le minimum*" ] }, { "cell_type": "code", "execution_count": null, "id": "cell-18", "metadata": {}, "outputs": [], "source": [ "def nb_max_craft(inv, recette):\n", " if not peut_crafter(inv, recette):\n", " return 0\n", " \n", " ratios = []\n", " \n", " for ingredient, quantite_necessaire in recette.items():\n", " quantite_disponible = inv.get(ingredient, 0)\n", " # Calculer combien de crafts possibles avec cet ingredient\n", " # Votre code ici\n", " pass\n", " \n", " return min(ratios)\n", "\n", "# Tests\n", "print(\"Nb max de planches :\", nb_max_craft(inventaire, recettes[\"planche\"]))\n", "print(\"Nb max de torches :\", nb_max_craft(inventaire, recettes[\"torche\"]))\n", "print(\"Nb max de pioche_diamant :\", nb_max_craft(inventaire, recettes[\"pioche_diamant\"]))" ] }, { "cell_type": "markdown", "id": "cell-19", "metadata": {}, "source": [ "### 3.2 Crafts avec compteur (5 pts)\n", "\n", "Écrivez une fonction `crafts_avec_compteur(inv, recettes)` qui renvoie un **dictionnaire** `{nom_item: nombre_max}` pour tous les items qu'on peut crafter au moins une fois." ] }, { "cell_type": "code", "execution_count": null, "id": "cell-20", "metadata": {}, "outputs": [], "source": [ "def crafts_avec_compteur(inv, recettes):\n", " resultat = {}\n", " \n", " for nom_item, recette in recettes.items():\n", " nb = nb_max_craft(inv, recette)\n", " # Ajouter au resultat si nb > 0\n", " # Votre code ici\n", " pass\n", " \n", " return resultat\n", "\n", "# Test\n", "print(\"Crafts disponibles :\")\n", "for item, nb in crafts_avec_compteur(inventaire, recettes).items():\n", " print(\" \", item, \":\", nb, \"x\")" ] }, { "cell_type": "markdown", "id": "cell-21", "metadata": {}, "source": [ "### 3.3 Item le plus rentable (4 pts)\n", "\n", "Écrivez une fonction `item_plus_rentable(inv, recettes, valeurs)` qui renvoie le nom de l'item craftable qui a la meilleure valeur de revente parmi ceux qu'on peut crafter." ] }, { "cell_type": "code", "execution_count": null, "id": "cell-22", "metadata": {}, "outputs": [], "source": [ "def item_plus_rentable(inv, recettes, valeurs):\n", " possibles = lister_crafts_possibles(inv, recettes)\n", " \n", " if len(possibles) == 0:\n", " return None\n", " \n", " meilleur = possibles[0]\n", " meilleure_valeur = valeurs.get(meilleur, 0)\n", " \n", " for item in possibles:\n", " valeur = valeurs.get(item, 0)\n", " # Votre code ici\n", " pass\n", " \n", " return meilleur\n", "\n", "# Test\n", "print(\"Item le plus rentable a crafter :\", item_plus_rentable(inventaire, recettes, valeurs))" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "name": "python", "version": "3.9.0" } }, "nbformat": 4, "nbformat_minor": 5 }