IMAC DIGGER

Projet d'algorithmique et d'image
Programmation et algorithmique C++ - Synthèse d'Image I
- IMAC 1 - 2024-2025 -
Nombre de personnes par projet : 2 ou 3
Annonce du sujet : 29 avril 2025
Date de rendu : 05 juin 2025 (au plus tard 23h59)
Soutenance : vendredi matin 06 juin 2025
Introduction
Pour mettre en pratique les connaissances acquises en programmation et en synthèse d'images vous allez devoir réaliser un projet sous la forme d'un jeu vidéo. Ce projet est commun aux matières Programmation et algorithmique C++ et Synthèse d'images I.
Dans ce projet vous devez réaliser un jeu vidéo inspiré de Mr. Do!, Digger ou encore Pacman dans lequel votre but est de vous déplacer dans un niveau pour collecter des objets tout en évitant des ennemis.
Voilà deux exemples de jeux de ce type :

Visuel du jeu diamond-digger; source: itch.io
Cahier des charges
Voici les indications que vous devez respecter pour ce projet. Néanmoins, si vous souhaitez modifier certains points, vous devez au préalable nous demander et faire valider ces changements.
Projet
Structure du projet : Vous devez organiser votre code en fichiers et dossiers séparés. Nous recommandons l'utilisation d'un système de compilation CMake pour la compilation.
Synthèse d'images : Vous devez afficher les éléments du jeu (carte, ennemis) en utilisant des sprites (textures) et la bibliothèque OpenGL.
Gestion de Projet: Vous devez utiliser Git pour stocker/partager votre code et nous le rendre.
Compilation: Un système de compilation CMake devra être intégré à votre projet, d'autant que vous aurez à utiliser des bibliothèques (OpenGL, lecture d'images, ...). Votre projet devra contenir tout ce qui permet de le compiler et fonctionner sur Linux ou Windows (plateforme de développement à préciser dans le rapport). Si développement sur macOS, pensez à tester votre programme sur une autre machine afin que l'on puisse le compiler sur Linux ou Windows afin de le tester.
Le projet est à faire par binôme ou trinôme. Les trinômes devront obligatoirement réaliser une fonctionnalité supplémentaire par rapport aux binômes. Si vous choisissez une amélioration qui n'est pas dans la liste des améliorations suggérées, vous devrez nous en faire part pour la faire valider.
Thème du jeu
Vous n'êtes pas obligé de respecter le thème du jeu (un mineur qui cherche des gemmes) mais vous devez respecter les spécifications du projet. Vous êtes libres de choisir un autre thème, exemple :
- Un pirate qui cherche des trésors (au milieu des squelettes).
- Un explorateur qui cherche des artefacts (au milieu des momies).
- Un voleur qui cherche des objets de valeur (au milieu des gardes).
- Un astronaute qui cherche des cristaux (au milieu des aliens).
- Une sorcière qui cherche des ingrédients (au milieu des monstres).
Rapport
Il contiendra une description des fonctionnalités implémentées (règles du jeu, etc), un guide succinct d'utilisation, et des captures d'écran.
Éventuellement, si vous souhaitez mettre en avant un bout de code pour sa performance ou parce qu’il s’agit d’une idée intéressante, vous pouvez l'intégrer dans le rapport (mais rester succinct).
Ajoutez enfin une partie "Post mortem" pour analyser le travail fourni, qu'est ce qui a bien fonctionné, quels ont été les problèmes rencontrés, comment vous les avez surmontés, auriez-vous fait différemment ? Avec plus de temps, qu'est ce que vous pourriez ajouter ?
Ne nous faites pas des romans, vous pouvez faire court, par exemple 2 à 4 pages sans les illustrations.
Notation
Ce projet est commun aux matières : Programmation et algorithmique C++ et Synthèse d'images I. Il y aura une base commune puis une note distinctive pour chaque matière.
Exemple: note commune: 8, note algo: 6, note SI: 5 = note finale algo 14, note finale SI 13
Structure de votre programme
Dans ce projet complexe, il est hors de question de n'utiliser qu'un seul fichier. Il vous faut donc séparer l'application en différents fichiers .cpp et .hpp. La découpe des fichiers est laissée à votre appréciation mais doit être logique. Globalement, le projet étant scindé en deux parties, il serait logique que la partition des fichiers en tienne compte.
Un système de compilation CMake devra être intégré à votre projet, d'autant que vous aurez à utiliser des bibliothèques (OpenGL, lecture d'images, ...).
Note importante : Tout rendu de projet sans possibilité de le compiler sur Linux ou Windows entraînera un 0 ! (sauf si vous avez une raison valable et que vous avez prévenu vos enseignants).
Votre projet devra être organisé à minima dans un répertoire suivant la structure suivante :
NomDuProjet/
\-- src/
\-- lib/
\-- images/
\-- CMakeLists.txt
\-- README.md
\-- .gitignore
- Le répertoire
src
contient les fichiers sources .cpp et .hpp (Vous avez la liberté de placer plutôt les fichiers d'entête .hpp dans un répertoireinclude
si vous préférez ce type de structure de projet mais vous devrez alors adapter votre CMakeLists.txt). - (Optionnel) Le répertoire
lib
contiendra les fichiers de vos bibliothèques ainsi que tout le nécessaire pour les compiler ou les inclure dans votre projet (Vous pouvez également utiliser des fetch Cmake pour inclure des librairies). - Le répertoire
images
contient toutes les images du projet (sprite, ...). - Le répertoire
doc
contiendra toute la documentation, dont votre rapport. - Enfin, un CMakeLists.txt permettant de compiler le projet.
- (Optionnel) un répertoire
bin
dans lequel sera exporté l'exécutable compilé du projet (le fichier exécutable ne doit pas être inclus dans le dépôt git). - Un fichier README.md contenant les instructions pour compiler et exécuter le projet. Votre rapport de projet peut être intégré à ce fichier ou dans un fichier séparé (ex: doc/rapport.pdf).
- Tout dossier temporaire
build
(utilisé par CMake par exemple) ou exécutable (.exe) ne devra pas être inclus sur git (.gitignore) sous peine de pénalité.
Carte
Pour ce projet nous allons utiliser une carte à base de cases (tile-based). C'est à dire que la carte est segmentée de cases de même taille. Il devra y avoir différents types de cases:
- Bloc vide: case vide, sans objet ni ennemi ou le joueur peut se déplacer librement.
- Bloc plein: case pleine, le joueur ne peut pas se déplacer dessus mais peut détruire cette case (ex: un bloc de terre).
- Objet: case contenant un objet à collecter (ex: une gemme, une pièce d'or, une pomme, ...).
- Obstacle: case pleine qui ne peut pas être détruite (ex: un mur, une pierre, ...).
- Piège: case pleine qui ne peut pas être détruite mais qui fait perdre le joueur (ex: un trou, une flamme, ...).
Ces cases sont représentées par des sprites (images) qui sont affichées à l'écran. Vous devez donc créer ou trouver des sprites pour représenter ces cases.