1. Introduction

La franchise Pokémon est une série de jeux vidéos développée par Nintendo. En 1996, les premiers jeux Pokémon Vert et Pokémon Rouge sortent sur Game Boy au Japon. Ces deux jeux présentent le même jeu à quelques différences près et ils forment une génération de Pokémon. Cette première version du jeu arrive deux ans plus tard sur les consoles américaines. Aujourd'hui, il existe 8 générations de Pokémons différents, dont la dernière en date est Pokémon Épée et Pokémon Bouclier sortie sur Nintendo Switch en février 2019.

Pokémon est un jeu dans lequel on incarne un personnage, un dresseur, qui peut capturer des créatures fantastiques, qu'on appelle des Pokémons. Avec ces créatures, on parcourt un monde fictif dans le but de devenir le meilleur des dresseurs. Dans cet objectif, il faut affronter d'autres dresseurs qui deviennent de plus en plus fort jusqu'à finalement combattre l'ultime dresseur, celui que l'on appelle le champion de la Ligue. Un élément commun à tous les jeux Pokémon est que dans notre quête, il y a toujours une organisation maléfique qui souhaite du mal aux Pokémons et qu'il faut démanteler. Par exemple, la plus connue, la Team Rocket, souhaiterait réduire en esclavage les Pokémons. Dans l'objectif de dissoudre cette organisation maléfique, il faudra livrer combat contre les sbires de celle-ci et finalement venir à bout de son chef.
Le but de ce projet sera de recréer ces combats tant aimés des joueurs, mais cette fois, on affrontera pas de dresseurs ou bien des méchants dans un monde fictif, mais un vrai joueur. Ce projet s'inspire grandement du site web Pokémon Showdown, qui reproduit ces combats.

1.1 Caractéristiques des Pokémons et leurs capacités

Les Pokémons peuvent apprendre jusqu'à quatre capacités et toutes partagent une structure commune qui contient les éléments suivants. Le type prend ses valeurs parmi les suivantes ; Normal, Feu, Eau, Plante, Électrique, Glace, Combat, Poison, Sol, Vol, Psy, Insecte, Roche, Spectre, Dragon, Ténèbres, Acier et Fée.
La puissance détermine les dégâts infligés par la capacité.
La précision donne les chances de réussite d'une capacité.
Les PP (points de pouvoir) détermine le nombre de fois qu'un Pokémon peut utiliser une capacité. Chaque fois qu'une capacité sera utilisé, un PP lui sera retiré, et lorsque ce nombre tombera à zéro, la capacité ne pourra plus être utilisée.
Les capacités sont dites soit physiques, spéciales ou bien de statut. Selon que la capacité soit physique ou spéciale, le calcul des dégâts utilisera des caractéristiques différentes. Les capacités de statut servent à altérer des caractéristiques chez les Pokémons et ne font pas de dégâts. Cependant, il existe également des capacités qui ne sont pas de statut et qui peuvent altérer des caractéristiques.
La priorité est encore un autre attribut dont sa fonction sera décrite plus tard.

Chaque Pokémon a un certain nombre de caractéristiques qui lui sont attribuées à l'avance dont voici la liste. Dans le jeu Pokémon, ces caractéristiques sont appelés des statistiques.
Les Pokémons ont un ou deux types qui sont les mêmes que ceux cités au dessus pour les capacités.
Les PV (points de vie) indiquent si le Pokémon peut combattre. Lorsque ceux-ci seront en dessus de zéro le Pokémon pourra combattre, mais si ils descendent en dessous de zéro, le Pokémon sera déclaré K.O. L'attaque, la défense, l'attaque spéciale, la défense spéciale et la vitesse sont tous des statistiques qui influent sur le calcul des dégâts ou sur le déroulement du combat.

1.2 Calcul des dégâts.

Les dégâts sont calculés selon la formule suivante :

Je ne décrirai pas la fonction de la variable du niveau. On considérera pour la suite que sa valeur sera de 100. La puissance correspond à la puissance de la capacité utilisée, l'attaque correspond à la statistique attaque ou attaque spéciale du lanceur de la capacité et la défense correspond à la statistique défense ou défense spéciale du Pokémon subissant l'attaque. Si la capacité est physique, on utilisera les valeurs d'attaque et de défense dans le calcul. Dans le cas où la capacité est spéciale, on utilisera les valeurs d'attaque spéciale et de défense spéciale. Le coefficient multiplicateur (CM) est déterminé par la multiplication des éléments suivants :

  • Un nombre aléatoire entre 0,85 et 1.
  • Le STAB (Same type attack boost), qui augmente les dégâts de 50% si le Pokémon qui utilise la capacité est de même type que l'attaque.
  • L'efficacité des types, dont voici le tableau

