ajout exercices, corrections diverses, glossaire
- 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>
This commit is contained in:
491
representation_construits/evaluation/TP02_Minecraft.ipynb
Normal file
491
representation_construits/evaluation/TP02_Minecraft.ipynb
Normal file
@@ -0,0 +1,491 @@
|
||||
{
|
||||
"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
|
||||
}
|
||||
Reference in New Issue
Block a user