Exercices UML et Java

Durée2h15

Contexte

Le travail de cette séance sera en deux parties distinctes : une partie conception UML puis une partie programmation Java.

Diagrammes UML

L’objectif de cet exercice est de concevoir un modèle objet pour un nouveau site d’enchères dont voici le cahier des charges :

Vous devez créer un nouveau site d’enchères nommé EAsta. Ce site se limite à mettre en relation les vendeurs et les enchérisseurs, sans gérer les paiements. Un simple visiteur peut uniquement s’inscrire en fournissant un numéro de téléphone valide ; un mot de passe d’authentification lui est ensuite envoyé par SMS. Une fois inscrits et authentifiés, les utilisateurs peuvent créer une vente en fournissant une description du produit, un prix de départ et un horaire de fin d’enchères. Ils peuvent également consulter les ventes en cours et enchérir sur les ventes qui l’intéressent. Tout utilisateur ayant enchéri sur un produit recevra une notification par SMS à chaque nouvelle enchère sur ce produit.

Exercice 1 (Diagramme de classe)

Créer un diagramme de classes simplifié (sans les méthodes) représentant une modélisation possible pour le site EAsta.

Correction

Exercice 2 (Diagramme de séquence)

Créer un diagramme de séquence pour le service encherir(u:utilisateur, m:double, v:vente), illustrant le processus par lequel un utilisateur u ajoute une enchère d’un montant m sur une vente v. NB : l’interface du système assure que l’enchère a bien lieu avant la fin de la vente v et que le montant est strictement supérieur à la plus haute enchère actuelle pour la vente v ; il n’est donc pas nécessaire de vérifier ces conditions dans la méthode de service encherir.

Correction

Petite architecture logicielle en Java

Contexte

Cet exercice vous permettra de consolider vos connaissances en matière d’interfaces et de manipulation de listes en implémentant une variante du jeu « Rush Hour » https://en.wikipedia.org/wiki/Rush_Hour_(puzzle).

Décompressez l’archive fournie ici sur votre disque local puis ouvrez le dossier obtenu dans VS Code à partir du menu File>>Add Folder to Workspace....

Le jeu

Le but du jeu est de faire sortir une voiture rouge coincée dans un embouteillage en bougeant les différents véhicules. Chaque véhicule ne peut qu’avancer ou reculer et doit rester en contact avec le sol (on ne peut pas sauter par-dessus un autre véhicule). Le jeu officiel est composé de voitures, chacune occupant 2 cases, et de 4 camions occupant chacun 3 cases. Les véhicules possèdent tous une couleur différente et une inscription (X pour la voiture rouge ci-contre). Dans notre version, les véhicules peuvent occuper 2, 3 ou 4 cases. Dans le jeu officiel, 40 cartes illustrant un embouteillage sont fournies avec à leur dos une solution (exemple ci-dessous). Elles n’impliquent pas toutes le même nombre de véhicules. Dans notre version, l’aire de jeu n’est pas forcément un carré de 6x6, la sortie peut être placée n’importe où sur le contour de l’aire de jeu (mais toujours en face de la voiture rouge bien sûr) et les inscriptions désignant les véhicules ne se limitent pas forcément à un unique caractère.

Les cartes fournies

Trois cartes vous sont données : les fichiers 01.TXT, 02.TXT et 03.TXT. Dans ces fichiers, on retrouve dans l’ordre les informations suivantes : le nombre de colonnes du plateau ; le nombre de lignes du plateau ; l’index de la colonne dans laquelle figure la sortie ; l’index de la ligne dans laquelle figure la sortie ; le nombre de véhicules. Puis, pour chaque véhicule : le nombre de cases occupées par le véhicule (donc sa longueur) ; l’orientation du véhicule (un booléen qui vaudra soit IVehicule.HORIZONTALE, soit IVehicule.VERTICALE) ; l’index de la plus petite colonne occupée par le véhicule ; l’index de la plus petite ligne occupée par le véhicule ; la couleur du véhicule (un entier) ; le nom du véhicule (une chaine de caractères).

C’est à partir de ces informations que la classe Starter crée les objets nécessaires au jeu. Notez que les positions dans l’aire de jeu vont de (0, 0) (la case la plus en haut à gauche du plateau) à (largeur-1, hauteur-1) (la case la plus en bas à droite du plateau) où largeur et hauteur désignent les dimensions du plateau.