Tableau des forces et faiblesses de chaque type. La taille de l'image étant limitée sur ce site, l'image n'est pas très lisible, vous pouvez cliquer ici pour voir l'image en grand.
Par exemple, si une capacité de type Roche est utilisée contre un Pokémon de type Glace, les dégâts seront doublés. À l'inverse, une capacité de type Eau utilisée sur un Pokémon de type Dragon verra ses dégâts divisés par deux. Également, si un Pokémon a deux types, on doit calculer le multiplicateur sur chacun des types. Par exemple, les dégâts d'une capacité de type Feu utilisée sur un Pokémon de type Plante et Insecte seront quadruplés.

1.3 Déroulement des combats

Les combats consistent en deux dresseurs qui s'affrontent en un contre un en tour par tour. Chaque dresseur a une équipe de 6 Pokémons, chacun a quatre capacités et un seul Pokémon peut se battre à la fois. Ils se déroulent de la façon suivante ;
Chaque tour, les deux dresseurs choisissent une seule action parmi

  • Utiliser une des quatre capacités du Pokémon actif
  • Échanger le Pokémon actif avec un autre qui n'est pas K.O. On appellera cela le switch.

Si les deux dresseurs choisissent une capacité, le Pokémon qui a la plus grande vitesse agira en premier. Si un des dresseurs choisit le switch, celui-ci s'opère en premier et c'est le Pokémon qui arrive dans le combat qui subit la capacité. Si les deux choisissent le switch, les changements se font l'un après l'autre. Un autre cas est possible. Certaines capacités ont la priorité, c'est à dire que si un Pokémon utilise un telle capacité, le Pokémon attaquera en premier, quelle que soit la vitesse des deux Pokémons. Si toutefois, les deux Pokémons utilisent une capacité prioritaire, c'est encore une fois le Pokémon avec un plus grande vitesse qui attaque.
Le combat se termine lorsque tous les Pokémons d'une des deux équipes sont K.O.

2. Matériel et méthodes

Le matériel nécessaire pour ce projet étant assez limité, une section matériel n'est pas nécessaire. Il faut premièrement un ordinateur avec un logiciel capable d'exécuter du code Python ainsi que les librairies math, random et pygame. Également, il est nécessaire d'avoir les statistiques de chaque Pokémon et de chaque capacité ainsi que, pour chaque Pokémon, la liste de capacités que celui-ci peut apprendre. Pour cela, j'utiliserai des fichiers CSV (comma separated values), qui me permettront d'importer toutes les données nécessaires à mon projet. Le module pandas sera nécessaire pour extraire les données du fichier.
Concernant la méthode, l'interface graphique sera créée avec la librairie pygame. Je commencerai par créer les interfaces, ensuite j'écrirai le programme qui permettra de naviguer entre les interfaces et je terminerai avec la partie qui permettra de créer l'équipe Pokémon et qui gérera le combat. La description de chacune des interfaces et leurs interactions sera divisée en plusieurs sous-sections. Un point commun des toutes ces interfaces sera la possibilité de quitter le jeu en appuyant sur la touche Q du clavier ou bien en appuyant sur la petite croix de la fenêtre en haut à droite.

2.1 Interface de l'équipe Pokémon

Cette interface sera celle sur laquelle on arrivera lorsqu'on lancera le programme. Ici, on pourra consulter notre équipe Pokémon en entier. Il y aura six blocs vides qui accueilleront chacun un Pokémon de la future équipe. Croquis de l'interface de l'équipe Pokémon

On naviguera entre les blocs avec les touches directionnelles (les flèches du clavier). Les blocs auront une bordure noire, et il y en aura un qui aura une bordure rouge, par défaut celui en haut à gauche et la couleur rouge changera de bloc en même temps qu'un appui sur les touches directionnelles. Le bloc de couleur rouge indiquera à quelle place ira le Pokémon que l'on sélectionnera. La place du Pokémon n'a pas d'importance, sauf si celui-ci est à la première place, car ce sera celui-là qui sera envoyé au combat en premier. De plus, en maintenant la touche Contrôle du clavier et en utilisant les flèches gauche et droite, on pourra échanger la vue de l'équipe du joueur 1 et celle du joueur 2.

