{ "cells": [ { "metadata": {}, "cell_type": "markdown", "source": "
\n \n# TP de Programmation Orientée Objet - Pokédex
\n" }, { "metadata": { "id": "mpLYmxwPeA1-", "trusted": true }, "cell_type": "code", "source": "import json\nimport requests\nimport matplotlib.pyplot as plt\nimport matplotlib.image as img\nfrom PIL import Image\nimport io\nfrom IPython.display import Audio, display", "execution_count": null, "outputs": [] }, { "metadata": {}, "cell_type": "markdown", "source": "!!! note Création d'une classe POKEMON\nL'objectif de ce TP est de créer un programme en objet dans lequel nous allons créer des Pokémons et les fair interagir entre eux.\nPour commencer, nous créons la classe pokémon ci-dessous. \n!!!" }, { "metadata": { "id": "-E9ZnrdURLip", "trusted": true }, "cell_type": "code", "source": "class Pokemon:\n\n def __init__(self, name, pid, height, weight, types, stats, sprite, cry):\n self.name = name\n self.id = pid\n self.height = height\n self.weight = weight\n self.types = tuple(types)\n self.stats = stats\n self.sprite = sprite\n self.cry = cry\n\n def show(self):\n # Fetch the image data from the URL using requests\n response = requests.get(self.sprite)\n #response.raise_for_status() # Raise an exception if the request fails\n\n # Open the image data with Pillow\n image = Image.open(io.BytesIO(response.content))\n\n # Convert the Pillow image to a NumPy array for matplotlib\n image_np = img.pil_to_array(image)\n\n plt.imshow(image_np)\n plt.axis('off')\n plt.show()\n if self.cry:\n response = requests.get(self.cry)\n if response.status_code == 200:\n audio = Audio(response.content, autoplay=True)\n display(audio)\n else:\n print(\"Error retrieving cry audio.\")\n else:\n print(\"No cry available for this Pokémon.\")", "execution_count": null, "outputs": [] }, { "metadata": {}, "cell_type": "markdown", "source": "!!! note Création d'un objet POKEMON\nPuis nous créons un pokemon spécifique, en affectant correctement les attributs définis dans le constructeur de la classe pokemon. \n!!!" }, { "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 856 }, "id": "-BTtliwySeHp", "outputId": "3fb7f3e8-bce9-4237-f3b7-e105b2100612", "trusted": false }, "cell_type": "code", "source": "pikachu = Pokemon(name = 'pikachu', \n pid = 25, \n height = 4, \n weight = 60,\n types = ('electric',),\n stats = {'hp': 35,\n 'attack': 55, \n 'defense': 40, \n 'special-attack': 50, \n 'special-defense': 50, \n 'speed': 90},\n sprite = 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/25.png',\n cry = 'https://raw.githubusercontent.com/PokeAPI/cries/main/cries/pokemon/latest/25.ogg')\npikachu.show()", "execution_count": null, "outputs": [] }, { "metadata": {}, "cell_type": "markdown", "source": "
\n \n# Exercices
" }, { "metadata": {}, "cell_type": "markdown", "source": "!!! question Exercice 1 : \n### Classe, attributs et constructeur\n1. Quelle est le nom de la classe ?\n2. Combien a-t-elle d'attributs ?\n3. De quelle ligne à quelle ligne se trouve le constructeur ?\n!!!" }, { "metadata": {}, "cell_type": "raw", "source": "Répondez ici" }, { "metadata": {}, "cell_type": "markdown", "source": "!!! question Exercice 2 : \n### Instancier des objets\n1. Recopiez la ligne qui crée l'instance du pokémon Pikachu et expliquer la.\n!!!" }, { "metadata": {}, "cell_type": "raw", "source": "Répondez ici" }, { "metadata": {}, "cell_type": "markdown", "source": "!!! question\n2. Créez le pokemon Ivysaur (Herbizarre). Ses attributs sont donnés par le dictionnaire suivant :\n\n```Python\n{'name': 'ivysaur',\n 'id': 2,\n 'height': 10,\n 'weight': 130,\n 'types': ['grass', 'poison'],\n 'stats': {'hp': 60, 'attack': 92, 'defense': 63, 'special-attack': 80, 'special-defense': 80, 'speed': 60},\n 'sprite': 'https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/2.png',\n 'cry': 'https://raw.githubusercontent.com/PokeAPI/cries/main/cries/pokemon/latest/2.ogg'}\n```\n\n3. Changez l'attaque (attack) de Ivysaur pour que celle-ci soit de 62.\n4. Rajoutez un attribut level à la classe pokemon. Pour cela vous devez l'ajouter dans le constructeur et l'initialiser à 0.\n!!!" }, { "metadata": { "trusted": false }, "cell_type": "code", "source": "# C'est à vous", "execution_count": null, "outputs": [] }, { "metadata": {}, "cell_type": "markdown", "source": "!!! question\n5. Créer une deuxième instance de Ivysaur avec un hp de 70 et level de 2.\n!!!" }, { "metadata": { "trusted": false }, "cell_type": "code", "source": "# C'est à vous", "execution_count": null, "outputs": [] }, { "metadata": {}, "cell_type": "markdown", "source": "!!! question Exercice 3 : \n### Créez des méthodes et les appeler sur des instances\n1. Créez une méthode level_up() qui augmente le niveau de 1 et augmente les statistiques de 10%. Pour cela, revenez à votre classe et créez une méthode dans votre classe. Cette méthode modifie les attributs du pokémon lui-même avec le mot clé self. N'oubliez pas de réexécuter votre code.\n2. Appelez la méthode level_up sur votre deuxième ivysaur.\n!!!" }, { "metadata": { "trusted": false }, "cell_type": "code", "source": "# C'est à vous", "execution_count": null, "outputs": [] }, { "metadata": {}, "cell_type": "markdown", "source": "!!! question\n3. Créer une méthode qui affiche le nom du pokémon, et ses statistiques en suivant l'exemple ci-dessous avec l'objet pikachu : *Le pokémon pikachu a 35 de vie (hp). Son attaque est de 55 et sa défense de 40. Il est de type electric*. Gérer le cas où le Pokémon a 2 types.\n4. Appelez cette méthode sur votre deuxième instance d'Ivysaur.\n!!!" }, { "metadata": { "trusted": false }, "cell_type": "code", "source": "# C'est à vous", "execution_count": null, "outputs": [] }, { "metadata": {}, "cell_type": "markdown", "source": "!!! question\n5. Créez une méthode plus_rapide() qui prend une vitesse en paramètre et qui renvoie un booléen vrai si le pokémon est plus rapide ou false sinon.\n6. Appelez cette méthode sur votre deuxième instance d'Ivysaur.\n!!!" }, { "metadata": { "trusted": false }, "cell_type": "code", "source": "# C'est à vous", "execution_count": null, "outputs": [] }, { "metadata": {}, "cell_type": "markdown", "source": "!!! question\n7. Créez une méthode same_type() qui prend en paramètre une liste de pokémon non vide et qui renvoie ceux du même type.\n8. Appelez cette méthode sur votre deuxième instance d'Ivysaur en prenant en paramètre la liste donnée dans le bloc précédent.\n!!!" }, { "metadata": { "trusted": false }, "cell_type": "code", "source": "# C'est à vous", "execution_count": null, "outputs": [] }, { "metadata": {}, "cell_type": "markdown", "source": "!!! tip Exercice 4 : \n### Pour aller plus loin\n1. Vous pouvez utiliser les lignes ci-dessous pour créer des pokemons plus rapidement. Expliquer ce que fait la fonction pokemon_from_data\n2. Créer une fonction attaque et faites s'affronter des Pokémons selon les règles de combat ! (Vous avez le droit de simplifier)\n!!!" }, { "metadata": { "id": "-A3mfplQZ8Tc", "trusted": true }, "cell_type": "code", "source": "def pokemon_from_data(pokemon_data):\n return Pokemon(pokemon_data['name'],\n pokemon_data['id'],\n pokemon_data['height'],\n pokemon_data['weight'],\n tuple(pokemon_data['types']),\n pokemon_data['stats'],\n pokemon_data['sprite'],\n pokemon_data['cry'])", "execution_count": null, "outputs": [] }, { "metadata": { "trusted": true }, "cell_type": "code", "source": "with open('pokemon_data_light.json', 'r') as json_file:\n pokemon_data = json.load(json_file)", "execution_count": null, "outputs": [] }, { "metadata": { "trusted": true }, "cell_type": "code", "source": "drakofeu = pokemon_from_data(pokemon_data[\"charizard\"])\ndrakofeu.show()\ndrakofeu.stats\n\nivysaur = pokemon_from_data(pokemon_data[\"ivysaur\"])\nivysaur.__dict__", "execution_count": null, "outputs": [] } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" } }, "nbformat": 4, "nbformat_minor": 2 }