# Checklist itération 1 (non-officielle)

> **Attention** cette checklist n'est pas officielle, elle est seulement basée sur le PDF de l'itération 1 et général. Pour la checklist officielle cliquez [ici](https://books.snowcode.ovh/books/activite-integrative-b1/page/checklist-iteration-1-officielle)

## Contraintes générales
- [x] La structure des fichiers corresponds à celle montrée dans le PDF
- [x] Le projet utilise la version 11 de Java et intègre l'interface graphique Swing
- [x] Le projet est compatible avec la version d'Eclipse de référence (voir ressources informatiques sur Learn)
- [x] Les tests unitaires sont effectués à l'aide de JUnit5
- [x] Le projet utilise le plug-in PMD avec le ruleset donné sur Learn

## Acquis d'apprentissages
- [x] Respect des principes de la programmation orientée objet
- [x] Les comportements du programme sont testé à l'aide de tests unitaires
- [x] Le programme est bien documenté à l'aide de la JavaDoc (et calcul de la CTT si demandée)
- [x] Les utilisations des interfaces de collections et de ses implémentations sont justifiées

## Fonctionalités
### AI-1 : Créer une partie
En tant que joueur, je souhaite démarrer une nouvelle partie afin de l’afficher à l’écran

- [x] L’application démarre en affichant un menu principal composé de deux items : « Nouvelle
partie » et « Quitter »
- [x] L’activation de l’item « Nouvelle partie » débute la création d’une partie.
- [x] La création d’une partie commence par le chargement de la carte depuis le fichier
resources/maps/map-sample.txt. Nous vous fournissons à cette fin la classe
treasurequest.io.CharArrayFileReader.
- [x] Une fois la carte chargée, l’application y place des trésors sur les cases creusables. Une case
est creusable si elle n’est pas de type Eau.
- [x] Le nombre de trésors à placer correspond à 10% du nombre de cases creusables, avec au
moins 1 trésor à trouver.
- [x] La valeur d’un trésor est un nombre aléatoire allant de 10 à 20 pièces.
- [x] Toutes les cases sont non-creusées.
- [x] Une case active est désignée. Elle correspond à une case du centre de la carte.
- [x] Le joueur possède une bourse correspondant à 2 fois le nombre de trésors. Cette bourse est
exprimée en pièces (s’il y 20 trésors à placer, la bourse de départ du joueur sera de 40
pièces).

#### Tests d'intégration
- [x] Quand je lance l’application, celle-ci me présente le menu principal composé de deux items
« Nouvelle partie » et « Quitter »
- [x] Quand je sélectionne l’item « Quitter », l’application termine son exécution.
- [x] Quand je sélectionne l’item « Nouvelle partie », l’application change d’écran


### AI-2 : Voir une partie
En tant que joueur, je souhaite voir l’état d’une partie afin de décider des actions à entreprendre

- [x] Une seconde vue présente l’état de la partie.
- [x] Une carte montre les cases. En début de partie, aucune case n’est creusée.
- [x] La case active de départ est au « centre » de la carte.
- [x] Un panneau affiche la bourse du joueur, le nombre de trésors à trouver et le cout à payer
pour creuser la case active.
- [x] Creuser une case Sable coute 1 pièce. Le cout des autres types de cases est déduit de cette
valeur.

#### Tests d’acceptation
Important : pour les tests d’acceptation, nous utiliserons des cartes autres que celles fournies.
- [x] Quand je lance une nouvelle partie, l’application me présente la carte donnée dans
l’exemple.
- [x] Quand je lance une nouvelle partie, la case active est celle au « centre » de la carte
- [x] Quand je lance une nouvelle partie, l’application me dit qu’il y a XX trésors à trouver, que le
joueur à une bourse de 2*XX
- [x] Quand je lance une nouvelle partie, l’application m’affiche le cout correct de la case active

### AI-3 : Revenir au menu principal
En tant que joueur, je peux abandonner une partie et revenir au menu principal, afin d’en relancer
une nouvelle.

- [x] Appuyer sur la touche « Esc » quand une partie est en cours permet de revenir à l’écran
principal.
- [x] Demander une nouvelle partie relance la création d’une nouvelle partie. En particulier, le
rechargement de la carte.

#### Tests d’acceptation
- [x] Soit une partie lancée avec une case creusée, quand je reviens au menu principal et que je
relance une nouvelle partie, le jeu revient à son état de départ.
- [x] Soit une partie lancée, quand je change le fichier à charger et que je reviens au menu
principal, alors l’application présente la carte du nouveau fichier

## Phase de conception et problèmes à résoudre
### Diagramme de conception générale
- [x] Les Candidats et les Responsabilités ont été identifiées
- [x] Les cartes CRC et les liens entre elles ont été faites
- [x] Le diagramme de séquence/collaboration a été créé
- [x] Le diagramme de classe a été fait

### La classe de fabrique (Factory)
- [x] Une classe de fabrique (Factory) est créée dans le package `domains` comme les autres classes et sert à synchroniser le jeu sur les différents superviseurs
- [x] La classe de fabrique est passée aux superviseurs au travers d'une interface
- [x] Les superviseurs se synchronise avec la classe de fabrique dans les méthodes `onEnter`et `onLeave`
- [x] La classe de fabrique est insanciée dans `Program`et est passée au constructeur des superviseurs concernés

### La représentation de la carte de cases
- [x] Pas de tableau 2D pour preprésenter l'association des coordonnées aux cases et choisir la collection appropriée pour mémoriser la carte et les cases

## Questions supplémentaires d'algo et de POO
### Questions algorithmiques
- [x] Ecrire dans l'entête de la méthode `PlayGameSupervisor.onEnter`les post-conditions les classes `Player`, `CaseMap` et les `Case` de la carte doivent respecter après la création de la partie pour pouvoir commencer à creuser/jouer.
- [x] Indiquer dans l'entête JavaDoc de la classe `CaseMap` l'interface de collection a été utliisée pour représenter la carte et justifier son choix en expliquant les différentes opérations à y effectuer 
- [x] Indiquer dans cette même JavaDoc quelle implémentation de la collection a été utilisée pour représenter la carte et justifier son choix en déterminant la CTT des principales opérations utilisées dans l'itération 1
- [x] **Indiquer la CTT du placement des trésors sur les cases creusables dans la javadoc en entête de TreasureQuestGameFactory** (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)
- [x] Les Superviseurs collabore avec la fabrique (Factory) de Game au travers d'une interface

### Questions POO
- [x] Les classes sont dans `treasurequest.domains` et n'ont pas de lien avec les vues (tout ce qui pourrait être en dehors de `domains`)
- [x] L'encapsulation (attributs private) et les copies défencives sont bien effectuées sur toutes les classes du domains
- [x] Ecrire des méthodes courtes et peu complexes (et tenter de respecter la règle de Demeter)
- [x] 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)
- [x] Bon usage du polymorphisme 
- [x] Bonne utilisation des interfaces
- [x] Aucune alerte PMD
- [x] 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)