Maintenant, en appuyant sur la touche Entrée du clavier, on arrive sur une nouvelle interface, qui sera celle d'inspection d'un Pokémon en particulier et de ces capacités.

2.2 Interface d'inspection du Pokémon

Cette interface contiendra un grand bloc sur la gauche de l'interface et quatre petits blocs de tailles égales sur la droite de l'interface. Les informations sur le Pokémon seront affichées sur le grand bloc, et chacune des quatre capacités sera affichée sur un des blocs. Tant que le Pokémon ne sera pas sélectionné, le programme affichera simplement Capacité sur chacun des petits blocs et Pokémon sur le grand bloc. Croquis de l'interface d'inspection du Pokémon

Lorsque le Pokémon sera sélectionné, son nom sera affiché sur le grand bloc et le nom de chaque capacité sera ajoutée sur un des petits blocs au fur et à mesure que le joueur choisira les capacités de son Pokémon.
À tout moment, il sera possible de revenir sur la vision globale de l'équipe et appuyant sur la touche Retour du clavier et inspecter un autre Pokémon. Toutefois, cette dernière méthode est fastidieuse si le but est d'inspecter un autre Pokémon. Par conséquent, en maintenant la touche Majuscule du clavier et en utilisant les flèches gauches et droites du clavier, le joueur pourra basculer sur l'inspection d'un autre Pokémon sans revenir sur l'interface de départ.
De même que sur l'interface précédente, il y aura un bloc avec une bordure rouge et quatre autres blocs à la bordure noire et l'on naviguera de la même manière entre les blocs. On pourra également basculer de la vue premier joueur à deuxième joueur.
En appuyant sur la touche Entrée, il y a deux actions possibles. Si le grand bloc est sélectionné, l'interface de sélection du Pokémon s'ouvrira et l'on pourra choisir le Pokémon. Si c'est un des petits blocs qui est sélectionné et qu'un Pokémon a été choisi, alors l'interface de sélection des capacités s'ouvrira. Dans le cas contraire, rien ne se passera.

2.3 Interfaces de sélection des Pokémons et des capacités.

Cette interface contiendra deux colonnes avec chacune 5 blocs qui seront tous de tailles égales pour un total de 10 blocs et chaque bloc contiendra un Pokémon ainsi que ses types, pour permettre au joueur de créer une équipe équilibrée. Comme il y aura plus de 800 Pokémons que l'on pourra sélectionner, il y aura plusieurs pages de Pokémons et on naviguera entre ces pages en maintenant la touche Majuscule ou Contrôle et en utilisant les flèches gauche et droite. Si l'on maintient la touche Majuscule, on va à la prochaine page ou à la précédente page, tandis que si l'on maintient la touche Contrôle, on naviguera de 10 pages en 10 pages (Il y aura tout de même plus de 80 pages ! Ce serait très long de passer chaque page une par une.).

Croquis de l'interface de sélection

Il y aura également un bloc avec la bordure rouge pour indiquer quel Pokémon est sélectionné, et on naviguera encore une fois entre les blocs avec les touches directionnelles. À tout moment, on peut revenir en arrière sur l'interface avec la touche Retour et si l'on appuie sur la touche Entrée, le Pokémon choisi sera intégré à l'équipe Pokémon.
L'interface de sélection des capacités sera en tous points semblables à celle de sélection des Pokémons, excepté pour le contenu des blocs, qui sera les capacités que le Pokémon peut apprendre.

2.4 Interface de combat

Le combat commence lorsque chaque joueur aura choisi ses Pokémons et leurs capacités. Il y aura deux emplacements où il y aura une image des Pokémons en train de combattre, une bulle affichant les points de vie restants pour chaque Pokémon et pour terminer, deux blocs tout en bas de l'interface, un pour choisir quelle capacité utiliser et un autre pour effectuer le switch. La barre de points de vie aura une largeur correspondant à la largeur initiale multipliée au pourcentage de vie restante au Pokémon. Elle sera en vert si le pourcentage est plus haut que 50%, orange si il est entre 50% en 20% et rouge sinon. Croquis de l'interface de combat

