TP
Pokemon

Pokedex & CSV

Sommaire

01.

Le Pokedex

Le contenu du Pokedex

02.

Les catégories

Trier les Pokemons

03.

Le champion

Quel pokemon choisir.

04.

Le combat final

Quel pokemon pour affronter le boss de fin.

1. Ouverture du Pokedex
pokemon

Analyse du Pokedex

Préparation de l'espace de travail

Préparation de l'espace de travail

  1. Créer un dossier TP_Pokemon_nom
  2. Dans ce dossier, créer un fichier pokemon.py
Dans ce TP, nous allons étudier les Pokemons qui se trouvent dans un fichier nommé pokedex.csv.
Télécharger le et place le fichier dans le dossier du TP.
https://exomorphisme.fr/static/cours/premiere/nsi/th3/th3a/datas/tp_pokemon/pokemon.csv

Analyse du Pokedex


Les fichiers csv ont la particularité d'avoir différente représentation suivant le logiciel avec lequel il est ouvert.

1. A l'aide d'un éditeur de texte


Ouvrir le fichier pokedex.csv à l'aide de Sublime Text.
Utiliser les touches Ctrl + O ou par glisser déposer.

Quel est le caractère utilisé pour séparer les différentes valeurs ?




2. Avec un tableur

Ouvrir le fichier pokedex.csv à l'aide de Libreoffice CALC.

Une fois ouvert avec CALC, combien de lignes contient la feuille de calcul ?





3. Avec Python


Le code ci-dessous ouvre le fichier pokemon.csv et créer une liste nommée pokedex dont chaque élément est un dictionnaire ayant pour clés les données de la première ligne du fichier pokemon.csv et pour valeurs le contenu d'une ligne.

import csv

with open('pokemon.csv','r') as f:
    pokedex = [dict(pokemon) for pokemon in csv.DictReader(f)]

                    
Copier le code précédent, dans le fichier pokemon.py et rajouter les instructions nécessaires pour répondre aux questions ci-dessous :
De quel type est la variable pokedex ?





Combien de pokemons sont dans le fichier pokemon.csv ?




Parmi les clés ci-dessous laquelle n'est pas une clé relative à un dictionnaire lié à un pokemon ?
  • Choisir un dictionnaire dans la liste pokedex(en prenant par exemple le première élément de la liste)
  • Utiliser la méthode keys() pour obtenir les clés
  • Utiliser l'instruction print() pour afficher le résultat



2. Trouver le bon pokémon
pokemon

