The Dialog Game
Introduction
TheDialogGame est un jeu d'aventure textuel développé en Java dans le cadre d'un exercice académique de première année à la HEIG-VD. Ce qui devait être un simple TP s'est transformé en projet personnel ambitieux : ma curiosité et mon envie d'aller plus loin m'ont poussé à construire une architecture bien au-delà des exigences initiales.
Le joueur explore une carte inspirée de l'univers manga, débloque de nouvelles zones en résolvant des énigmes, collecte des objets et progresse à travers une narration interactive. Derrière ce gameplay se cache une infrastructure technique solide, pensée pour être modulaire et extensible.
Date
Avril 2024
Domaine
Design Patterns, Java OOP, CLI Game Development

Le projet
L'architecture repose sur une séparation claire des responsabilités. Le package Base contient le cœur du jeu : la classe Game orchestre l'initialisation, World gère la carte sous forme de grille 2D avec un HashMap pour l'accès rapide aux locations, Player encapsule l'état du joueur, et Inventory contrôle la gestion des objets avec une capacité limitée.
Le système de commandes suit le pattern Command avec une interface ICommand définissant le contrat (getName, getUsage, getDescription, execute, hasValidArgs). Le CommandRegistery centralise toutes les commandes dans un HashMap, permettant d'en ajouter ou retirer dynamiquement pendant le jeu. C'est d'ailleurs ce qui permet de débloquer la commande goto comme récompense d'un coffre.
Les items exploitent pleinement le polymorphisme. La classe abstraite Item définit la base, puis chaque type (Letter, Key, Chest, Enigm) implémente les interfaces nécessaires : ITakeable pour les objets ramassables, IReadable pour les lettres, IOpenable pour les coffres, ISolvable pour les énigmes. Cette approche permet d'ajouter facilement de nouveaux types d'objets sans modifier le code existant.
Le système d'énigmes illustre bien cette flexibilité. Résoudre une énigme déclenche une méthode giveReward() qui peut faire apparaître de nouveaux items, débloquer des zones, ou même ajouter de nouvelles commandes au jeu. L'énigme de Kiri débloque une clé dans la région et fait apparaître une nouvelle énigme à Loguetown.
Le pattern Singleton est utilisé stratégiquement sur les classes qui ne doivent exister qu'en une seule instance : Game, World, Player, Inventory, et toutes les commandes. Cela garantit une cohérence d'état dans tout le programme et un accès global simplifié.


Ce qu'il m'as apporté
Ce projet a été mon premier vrai terrain de jeu pour appliquer les concepts de programmation orientée objet. Au-delà de la théorie vue en cours, j'ai pu expérimenter concrètement l'encapsulation, l'héritage et le polymorphisme dans un contexte où ces concepts avaient un sens pratique immédiat.
La découverte des design patterns a été une révélation. Le pattern Singleton pour gérer l'état global, le pattern Command pour découpler l'invocation des actions de leur implémentation, et l'utilisation d'interfaces pour définir des comportements composables m'ont montré qu'il existe des solutions élégantes à des problèmes récurrents en développement logiciel.
J'ai compris l'importance de penser l'architecture avant de coder. La structure modulaire que j'ai mise en place permet d'ajouter de nouvelles commandes, de nouveaux types d'items ou de nouvelles zones sans toucher au code existant. C'est le principe Open/Closed en action, même si je ne connaissais pas encore ce terme à l'époque.
Ce projet m'a aussi appris à aller au-delà des exigences. Le TP initial demandait bien moins, mais ma curiosité m'a poussé à explorer, à refactoriser, à améliorer. Cette démarche d'approfondissement personnel est devenue une habitude qui m'accompagne encore aujourd'hui dans tous mes projets.
Enfin, TheDialogGame représente ma première vraie expérience de création logicielle de A à Z. Du game design à l'architecture technique, en passant par l'implémentation et les tests manuels, j'ai touché à toutes les facettes du développement. Une base solide qui m'a donné confiance pour attaquer des projets plus ambitieux par la suite.