Le joueur utilisera les flèches gauche et droite pour changer de bloc. En appuyant sur la touche Entrée, on pourra accéder à la sélection de la capacité ou bien du Pokémon à échanger. Si le joueur choisi d'utiliser une capacité, les deux blocs laisseront à deux lignes de deux blocs avec une capacité par bloc, et en réappuyant sur Entrée, la capacité sera utilisée au tour actuel. Dans le cas où le joueur veut effectuer le switch, il y aura 2 lignes de 3 blocs avec un Pokémon par bloc, en réappuyant sur Entrée, le joueur confirmera qu'il veut échanger le Pokémon sélectionné. Le joueur naviguera entre les différents blocs et à chaque fois il y aura un bloc avec des bordures rouges pour indiquer quel bloc est actuellement sélectionné.
Lorsque les deux joueurs auront choisi leurs actions, elles s'effectueront dans l'ordre tel qu'il est décrit à la section 1.3, et pour chaque action il y aura un message qui apparaîtra dans un grand bloc qui se situera là où il y a les blocs pour choisir une action.

Lorsqu'un des deux joueurs sera venu à bout de l'équipe de son adversaire, un grand message disant Le joueur 1 (ou 2) remporte le combat ! apparaîtra au milieu de l'écran.

3. Résultats

Lorsqu'on lance le programme, on arrive sur l'interface suivante. La fenêtre a une taille modifiable à souhait, ce qui permet à quelqu'un qui aurait un écran de taille différente du mien d'adapter l'affichage sur son moniteur. De plus, l'interface d'adapte en fonction de la taille de la fenêtre. Toutefois, la fenêtre change de taille seulement lorsque l'utilisateur lâche le curseur.

Vidéo de l'interface de départ. Les zones en noires sur les côtés sont dues au fait que le logiciel de capture utilisé capture une surface de 1600 pixels fois 900 pixels, qui est la taille initiale de la fenêtre, et la taille de la surface de capture reste fixe quand la taille de la fenêtre change.

La bordure de couleur différente passe de bloc en bloc en même temps que l'utilisation des touches directionnelles, ce qui permet clairement de distinguer quel Pokémon va être sélectionné. Il y a de plus en haut à gauche en message indiquant quel joueur est actif.

Maintenant, lorsqu'on souhaite choisir nos Pokémons, on peut avec la touche Entrée, accéder à la sélection d'un Pokémon et/ou son inspection ainsi qu'aux choix des capacités.

Il y a donc un grand bloc avec le nom du Pokémon et quatre petits blocs avec une capacité par bloc. Si l'on essaie d'accéder au choix des capacités sans avoir choisi de Pokémon, rien ne se passe, il faut d'abord sélectionné un Pokémon. De plus, bien que cela n'apparaît pas dans la vidéo, si un joueur décide de remplacer un des Pokémons qu'il a choisi, il peut le faire en sélectionnant le bloc avec le nom du Pokémon et choisir un autre Pokémon. Également, il est possible de remplacer une capacité non-désirée en sélectionnant le bloc avec la capacité que l'on souhaite remplacer. Cependant, seules les capacités physiques et spéciales peuvent être choisie, il n'y a aucune capacité de statut. Par conséquent, certains Pokémons tels que Métamorph ne pouvant pas apprendre plus de quatre capacités physiques ou spéciales ne peuvent être sélectionnés.

Lorsque chaque joueur a composé son équipe, le combat commence. Dans la vidéo, on observe que tous les Pokémons ont leurs quatre capacités excepté le Aligatueur du joueur 2. Lorsque la dernière capacité du Aligatueur est sélectionnée le combat est lancé. Le Pokémon du joueur 1 apparaît sur la gauche de l'écran et celui du joueur 2 sur la droite de l'écran. Cependant là où devrait figurer l'image du Pokémon, il y a une Pokéball, un objet qui permet du capturer les Pokémons, afin de combler le vide dû à l'absence de l'image d'un Pokémon. Il y a aussi, les deux cases indiquant chacune une action que le joueur peut sélectionner. Si l'action du switch est choisie et qu'un Pokémon est K.O, un petit tampon K.O. rouge apparaît en dessous du Pokémon correspondant.