Sélection des pokémons

  1. Créer une liste gen_4 qui contient tous les pokémons de génération 4
    • Commencer par initialiser une liste vide nommée gen_4
    • Parcourir la liste pokedex et pour chaque élément tester si la clé Generation est égale à "4"
    • Si cette clé est égale à 4 alors ajouter (avec la méthode append) l'élement à la liste gen_4
    • On s'interesse à la longueur de la liste (on pourra utiliser la fonction len())

  2. Combien de pokemons sont de génération 4 ?




  3. Créer une liste low_pok qui contient les noms (Name) de tous les pokémons dont les points d'attaques (Attack) sont strictement inférieur à 20
    La question ressemble à la précédente à la différence qu'il ne faut garder dans notre liste pas tout le pokémon mais seulement son nom.
    Il faudra faire attention aussi à la comparaison des nombres qui nécessite un transtypage de la valeur de la clé Attack.
    • Comme précédemment, on va commencer par initialiser une liste vide nommée low_pok
    • Parcourir la liste pokedex et pour chaque élément tester si la clé Attack est strictement inférieur à 20 (C'est ici qu'on utilisera la conversion de la valeur de la clé Attack en int
    • Si cette clé est égale à 20 alors ajouter (avec la méthode append) la valeur de la clé Name à la liste low_pok
    • Il ne reste plus qu'à afficher la liste

  4. Il faudra convertir la valeur de l'attaque en entier, à l'aide de la fonction int( )
    Quel pokemon ne fait pas partie de cette liste ?



  5. Créer une liste hard_flying qui contient les ids (id) de tous les pokémons dont les points de vie (Health Points) sont supérieur ou égal à 50 et qui possède le type (Type) Flying.
    Ici encore peu de changement par rapport à la question précédente, seulement l'ajout d'une seconde condition qui nous amènera à utiliser le mot clé and .
    • On commence par initialiser une liste vide nommée hard_flying
    • Parcourir la liste pokedex et pour chaque élément tester si la valeur de la clé Health Points est supérieur ou égal à 50 (ici aussi on utilisera la conversion de la valeur de la clé Health Points en int)
    • et (and ) la valeur de la clé Type est égale à Flying.
    • Si ces conditions sont vérifiées, on ajoute la valeur de la clé Name à la liste hard_flying
    • Il ne reste plus qu'à afficher la longueur de la liste


  6. Combien il y a-t'il de pokémons dans la liste hard_flying ?




L'intrus


Un intrus c'est glissé dans le pokedex, à toi de le retrouver.
Pour le retrouver créer et afficher une liste qui contient tous les types (TYPES) distincts.

Pour les pokémons ayant 2 types ( ex : Ghost Flying) on peut utiliser la méthode split sur les chaines de caractères.
  • Comme toujours, on va commencer par initialiser une liste vide nommée types
  • Parcourir la liste pokedex et pour chaque élément à partir de la valeur de la clé Type créer une liste tmp contenant le.s type.s du pokémon
  • Parcourir la liste tmp et pour chaque élément vérifier s'il n'est pas déjà dans la liste.
  • S'il n'est pas dans la liste, il faut l'ajouter (avec la méthode append )


"Ghost Flying".split(" ")
# Renvoie ["Ghost", "Flying"]
Combien de types différents a-t'on dans notre pokedex ?



Quel est le type de l'intrus ?



Quel est l'id de l'intrus ?




3. Le meilleur des pokémons

Les 10 attaques les plus puissantes

Pour sélectionner les pokémons les plus puissants, nous allons devoir trier une liste de dictionnaires.
Pour ce faire nous allons construire une fonction qui pour un dictionnaire donné renvoie la valeur de la clé sur laquelle nous souhaitons faire notre tri.


Par exemple


simpsons = [{'age': 39, 'name': 'Homer'},{'age': 10, 'name': 'Bart'}]

# pour trier la liste de dictionnaire, il faut avoir définie une 
# fonction qui renvoie la valeur utilisée pour le trie

def get_age(dic):
    return dic["age"]

# Aprés on peut utiliser une fonction de trie telle que sort, sorted, ... 
# en lui donnant comme parametre optionnel la fonction.

simpsons.sort(key=get_age)
# [{'age': 10, 'name': 'Bart'}, {'age': 39, 'name': 'Homer'}]
                    


Il faudra convertir la valeur de l'attaque en entier, à l'aide de la fonction
int( )
Quelle est la somme des points d'attaque des 3 pokemons les plus puissants ?




The champion

Pour déterminer le meilleur pokémons, il ne faut pas regarder seulement les points d'attaque mais la somme des points de vie(Health Points), d'attaque (Attack), de défense (Defense), de l'attaque spécial (Special Attack), de la défense spéciale (Special Defense) et de la vitesse (Speed).
Modifier la fonction de tri pour qu'elle prenne en compte cette nouvelle méthode de tri.
Quel est le total des points du pokémon le plus puissant ?




4. Le combat final

Le boss de fin

Le grand moment tant attendu est enfin arrivé. Nous allons devoir affronter le boss de fin, et c'est ... Lugia.
Tout d’abord Lugia est donc un pokémon légendaire de type psy et vol.
Ces combinaisons de type de pokémon possède des faiblesses face aux types roche (Rock), tenèbre (Dark) et spectre (Ghost) puisque pokémon fonctionne de la sorte.
Ainsi pour multiplier par 2 la puissance d’attaque du pokémon choisi, nous devons concentrer notre recherche de champion au sein pokemon qui ont 2 de ces 3 catégories.
Il faut donc extraire et trier les pokémons possédant ces types de notre base de données.

Ecrire un code qui permette de lister les pokemons correspondant à notre recherche, en les classant par attaque décroissante.
Quel pokemon devons nous choisir ?