Checklist itération 2 (non-officielle)
Attention cette checklist n'est pas officielle, elle est seulement basée sur le PDF de l'itération 2 et général. Pour la checklist officielle cliquez ici
Contraintes générales
- La structure des fichiers corresponds à celle montrée dans le PDF
- Le projet utilise la version 11 de Java et intègre l'interface graphique Swing
- Le projet est compatible avec la version d'Eclipse de référence (voir ressources informatiques sur Learn)
- Les tests unitaires sont effectués à l'aide de JUnit5
- Le projet utilise le plug-in PMD avec le ruleset donné sur Learn
Acquis d'apprentissages
- Respect des principes de la programmation orientée objet
- Les comportements du programme sont testé à l'aide de tests unitaires
- Le programme est bien documenté à l'aide de la JavaDoc (et calcul de la CTT si demandée)
- Les utilisations des interfaces de collections et de ses implémentations sont justifiées
Réponse feedback
- Faire une copie défensive de
getCoordinates()
(par exemple à l'aide deCollections.unmodifiableSet(Set)
) - Passer la case active dans Game plus tot que Player
- Potentiellement faire passer les messages de statistiques sur le jeu dans Game plus tot que superviseur
- Rendre toutes les classes
final
pour empécher d'en hériter - Supprimer toutes les définitions de
equals
ethashcode
quand ce n'est pas nécessaire (par exemple Player) - Faire en sorte que MainMenuSuperviser crée le jeu et que PlayGame le récupère
- Rendre la classe Coordinate plus intelligente pour Player.move(deltaX, deltaY)
- Expliquer le
+
dans le calcul de la CTT du placement des trésors dans CaseMap
Fonctionalités
AI-4 : Changer de case active
En tant que Joueur, je souhaite changer de case active pour poursuivre mon exploration. Détails
- Appuyer une touche fléchée déplace la case active.
- Changer de case active met à jour le type et le cout de la case active affichée.
- A priori, le joueur peut se déplacer hors des limites de la carte. On peut voir une case hors des limites d’une carte comme une case de type Eau
Tests d'acceptation
Les tests d’acceptation partent de la Carte 1. On suppose que la case active de départ est celle du centre (encadrée en rouge). Attention, nous pouvons jouer les tests d’acceptation sur d’autres cartes.
- Etant donnée une partie démarrée avec la carte donnée en exemple, quand j’appuie sur la flèche du haut, alors le sélecteur se déplace sur la case (0,1) de type Sable et de cout 1.
- Etant donnée une partie démarrée avec la carte donnée en exemple et la case active placée sur la case (0,1), quand j’appuie sur la flèche du bas puis sur la flèche de droite, alors le sélecteur est sur la case (1,2) de type Prairie et de cout 2.
- Etant donnée une partie démarrée avec la carte donnée en exemple et la case active placée sur la case (1,2), quand j’appuie sur la flèche de bas, alors le sélecteur se déplace sur la case (2, 2) de type Eau et de cout 0.
AI-5 : Creuser une case
En tant que joueur, je souhaite creuser la case active afin de trouver des trésors
- Si cette case est de type Eau, rien ne se passe.
- Si cette case est de type autre que Eau et sans trésor, l’application affiche le sprite « Dug ».
- Si cette case possède un trésor, l’application affiche le sprite « Treasure ».
- Si cette case ne possède pas de trésor, la bourse du joueur est diminuée du cout de la case.
- Si cette case possède un trésor, la bourse du joueur est diminuée du cout de la case et augmentée de la valeur du trésor découvert.
- Si cette case possède un trésor, le nombre de trésor à trouver est diminué de 1.
- Si le joueur tente de creuser alors qu’il est en dehors de la carte, rien ne se passe : en particulier il n’y a pas de messages d’erreur remontés par l’application.
Tests d’acceptation
Les tests d’acceptation partent de la Carte 1. On suppose que le seul trésor se trouve en case (1,2). Attention, nous pouvons jouer les tests d’acceptation sur d’autres cartes.
- Soit une partie démarrée dont la case active est (0,0), quand j’essaie de la creuser, rien ne se passe.
- Soit une partie démarrée dont la case active est (0,1), quand je la creuse, alors l’application retire 1 pièce de ma bourse.
- Soit une partie démarrée dont la case active est (0,1) et est déjà creusée, quand je la creuse, rien ne se passe.
- Soit une partie démarrée dont la case active est (1,2), quand je la creuse, alors ma bourse perd 2 pièces et reçoit autant de pièces qu’en compte le trésor.
- Soit une partie démarrée dont la case active est (1, 0), quand je la creuse, alors rien se passe.
AI-6 : Fournir des indices
En tant que Joueur, quand je creuse une case, je souhaite avoir un indice sur le trésor le plus proche afin de trouver des trésors
Une case peut contenir un indice sur le trésor le plus proche prenant la forme d’une flèche.
- La flèche d’une case indique la direction du trésor le plus proche.
- Un trésor peut être le plus proche de toutes les cases situées dans un carré de 5 cases de côté et centré sur le trésor.
- Il y a 8 directions possibles : O, NO, N, NE, E, SE, S, SO.
- Seules les cases creusables sans trésor peuvent contenir un indice.
- Quand une case C se trouve à égale distance de deux trésors, l’application choisit celui de plus grande valeur. Quand une case C se trouve à égale distance de deux trésors de même valeur, on privilégie celui dont la position est la plus proche du coin supérieur gauche.
- La distance entre deux cases c1 = (row1 ; col1) et c2 = (row2 ; col2) vaut $\sqrt{(row1 - row2)^2 + (col1-col2)^2}$
- Les indices ne sont pas modifiés en cours de partie, ce qui implique qu’ils peuvent être tous calculés au début de la partie.
Tests d’acceptation
Nous partons de la Carte 2 pour décrire les tests d’acceptation. Les trésors y sont prédisposés avec les valeurs entre parenthèses. Attention, nous pouvons jouer les tests d’acceptation sur d’autres cartes.
- Étant donnée une partie démarrée avec la Carte 2, quand je creuse la case (4, 4), je découvre une flèche orientée vers le bas.
- Étant donnée une partie démarrée avec la Carte 2, quand je creuse la case (3, 5), je découvre une flèche orientée vers le Sud-Ouest.
- Étant donnée une partie démarrée avec la Carte 2, quand je creuse la case (3, 1), je découvre une flèche orientée vers le Nord-Ouest.
- Étant donnée une partie démarrée avec la Carte 2, quand je creuse la case (8, 0), je ne découvre ni indice, ni trésor.
Phase de conception et problèmes à résoudre
Diagramme de conception générale
- Les Candidats et les Responsabilités ont été identifiées
- Les cartes CRC et les liens entre elles ont été faites
- Le diagramme de séquence/collaboration a été créé
- Le diagramme de classe a été fait
Controller le placement des trésors pour les tests
- Déclarer une interface pour remplacer
Math.random
,Random
et/ouCollections.shuffle()
- Implémenter cette interface en faisant appel à la/les méthodes ci-dessus
- Remplacer les dépendances à la méthode de bsae dans le code par l'interface
- Injecter la dépendence (ajouter l'objet implémentant l'interface dans le constructeur des classes qui ont besoin d'aléatoire)
- Implémenter cette interface pour les tests (elle peut par exemple retourner une collection de coordonnées fournies lors de la construction de l'objet)
- Utiliser cette implémnetation pour les tests
Gestion des indices
TODO
Questions supplémentaires d'algo et de POO
Questions algorithmiques
- Ecrire les post-conditions qui seront vérifiées par le montant ajouté à la bourse du joueur (gain minimum d'un creusage et gain maximum d'un creusage) dans la javadoc de
PlayGameSuperviser.onDig()
- Indiquer la CTT du calcul des indices à affecter aux cases creusables dans la javadoc en entête de TreasureQuestGame (Pour répondre à cette question, examinez la partie de votre code concernée, et identifiez les boucles, les imbrications, mais aussi les collections utilisées et leurs opérations ou les appels de sous-méthodes ou de méthodes d’autres objets. Quand vous répondez, n’oubliez pas d’indiquer à quoi correspondent vos libellés N,M, etc)
- Indiquer dans l'entête de la classe
TreasureQuestGame
quelle interface de collection a été utilisée pour représenter les coordonnées environantes (Justifiez votre choix en identifiant les principales opérations dont vous aurez besoin au cours de cette itération ? Avez-vous notamment besoin d’accéder à un élément précis ? Si oui, sur base de quelle sorte de clé ?) - Indiquer dans l'entête de la classe
TreasureQuestGame
quelle implémentation de collection a été utilisée pour représenter ces coordonnées (justifier votre choix en déterminant les CTT des principales opérations pour l'itération 2)
Questions POO
- Les classes sont dans
treasurequest.domains
et n'ont pas de lien avec les vues (tout ce qui pourrait être en dehors dedomains
) - L'encapsulation (attributs private) et les copies défencives sont bien effectuées sur toutes les classes du domains
- Ecrire des méthodes courtes et peu complexes (et tenter de respecter la règle de Demeter)
- Ecrire des classes timides (c'est à dire qui font le boulot et qui ne nécessite pas de tout le temps leur demander des choses depuis d'autres classes)
- Bon usage du polymorphisme
- Bonne utilisation des interfaces
- Aucune alerte PMD
- Tests unitaires JUnit5 dans le dossier
tests
qui donne un coverage d'au moins 90% sur chaque classe du domains (pour un degré de maitrise supplémentaire → coverage de 100% de ces classes)