Contexte & description du projet
Dans le cadre de la Situation d'Apprentissage et d'Évaluation (SAE) "Implémentation d'un besoin client", on nous a donné une base de jeu Golang (un terrain divisé en cases, sur lequel un joueur peut se déplacer librement) en nous demandant d'y ajouter des fonctionnalités, dont la principale était d'optimiser la gestion du terrain avec un Quadtree. Ce projet a pris place sur une période de deux mois, de décembre 2024 à janvier 2025, durant mon premier semestre en BUT Informatique à l'IUT de Nantes. Nous étions alors en groupe de 2.
Méthodologie et outils
Plus précisément, la première étape consistait à se familiariser avec la base de code existante et à comprendre son fonctionnement. Cela fait, nous sommes passés sur le développement de fonctions permettant de lire des fichiers et de stocker leur contenu en mémoire sous forme de tableaux, puis d'optimiser leur traitement en remplaçant les tableaux par des structures de type Quadtree. Une fois cette étape testée et validée, nous avons pu nous concentrer sur l'implémentation de fonctionnalités supplémentaires pour améliorer l'interaction entre le joueur et le terrain.
Le projet a été développé en utilisant le langage Go (Golang), un langage de programmation open source conçu pour la simplicité, la performance et la concurrence. Le jeu a été construit grâce à la bibliothèque Ebitengine, une bibliothèque légère et facile à utiliser pour créer des jeux 2D en Go. Par ailleurs, nous avons utilisé Visual Studio Code comme environnement de développement intégré (IDE).
Contributions personnelles
Génération du terrain (Quadtree)
Pour cette partie, centrée sur la lecture de fichiers et leur sauvegarde en mémoire, moi et mon collègue avons créé ensemble 4 fonctions :
- Une fonction de lecture de fichiers, qui ouvre un fichier texte, lit son contenu ligne par ligne, et stocke chaque caractère dans un tableau d'entiers.
- Une fonction d'affichage, qui récupère la tuile pointée par la caméra et le tableau de la fonction précédente, afin de déduire les tuiles à afficher sur l'écran et leur position.
- Une fonction de conversion fichier vers Quadtree, qui construit un quadtree représentant un terrain étant donné un tableau d'entiers représentant le même terrain (le tableau construit par le première fonction). Cette méthode marche pour les terrains rectangulaires, et simplifie la division au possible (par exemple, si 4 tuiles ont la même valeur, elles sont regroupées en un seul noeud du Quadtree).
- Une nouvelle fonction d'affichage, parcourant le quadtree et comparant leur emplacement avec la position de la caméra afin de savoir quelles tuiles doivent être affichées à l'écran et à quelle position.
Principe de l'affichage depuis un tableau : la grille représente la terrain complet, la partie bleue est la zone visible à l'écran, la tuile rouge est celle pointée par la caméra
Fonctionnement d'un Quadtree, une structure de données arborescente qui permet de diviser l'espace en 4 régions plus petites
La transition de la génération du terrain vers un Quadtree a permis d'optimiser la complexité algorithmique et de rendre le déplacement du joueur plus fluide. J'ai dû adapter le code existant pour intégrer cette nouvelle structure, ce qui a nécessité une bonne compréhension des algorithmes de division d'espace.
Extensions
Après avoir implémenté le Quadtree, nous avons ajouté plusieurs fonctionnalités pour améliorer l'expérience de jeu. Concernant celles dont je me suis chargé :
Illustration de l'interdiction de marcher sur l'eau quand le terrain est un océan
Interdiction de marcher sur l'eau : Cette fonctionnalité empêche à la fois le joueur de se déplacer sur une tuile identifiée comme de l'eau et d'apparaître dessus. Pour la première partie, une liste de 4 booléens vérifie à chaque frame s'il y a des tuiles dans les 4 directions adjacentes et si leur valeur correspond ou non à de l'eau. Pour la deuxième partie, on regarde la case au centre du terrain (celle où est normalement généré le joueur) et vérifie sa valeur. Si c'est de l'eau, on regarde récursivement les tuiles adjacentes jusqu'à en trouver au moins une qui ne soit pas de l'eau. Si le monde n'est qu'un vaste océan, la tuile centrale sera remplacée par du bois afin de donner un petit radeau au naufragé (d'autres groupes ont décidé de fermer le programme en affichant un message d'erreur, chacun ses goûts).
Caméra bloquée aux bords du terrain : Un problème, à ce stade du jeu, est que lorsque le joueur se déplace jusqu'au bord du monde, la caméra continue de le suivre et on voit le vide de l'autre côté du terrain. Plusieurs possibilités sont alors envisageables : bloquer la caméra pour ne pas montrer le vide (probablement la meilleure solution), réduire le terrain affiché (peu appréciable), ou dans mon cas stopper la mise à jour le terrain en fonction de la position du joueur. C'est-à-dire que le joueur continue de se déplacer, que la caméra continue de le suivre, mais que le terrain ne change plus les tuiles qui doivent être affichés. Pour autant, le terrain reste animé.
La terre est ronde : Une autre solution au problème précédent est de simuler le fait que le terrain est un globe, de "répéter" le terrain à l'infini afin de ne jamais afficher de vide. Dans les faits, il faut d'abord assurer que le terrain de base devienne plus grand que les dimensions de l'écran (par exemple, si on affiche 10x8 tuiles et que le terrain mesure 8x8 tuiles, il sera dupliqué afin d'obtenir un terrain de 16x8 tuiles). La répétition infinie du terrain n'est quant à elle qu'une adaptation de la dernière fonction présentée dans "Génération du terrain (Quadtree)".
Zoom / dézoom : Cette extension permet de zoomer et dézoomer sur l'écran (en pratique, changer le nombre de tuiles affichées) par appui sur des touches du clavier. Le zoom réduit l'écran jusqu'à afficher 3x3 tuiles, quant le dézoom va jusqu'à afficher le terrain complet ou du 50x50 tuiles, selon ce qui arrive en premier.
Illustration du zoom
Ces extensions ont permis d'améliorer significativement l'expérience de jeu en rendant le déplacement plus réaliste et en offrant une meilleure immersion grâce à la gestion de la caméra et du zoom. De plus, chaque fonction a été clairement documentée.
Résultats et livrables
Le projet a abouti à la création d'un système de génération de terrain optimisé, ainsi qu'à plusieurs extensions pour améliorer l'expérience utilisateur. En plus des extensions que j'ai développées, mon colègue a ajouté la possibilité de générer un terrain aléatoire aux dimensions souhaitées et de le sauvergarder dans un fichier, l'animation des tuiles pour un rendu plus vivant, ainsi que la possibilité de poser 2 téléporteurs (se superposant sur la tuile) et de se déplacer de l'un à l'autre. Chaque fonction de la partie "Génération du terrain (Quadtree)" a été testée et validée, et tout a été commenté au mieux. Enfin, les cas particuliers et exceptions ont été pris en compte pour assurer la robustesse du système.
Par le biais d'une release GitLab, le code entier a été rendu pour évaluation. La license GPLv3 du projet autorisant son partage, le code est disponible ici avec les consignes là. Ma part du travail m'a valu la note de 18/20.
Compétences développées
Ce projet m'a clairement permis de m'améliorer en programmation Go, pour commencer quelque part. J'ai également renforcé mes compétences en algorithmique avec l'implémentation du Quadtree, en qualité de développement de part les tests et la gestion des erreurs et cas exceptionnels (fichier vide, monde entièrement constitué d'eau, etc.), en gestion de projet grâce à la collaboration avec mon collègue et la documentation, en conceptualisation ("Comment implémenter cette extension ?"), et plus simplement en communication professionnelle quant au fait d'expliquer clairement des concepts abstraits et de s'entraider quand on bloquait sur nos extensions respectives.
Bilan
En conclusion, ce projet a été une expérience enrichissante que j'ai particulièrement appréciée. Le challenge de trouver comment implémenter les extensions (pour la terre ronde, j'étais parti sur une mauvaise idée pendant 27 heures avant de finalement trouver une solution viable), le plaisir de voir des tests passer sans erreur et le système s'agrémenter au fil du temps, l'idée stimulante de nous donner une base à comprendre puis améliorer, ... Si le Projet "Qui Est-ce ?" est mon favori du deuxième semestre, ce projet quadtree est assurément mon projet favori du premier semestre et je suis certain que j'ai gagné beaucoup en compétences et en confiance en le menant à bien.