Lorsque les joueurs arrivent au combat, ils ne peuvent plus revenir en arrière pour modifier leur équipe, ils doivent combattre jusqu'à triompher de l'autre ou perdre. Lors du combat, le joueur 1 puis le joueur 2 choisissent leurs actions. Cependant, contrairement à l'ordre décrit à la section 1.3, les actions s'effectuent en même temps, la vitesse des Pokémons et la priorité des capacité n'est pas prise en compte. Également, les capacités peuvent être utilisées à l'infini sans tenir compte du nombre de PP.
Lorsqu'un Pokémon atteint zéro PV, un switch sera forcé afin de remettre un Pokémon en état de combattre sur le terrain, comme on le voit dans la vidéo suivante où le Zygarde est mis K.O. après l'utilisation de Blizzard par Lugia. Ici, la capacité Blizzard inflige des dégâts colossaux à Zygarde qui est de type Sol et Dragon, et qui subit par conséquent quatre fois les dégâts de Blizzard qui est une capacité de type Glace.

Finalement, lorsqu'un des joueurs arrive à bout de l'équipe de son adversaire, le combat prend fin et un message apparaît au milieu de l'écran pour désigner le vainqueur.
On voit dans la vidéo que le dernier Pokémon en vie chez le joueur 1 est un Dracaufeu, et lorsque le Aligatueur utilise sa capacité Hydroblast, le Pokémon crocodile (Aligatueur) élimine le Dracaufeu donnant la victoire au joueur 2.

4. Discussion

Bien que le jeu soit facilement jouable, il y a de nombreux aspects des combats Pokémon qui n'ont pas été pris en compte dans ce projet, comme par exemple la probabilité de rater une attaque ou une capacité pour un Pokémon (c'est là qu'intervient la précision d'une capacité), les coups critiques, les talents, les objets, les attaques de statut etc.
Toutes ces fonctionnalités font la plus grande partie de l'intérêt d'un combat Pokémon multijoueur, la stratégie. En effet, dans les jeux Pokémons, les combats ne sont, à quelques exceptions près, jamais difficiles et le joueur peut s'en sortir sans difficulté. Dans ce programme, la meilleure stratégie est simplement de prendre un Pokémon qui a des capacités avec beaucoup de puissance et utiliser en boucle ces capacités. Cependant, cette catégorie de capacité a un effet qui l'accompagnent qui fait qu'utiliser en boucle celles-ci n'est pas optimal. Par exemple, les capacités Ultralaser et Giga Impact ont toutes deux 150 de puissance, ce qui est énorme. Toutefois, si un Pokémon utilise cet capacité, il doit attendre un tour sur le terrain, sans pouvoir effectuer le switch ni utiliser de capacités, le laissant à la merci de son adversaire.
Un deuxième point qui est à améliorer consiste en la construction de mon jeu pour tout type de joueur, et pas seulement pour quelqu'un qui connaît bien le jeu Pokémon. En effet, un connaisseur peut tout à fait créer une équipe équilibrée et viable stratégiquement juste avec le nom des Pokémons et des capacités, mais ce n'est absolument pas le cas pour quelqu'un qui n'aurait jamais touché à un jeu Pokémon. Je vous ai présenté les types des capacités, des Pokémons et de leurs statistiques, mais celles-ci n'apparaissent pas dans la sélection de Pokémon ou dans l'inspection. Ces valeurs pourtant si importantes se trouvent seulement dans le code, ce qui est extrêmement ennuyeux si l'on souhaite consulter les statistiques d'un Pokémon ou d'une capacité. Également, l'absence d'images pour les Pokémons et de couleurs pour les types et les capacités rend difficile la distinction entre un Pokémon ou un autre, étant donné que seul du texte, dont la police et la taille est uniforme, permet de différencier deux Pokémons ou capacités.
En addition à cela, vient le nombre colossal de Pokémon que l'on peut choisir. Si un grand nombre de Pokémons permet plus de stratégie, naviguer dans 90 pages de Pokémons et ne pouvant que passer de page en page, ou 10 pages en 10 pages, ne permet pas de consulter efficacement l'ensemble des Pokémons. Par exemple, un filtre qui permettrait de n'afficher que les Pokémons de type Feu ou bien les Pokémons dont la défense est supérieure à 200 permettrait au joueur de composer son équipe bien plus efficacement et plus rapidement. De surcroît, le fait que le programme débute le combat instantanément après que chaque Pokémon a ses quatre capacités retire l'opportunité au joueur de revoir une dernière fois son équipe avant le combat.
En outre, si les interfaces sont facilement lisibles, leur structure est assez monotone et manque de gaieté et d'esthétique. On risque rapidement de se lasser de petits rectangles remplis de texte avec un style constant. Au même titre, l'absence de musique et de bruitage ainsi que l'utilisation des flèches directionnelles n'aident pas le joueur à s'accrocher au jeu. En effet, un léger bruitage lorsque l'on change de bloc ou bien une musique de fond attise plus facilement la curiosité d'un éventuel utilisateur. De plus, l'utilisation de la souris par exemple, pour naviguer entre les interfaces serait bien plus agréable que simplement avec les flèches directionnelles et la touche Entrée.
Un élément central des combats Pokémons est la musique. Personnellement, dans chaque jeu Pokémon auquel j'ai joué, je trouvais que la musique apportait une tension au plus au combat, capturait mieux le joueur dans la combat et je ressens ce manque ici dans mon jeu. À part les éléments cités plus haut constituant la stratégie des combats, il manque aussi les animations des capacités qui apportent de la satisfaction au joueur (en tout cas telle est mon opinion) ainsi qu'un narrateur (ou commentateur appelez-le comme vous le souhaitez) qui donnerai plus d'information sur le déroulement du combat, ce qui permettrait de suivre plus facilement.
Un dernier aspect est l'inconvénient qui est engendré par les deux joueurs jouant sur le même écran. Chacun peut voir l'équipe de l'autre et par conséquent adapter son équipe et anticiper les coups de son adversaire qu'ils n'auraient pas pu anticiper autrement.

