Licence CC BY-NC-SA

TP : le pendu

Ce contenu est obsolète. Il peut contenir des informations intéressantes mais soyez prudent avec celles-ci.

Ce TP est sûrement le plus difficile que vous aurez à réaliser ! Il fait appel à beaucoup d'éléments vus précédemment. Nous allons devoir réaliser un jeu de pendu. Le principe est classique : vous devez trouver un mot secret lettre par lettre en faisant un minimum d'erreurs.

Nous en profiterons pour utiliser des design patterns, ces fameuses bonnes pratiques de programmation.

Cahier des charges

Vous devez réaliser un jeu du pendu en Java gérant la sauvegarde des dix meilleurs scores. Toutefois, j'ai des exigences précises :

  • l'application doit contenir les menus Nouveau, Scores, Règles et À propos ;
  • une page d'accueil doit être mise en place ;
  • les points doivent être cumulés en tenant compte des mots trouvés et des erreurs commises ;
  • il faut vérifier si le joueur est dans le top dix, auquel cas on lui demande son pseudo, on enregistre les données et on le redirige vers la page des scores ;
  • si le joueur n'a pas assez de points, on le redirige vers la page d'accueil ;
  • il faut essayer d'utiliser le pattern observer.

Les règles du jeu sont représentées en figure suivante.

Écran principal et règles du jeu

Vous pouvez voir les écrans que j'ai obtenus à la figure suivante.

Captures d'écran du jeu

Je vous fournis également les images que j'ai utilisées pour réaliser ce pendu.

Télécharger les images

Vous aurez besoin d'un « fichier dictionnaire » contenant de nombreux mots pour votre jeu :

Télécharger les fichiers

Il me reste encore quelques recommandations à vous prodiguer…

Prérequis

Vous devrez utiliser les flux afin de parcourir le fichier texte qui contient plus de 336 000 lignes : il faudra donc choisir un nombre aléatoire entre 0 et 336 529, puis récupérer le mot désigné. Pour obtenir un nombre aléatoire entre 0 et 336 529, j'ai codé ceci :

1
int nbre = (int)(Math.random()*336529);

Afin de récupérer les mots ligne par ligne, j'ai utilisé un LineNumberReader : puisque cet objet retourne le numéro de la ligne en invoquant la méthode getLineNumber(), il était tout indiqué ! Il y a aussi un point qui peut vous poser problème : la mise à jour du JPanel. Pour ma part, j'ai choisi la technique suivante : tout retirer du conteneur grâce à la méthode removeAll(), replacer des composants puis invoquer la méthode revalidate() afin de modifier l'affichage.

Il faudra également que vous pensiez à gérer les caractères accentués, lorsque vous cliquerez sur le bouton « E » par exemple. Vous devrez donc aussi afficher les lettres « E » accentuées.

Je ne vais pas tout vous dévoiler, il serait dommage de gâcher le plaisir. En revanche, j'insiste sur le fait que c'est un TP difficile, et qu'il vous faudra certainement plusieurs heures avant d'en venir à bout. Prenez donc le temps de déterminer les problèmes, réfléchissez bien et codez proprement !

Je vous conseille vivement d'aller relire les chapitres traitant des design patterns, car j'en ai utilisé ici ; de plus, j'ai rangé mes classes en packages.

Allez, en avant !

Correction

Une fois n'est pas coutume, je ne vais pas inscrire ici tous les codes source, mais plutôt vous fournir tout mon projet Eclipse contenant un .jar exécutable ; et pour cause, il contient beaucoup de classes, comme vous le pouvez le voir à la figure suivante.

Récupérer le projet

Classes du TP

Voici donc une astuce d'Eclipse permettant de rapatrier un projet.

Une fois Eclipse ouvert, effectuez un clic droit dans la zone où se trouvent vos projets, puis cliquez sur Import et choisissez Existing project dans General (voir figure suivante).

Importer un projet existant dans Eclipse

Il ne vous reste plus qu'à spécifier l'endroit où vous avez décompressé l'archive .jar que je vous ai fournie, et le tour est joué.

Une fois l'archive décompressée, vous devriez pouvoir lancer le fichier .jar par un double-clic. Si rien ne se produit, mettez à jour vos variables d'environnement (voir le premier chapitre).

Prenez bien le temps de lire et comprendre le code. Si vous n'arrivez pas à tout faire maintenant, essayez de commencer par réaliser les choses les plus simples, vous pourrez toujours améliorer votre travail plus tard lorsque vous vous sentirez plus à l'aise !

Vous pourrez constater que j'ai rangé mon code d'une façon assez étrange, avec un package com.sdz.model et un com.sdz.vue… Cette façon de procéder correspond à un autre pattern de conception permettant de séparer le code en couches capables d'interagir entre elles : c'est le sujet du chapitre suivant.