La modélisation

La partie graphique et sonore du jeu est déjà réalisée. Le terme « interface » prend ici tout son sens car les contrats IVehicule et IPlateau sont à la jonction entre la partie fournie et la partie du code que vous devez réaliser. Si vous fournissez des implémentations de ces deux interfaces alors le jeu sera complet et fonctionnel. Le diagramme de classes ci-dessous correspond à la première modélisation retenue :

Un plateau est composé entre autres d’une liste de véhicules et de la case de sortie. Chaque véhicule a une position (la case la plus en haut à gauche qu’il occupe) ainsi qu’une longueur, une orientation, une couleur et une inscription.

Dans le package rushhour (répertoire src/rushhour) vous trouverez :

  • Un package presentation qui contient des classes utiles à l’interface graphique et à l’émission de sons ainsi que la classe Starter qui contient la méthode principale du jeu.
  • Un package abstraction qui contient :
    • Une classe Case, très basique et complète.
    • Les interfaces IVehicule et IPlateau qui décrivent les méthodes à implémenter par vos classes Vehicule et Plateau afin de rendre le jeu opérationnel.

Les véhicules

Complétez la classe Vehicule afin qu’elle implémente l’interface IVehicule. Notez la présence d’un constructeur Vehicule(int longueur, boolean orientation, Case hautGauche, int couleur, String inscription) que vous devez compléter.

  • Le diagramme de classes ci-dessus vous permet de déterminer les variables d’instance à déclarer.
  • List est l’interface correspondant aux listes en Java (javadoc API JDK21). Les classes LinkedList et ArrayList du package java.util sont deux implémentations de cette interface. Pour la méthode getCases() vous pouvez donc soit créer une LinkedList<Case>, soit une ArrayList<Case> car toutes deux sont du type List<Case>. Vous aurez à déterminer les coordonnées des cases occupées par le véhicule et créer des instances de Case avec ces coordonnées.
  • Testez en exécutant la méthode main de la classe Testeur du package par défaut (répertoire src). Vous devez obtenir 100% aux tests 01 à 04.

Le plateau

Complétez la classe Plateau afin qu’elle implémente l’interface IPlateau. Notez la présence d’un constructeur Plateau(int largeur, int hauteur, Case sortie, List<IVehicule> vehicules) que vous devez compléter.

  • Testez en exécutant la méthode main de la classe Testeur du package par défaut. Vous devez obtenir 100% aux tests 05 à 09.
  • Décommentez les deux lignes commentées de la classe Starter du package rushhour.presentation puis jouez en exécutant la méthode main de la classe Starter. Le jeu devrait être pleinement fonctionnel : au lancement le jeu vous demande le nom du fichier correspondant à la carte (répondez 01.TXT, 02.TXT ou 03.TXT) avant d’afficher l’interface graphique qui vous permettra de jouer. Pour déplacer un véhicule, enfoncez le bouton de la souris sur une partie d’un véhicule, déplacez la souris sur la case que cette partie doit occuper et relâchez le bouton.
Correction

Pour aller plus loin

Une autre implémentation de IVehicule

Afin de souligner l’aspect modulaire, nous souhaitons réaliser la classe VehiculeCases implémentant IVehicule en s’appuyant sur la liste des cases occupées par le véhicule (de la case occupée la plus en haut à gauche à celle la plus en bas à droite). La nouvelle version du diagramme de classes est présentée ci-dessous. VehiculeCases mémorise également la couleur et l’inscription. Mais les autres caractéristiques (position, longueur et orientation) peuvent être calculées à partir de la liste des cases occupées.

  • Complétez la classe VehiculeCases afin qu’elle implémente l’interface IVehicule en se basant sur la représentation décrite ci-dessus. Vous devez implémenter le constructeur VehiculeCases(int longueur, boolean orientation, Case hautGauche, int couleur, String inscription).
  • Testez en exécutant la méthode main de la classe Testeur du package par défaut. Vous devez obtenir 100% aux tests 10 à 13.
  • Modifiez le constructeur de la classe Starter de sorte qu’il crée des instances de VehiculeCases au lieu d’instances de Vehicule. Testez en exécutant la méthode main de Starter.
Correction