5. Conclusion

Je considère que l'objectif initial de mon projet est presque atteint. En effet, le fait que les Pokémons attaquent en même temps retire la possibilité d'attaquer en premier, ce qui est un atout majeur dans un vrai combat Pokémon. Je pense qu'à force d'améliorations et surtout l'ajout de la possibilité de jouer sur deux appareils différents, par Internet ou non, rendrait mon jeu suffisamment agréable à jouer pour pouvoir défier d'autres amis en duel de Pokémons.
Si l'on abstraction du côté purement divertissant de ce projet, celui-ci m'a permis de beaucoup progresser en programmation sur Python et m'a fait découvrir la librairie pygame et toutes les fonctionnalités qu'elle propose. De plus, je constate la complexité de la création d'un jeu, décrire tout le fonctionnement du jeu sur le papier (ou autre format numérique), ses interactions avec l'utilisateur, les commandes, etc. Si l'on ne fait pas cela, le jeu risque fortement de ne pas être complet ou incohérent. Également, il faut coder chaque rectangle, chaque forme, chaque texte, chaque petite interaction, chaque petite commande, ce qui fait un gros travail. De plus, je n'avais pas de bruitages, de musique, d'animations ou d'images. Je n'ai pas non plus fait de travail de création hormis le dessin des interfaces. Tous ces éléments sont à créer et ensuite à insérer un à un dans le code tout en ayant un jeu agréable à voir, avec des commandes et d'autres options personnalisables, comme par exemple le volume ou la luminosité.
Si toutefois j'ai pris du plaisir à écrire ce programme, je ne pense pas que cela aurait été le cas de tout le monde, car il faut avoir la fougue des Pokémons pour pouvoir recréer ces combats, autrement on serait vite perdu au milieu de tous ces Pokémons, leurs statistiques, leurs capacités, etc.
Un avantage de ce projet est que grâce à la manière dont le code a été construit, c'est à dire de manière indépendante de la liste de Pokémon, on peut à tout moment ajouter de nouveaux Pokémons, qu'ils viennent d'une nouvelle génération de Pokémons créée par Nintendo, ou bien directement de notre imagination.

Références

Franchise Pokémon : https://fr.wikipedia.org/wiki/Pok%C3%A9mon Calcul des dégâts : https://www.pokepedia.fr/Calcul_des_d%C3%A9g%C3%A2ts, conditions d'applications du STAB : https://www.pokepedia.fr/STAB Origine des fichiers CSV utilisés pour importer les données : https://github.com/veekun/pokedex/tree/master/pokedex/data/csv Utilisation du module Pandas pour importer les données : https://www.shanelynn.ie/python-pandas-read-csv-load-data-from-csv-files/ Documentation pour pygame : https://www.pygame.org/docs/ Jeu snake dont je me suis inspiré pour commencer mon programme avec pygame : https://www.edureka.co/blog/snake-game-with-pygame/