Dans le cadre de mon master à l'UQAC, j'ai rejoint un projet de recherche. Celui-ci a pour objectif de développer un programme permettant à partir de l'image d'un niveau de plateformer d'estimer la difficulté engendrée par de potentiels plateformes, ennemis, ou autres briques de gameplay du plateformer.
Thomas BOCQUET
Jules LINARD
Mathis RONZON
Afin de pouvoir expérimenter notre programme sur un plateformer concret, nous nous sommes servis des niveaux du premier Super Mario comme point de départ. Voici par exemple le niveau 1_1 de ce jeu :
Niveau 1_1 de Super Mario
Nous avions comme idée de mettre en place des métriques pour estimer chacunes des difficultés. Pour cela, nous avions besoin de stocker la position de chacun des ennemis, des plateformes, des tuyaux ou autres éléments du niveau et les inscrire dans un JSON grâce à la librairie jsoncons.
La méthode utilisée était la suivante :
À partir des différents sprites des ennemis et des obstacles, nous utilisons OpenCV afin de matcher ces derniers avec leurs emplacements dans notre niveau.
Une fois le match effectué, nous récupérons la position des différents éléments en décomposant l'image comme une matrice de pixel.
Finalement, nous écrivons les positions dans un fichier JSON.
Nous avons alors pu reconstituer l'image suivante afin d'obtenir un aspect plus visuel de ce découpage avec OpenCV :
Image du niveau 1_1 reconstituée, avec les plateformes en blanc, les ennemis en marron et les tuyaux en rouge
Une fois cette première partie de notre programme fonctionnel, nous nous sommes penchés sur les différentes métriques que nous souhaitions mettre en place. Toujours à partir du niveau 1_1 précédent, nous avons pu réaliser des graphiques indiquant la difficulté engendrée par les plateformes :
Ci-dessus, on peut observer en rouge les zones de danger du niveau au sujet des plateformes.
À gauche, on peut observer la métrique sous forme de graphe. Plus la valeur est élevée, plus on estime le niveau difficile au fur et à mesure.
Cela nous permet d'avoir une première estimation de la difficulté d'un niveau de plateformer.
Nous avons également établi une métrique afin de déterminer la difficulté engendrée par les ennemis, métrique dont je me suis occupée grâce à un système de phéromones. En effet, nous effectuons un certain nombre d'itérations et à chaque itération, chacuns des ennemis se déplacent en fonction de son comportement dans le jeu. Par exemple dans l'exemple suivant, le Goomba fait demi-tour lorsqu'il rencontre un tuyau, mais chute lorsqu'il rencontre un trou. À contrario, le Koopa fait demi-tour lorsqu'il rencontre un tuyau ou un trou. On peut ainsi stocker la position successive des ennemis au fur et à mesure, et ainsi leur faire déposer des phéromones sur leurs chemins. De façon naturelle, on peut en conclure que les zones avec le plus grand taux de phéromones sont les plus dangereuses si l'on considère les ennemis, car la probabilité d'en trouver un à cet endroit est plus élevé que dans le reste du niveau.
Ce système de phéromones n'a pas été la première solution envisagée. En effet, après avoir modélisé le déplacement des ennemis, j'ai eu des difficultés à trouver une métrique convenable. Après y avoir réfléchi quelques jours, j'ai décidé de tenter l'implémentation qui s'est avéré fructueuse.
Position initale des Goomba en marron, et des Koopa en vert
Dépôt des phéromones en fonction du déplacement des ennemis. Plus la couleur est claire, plus le dépôt de phéromones est important.
Pour appliquer ce système de phéromones à notre problème, j'ai par la suite décider d'utiliser la méthodologie suivante :
En découpant le niveau en une suite successive de fenêtre de 200 pixels de largeur, on récupère le nombre de pixel atteignable par Mario dans cette fenêtre.
À l'aide de mon système de phéromones présentés ci-dessus, on récupère le nombre de pixels sur lesquels on trouve des phéromones dans cette fenêtre, et on le pondère par la quantité de phéromones présents sur ces pixels.
Finalement, on calcule le rapport entre ces deux nombres de pixels, et on l'utilise comme premier estimateur de la difficulté du niveau lié aux ennemis.
En blanc, l'ensemble des pixels possiblement atteints par Mario pour le niveau 1_1
Difficulté engendrée par les Goomba
Difficulté engendrée par les Koopa
Difficulté engendrée par l'ensemble des ennemis du niveau (Goomba + Koopa)
Cette métrique n'est pas parfaite mais elle donne un premier aperçu plutôt convainquant de la difficulté d'un niveau engendrée par les ennemis qui s'y trouvent. Afin de la parfaire, plusieurs possibilités sont envisagées. Pondérer chacune des courbes en fonction du type de l'ennemi lors du calcul de la courbe finale en est une.
Par la suite, j'ai également rajouté d'autres ennemis, ce qui permet d'obtenir de nouvelles courbes pour d'autres niveaux, comme le niveau 2_1 par exemple.
Niveau 2_1
Phéromones avec en marron les Goomba, en rose les plantes Piranha et en vert les Koopa
Métrique globale engendrée par les ennemis
Actuellement, ce projet est poursuivi par d'autres étudiants. Nous souhaitions parfaire nos métriques existantes, mais également tenter d'ajouter de nouvelles métriques qui prennent en compte les power-ups, ou encore la contrainte temporelle d'un niveau. Nous avions également comme idée de potentiellement pondérer chacunes de nos métriques, en fonction de la population de joueurs étudiés par exemple afin de proposer une solution plus adaptative.
Prototype visuel, dans le cadre de l'estimation finale