Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
|
ens:cvda-2016:tpnote [2016/06/05 13:10] admin Cordier Amelie () [Phase 1. Prise en main du projet] |
ens:cvda-2016:tpnote [2016/07/15 08:30] (Version actuelle) |
||
|---|---|---|---|
| Ligne 72: | Ligne 72: | ||
| ==== Phase 1. Prise en main du projet | ==== Phase 1. Prise en main du projet | ||
| - | 1. Avec votre navigateur préféré, connectez-vous à Github puis faites un fork du projet **P4Magic**. | + | 1. Avec votre navigateur préféré, connectez-vous à Github puis faites un fork du projet **P4Magic** |
| - | + | ||
| - | < | + | |
| 2. Depuis votre IDE préféré, clonez le projet que vous venez de forker. | 2. Depuis votre IDE préféré, clonez le projet que vous venez de forker. | ||
| Ligne 80: | Ligne 78: | ||
| 3. Au besoin, fixez les imports. Vous pourriez être amenés à ajouter JUnit 4.12 et Harmcrest 1.3 dans Test Libraries. Si vous rencontrez des difficultés dans cette phase, n' | 3. Au besoin, fixez les imports. Vous pourriez être amenés à ajouter JUnit 4.12 et Harmcrest 1.3 dans Test Libraries. Si vous rencontrez des difficultés dans cette phase, n' | ||
| - | 4. Exécutez le programme pour le tester en mode graphique. La première fenêtre vous permet de choisir le pourcentage de cases qui seront porteuses | + | 4. Exécutez le programme pour le tester en mode graphique. La première fenêtre vous permet de choisir le pourcentage de chances qu'une case soit porteuse |
| ==== Phase 2. Découverte du code et prise en main des tests ==== | ==== Phase 2. Découverte du code et prise en main des tests ==== | ||
| + | À partir de maintenant, vous n' | ||
| - | À partir de maintenant, vous n'aurez plus besoin | + | Avant d' |
| - | l' | + | |
| - | mais le reste du TP de requiert pas son utilisation. | + | |
| - | Avant d' | + | Pour mieux comprendre |
| - | code. Rassurez-vous, vous n'avez pas besoin | + | |
| - | détails pour réaliser le TP. | + | |
| - | Pour mieux comprendre les explications qui suivent, n' | + | Le projet est implémenté en respectant l' |
| - | | + | |
| - | est implémenté en respectant l' | + | |
| - | packages : ' | + | |
| - | contenant juste la classe principale qui permet de lancer le | + | |
| - | jeu. L' | + | |
| - | tests unitaires, stockés dans un répertorie séparé. | + | |
| - | **** TODO Diagramme UML | + | |
| - | Dans le package **controller**, | + | Dans le package **controller**, |
| - | communication entre le modèle (qui contient la logique applicative du | + | |
| - | jeu, et la vue (qui contient la partie interface). | + | |
| - | Dans le package **view**, le GameView se charge de la gestion de | + | Dans le package **view**, le '' |
| - | l' | + | |
| - | Dans le package **puissance4**, | + | Dans le package **puissance4**, |
| - | jeu, ce qui se fait de la façon suivante : | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | + | ||
| - | Enfin, tous les objets du jeu se trouvent dans le package | + | |
| - | ' | + | |
| - | - ' | + | |
| - | intéressantes permettant de l' | + | |
| - | les tests), de compter le nombre de tuiles différentes sur le | + | |
| - | plateau, etc. Un plateau de jeu appartient à un objet ' | + | |
| - | fait le lien entre le plateau et les joueurs. | + | |
| - | - ' | + | |
| - | de ses pions) et un id. ' | + | |
| - | - ' | + | |
| - | propriétés principales : ' | + | |
| - | effet s' | + | |
| - | un et un seul effet), ' | + | |
| - | case. ' | + | |
| - | si elle appartient respectivement au joueur 1 ou au joueur 2. | + | |
| - | - ' | + | |
| - | dispose d'un board et propose les méthodes qui permettent de jouer | + | |
| - | un coup sur le board, de vérifier qu'il y a un gagnant, etc. | + | |
| - | - Enfin, le package ' | + | |
| - | de la façon suivante : | + | |
| - | - ' | + | |
| - | factory permet de produire des effets. Lorsque vous allez | + | |
| - | créer vos nouveaux effets, vous devrez les ajouter à la liste | + | |
| - | des effets qui peuvent être produits par la factory si vous | + | |
| - | voulez qu'ils soient utilisés dans le jeu. Le détail du | + | |
| - | fonctionnement de la factory est expliqué dans les | + | |
| - | commentaires du code. | + | |
| - | - ' | + | |
| - | devront d' | + | |
| - | - Par convention, tous les noms des classes implémentant un effet | + | |
| - | devront se terminer par **Effect**. | + | |
| + | Enfin, tous les objets du jeu se trouvent dans le package **model**. C'est sur ce package de doit porter votre attention. | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * Enfin, le package '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * Par convention, tous les noms des classes implémentant un effet devront se terminer par le mot **Effect**. | ||
| ==== Phase 3. Implémentation de votre premier effet ==== | ==== Phase 3. Implémentation de votre premier effet ==== | ||
| + | Dans la version initiale du projet cloné, un seul effet est implémenté et testé. Il s'agit de l' | ||
| - | Dans la version initiale du projet cloné, un | + | 1. Commencez par exécuter les tests contenus dans la classe |
| - | seul effet est implémenté et testé. Il s'agit de l'effet | + | |
| - | 'ChangeColorEffect'. Dans cette partie, | + | |
| - | second effet. | + | |
| - | 1. Commencez par exécuter les tests contenus dans la classe | + | <WRAP center round help 60%> |
| - | ' | + | **Q1 :** dans votre compte-rendu, |
| - | de vos tests fonctionne bien. | + | </ |
| - | Q1 : dans votre compte-rendu, | + | 2. Récupérez le code de test pour la classe |
| - | de JUnit qui s'affiche dans l'onglet "Test Results" | + | |
| - | 2. Récupérez | + | <file java DisappearEffectTest.java> |
| - | ci-dessous. | + | package model; |
| + | /** | ||
| + | * MagicP4 | ||
| + | * IUT Lyon 1 - 2016 | ||
| + | */ | ||
| + | |||
| + | |||
| + | import org.junit.After; | ||
| + | import org.junit.AfterClass; | ||
| + | import org.junit.Before; | ||
| + | import org.junit.BeforeClass; | ||
| + | import org.junit.Test; | ||
| + | import static org.junit.Assert.*; | ||
| + | |||
| + | /** | ||
| + | * Classe de tests de l' | ||
| + | * Principe de l' | ||
| + | * une case portant l' | ||
| + | * l' | ||
| + | * et le tour de jeu change | ||
| + | * | ||
| + | * @author acordier | ||
| + | */ | ||
| + | public class DisappearEffectTest { | ||
| + | |||
| + | static Game aGame; | ||
| + | |||
| + | public DisappearEffectTest() { | ||
| + | } | ||
| + | |||
| + | @BeforeClass | ||
| + | public static void setUpClass() { | ||
| + | |||
| + | } | ||
| + | |||
| + | @AfterClass | ||
| + | public static void tearDownClass() { | ||
| + | } | ||
| + | |||
| + | @Before | ||
| + | public void setUp() { | ||
| + | |||
| + | // Création d'un jeu vide | ||
| + | aGame = new Game(); | ||
| + | Board b = new Board(10, 10); | ||
| + | aGame.setBoard(b); | ||
| + | |||
| + | } | ||
| + | |||
| + | @After | ||
| + | public void tearDown() { | ||
| + | } | ||
| + | |||
| + | /** | ||
| + | * Test du bon fonctionnement du jeu, en dehors de l' | ||
| + | * attendus après le coup : - un pion de plus sur le plateau - le tour de | ||
| + | * jeu est passé - l' | ||
| + | */ | ||
| + | @Test | ||
| + | public void testDisappearEffectNormalGame() { | ||
| + | |||
| + | // On pré-remplit le plateau | ||
| + | Utils.simulateAGame(aGame); | ||
| + | |||
| + | // Effet fixé sur une case (qui n'est pas encore remplie) | ||
| + | int height = aGame.getBoard().getHeight(); | ||
| + | // height-3 correspond à la première case vide dans la colonne O, vu que l'on a déjà joué deux coups dans cette colonne | ||
| + | aGame.getBoard().getTileIJ(height - 3, 0).setEffect(new | ||
| + | |||
| + | // Récupération de l'ID du joueur avant que le coup soit joué | ||
| + | int id_player = aGame.getCurrentPlayer().getId(); | ||
| + | |||
| + | // Récupération du nombre de pions présents | ||
| + | int nb_tokens_before = aGame.getBoard().getTotalTilesCount(); | ||
| + | |||
| + | // Coup joué sur une case ne contenant pas l' | ||
| + | aGame.playMove(1); | ||
| + | |||
| + | // Récupération du nombre de pions après le coup | ||
| + | int nb_tokens_after = aGame.getBoard().getTotalTilesCount(); | ||
| + | |||
| + | // Vérifications : | ||
| + | // - l' | ||
| + | // - le tour de jeu a bien changé | ||
| + | // - il y a bien un pion de plus sur le plateau | ||
| + | assertTrue(" | ||
| + | assertTrue(aGame.getCurrentPlayer().getId() != id_player); | ||
| + | assertEquals(nb_tokens_before + 1, nb_tokens_after); | ||
| + | } | ||
| + | |||
| + | /** | ||
| + | * Test de DisappearEffect sur grille vide | ||
| + | * Vérification de l' | ||
| + | * tuile après application de l' | ||
| + | * Résultats attendus : la case doit être | ||
| + | * vide, le tour de jeu doit être passé | ||
| + | */ | ||
| + | @Test | ||
| + | public void testDisappearEffectEmptyGame() { | ||
| + | |||
| + | // Effet fixé sur une case | ||
| + | int height = aGame.getBoard().getHeight(); | ||
| + | aGame.getBoard().getTileIJ(height - 1, 0).setEffect(new DisappearEffect()); | ||
| + | |||
| + | // Récupération de l'ID du joueur courant | ||
| + | int id_player = aGame.getCurrentPlayer().getId(); | ||
| + | |||
| + | // Coup joué sur la case de l' | ||
| + | aGame.playMove(0); | ||
| + | |||
| + | // Vérifications : | ||
| + | // - la case est bien vide après | ||
| + | // - l' | ||
| + | // - le tour de jeu a bien changé | ||
| + | assertEquals(-1, | ||
| + | assertTrue(" | ||
| + | assertTrue(aGame.getCurrentPlayer().getId() != id_player); | ||
| + | |||
| + | } | ||
| + | |||
| + | /** | ||
| + | * Test de DisappearEffect sur grille vide | ||
| + | * Vérification du nombre de jetons | ||
| + | * après jeu | ||
| + | * Résultat attendu : le nombre doit être égal à 0 | ||
| + | */ | ||
| + | @Test | ||
| + | public void testDisappearEffectEmptyGameWithTilesNumber() { | ||
| + | |||
| + | // Effet fixé sur une case | ||
| + | int height = aGame.getBoard().getHeight(); | ||
| + | aGame.getBoard().getTileIJ(height - 1, 0).setEffect(new DisappearEffect()); | ||
| + | |||
| + | // Coup joué sur cette case | ||
| + | aGame.playMove(0); | ||
| + | |||
| + | // Vérification que le nombre de jetons au total est égal à 0 | ||
| + | assertEquals(0, | ||
| + | |||
| + | } | ||
| + | |||
| + | /** | ||
| + | * Test de DisappearEffect sur grille pré-remplie | ||
| + | * Vérification de l' | ||
| + | * la tuile après application de l' | ||
| + | * Résultat attendu : la case doit | ||
| + | * être vide, l' | ||
| + | * et le tour doit être passé | ||
| + | */ | ||
| + | @Test | ||
| + | public void testDisappearEffectFilledGame() { | ||
| + | |||
| + | // On pré-remplit le plateau pour les besoins de la simulation | ||
| + | Utils.simulateAGame(aGame); | ||
| + | |||
| + | // Effet fixé sur une case (qui n'est pas encore remplie) | ||
| + | int height = aGame.getBoard().getHeight(); | ||
| + | // height-3 correspond à la première case vide dans la colonne O, vu que l'on a déjà joué deux coups dans cette colonne | ||
| + | aGame.getBoard().getTileIJ(height - 3, 0).setEffect(new DisappearEffect()); | ||
| + | |||
| + | // Récupération de l'ID du joueur avant que le coup soit joué | ||
| + | int id_player = aGame.getCurrentPlayer().getId(); | ||
| + | |||
| + | // Coup joué sur cette case | ||
| + | aGame.playMove(0); | ||
| + | |||
| + | // Vérifications : | ||
| + | // - la case est bien vide après | ||
| + | // - l' | ||
| + | // - le tour de jeu a bien changé | ||
| + | assertEquals(-1, | ||
| + | assertTrue(" | ||
| + | assertTrue(aGame.getCurrentPlayer().getId() != id_player); | ||
| + | |||
| + | } | ||
| + | |||
| + | } | ||
| + | |||
| + | </ | ||
| 3. Exécutez ce code de test. | 3. Exécutez ce code de test. | ||
| - | Q2 : dans votre compte-rendu, | + | <WRAP center round help 60%> |
| - | de JUnit qui s' | + | **Q2 :** dans votre compte-rendu, |
| + | </ | ||
| - | 4. Implémentez le code nécessaire dans la classe ' | + | 4. Implémentez le code nécessaire dans la classe |
| - | sorte à ce que tous les tests passent. | + | |
| - | Q3 : dans votre compte-rendu, | + | <WRAP center round help 60%> |
| - | de JUnit qui s' | + | **Q3 :** dans votre compte-rendu, |
| - | rapport, un point pour le code) | + | </ |
| - | Q4 : faites un commit de votre projet après avoir bien veillé à | + | <WRAP center round help 60%> |
| - | sauvegarder tous vos fichiers. (1 point) | + | **Q4 :** faites un commit de votre projet après avoir bien veillé à sauvegarder tous vos fichiers. (1 point) |
| - | + | </ | |
| - | Attention : si vous voulez que vos effets soient actifs dans le jeu | + | |
| - | en mode graphique, il ne faut pas oublier de mettre à jour la classe | + | |
| - | ' | + | |
| + | <note important> | ||
| + | </ | ||
| ==== Phase 4. Implémentation de votre second effet ==== | ==== Phase 4. Implémentation de votre second effet ==== | ||
| - | Vous trouverez ci-dessous une liste d' | + | Vous trouverez ci-dessous une liste d' |
| - | partie, vous devez en choisir un, implémenter la classe de test, | + | |
| - | implémenter le code correspondant, | + | Liste des effets : |
| + | * Rajouter un pion de la couleur courante dans chaque colonne | ||
| + | * Fait disparaître un certain nombre de pions de façon aléatoire (effet à paramétrer par nombre de pions, nombre de couleurs) | ||
| + | * Changer la couleur de tout le voisinage (pion joué + les 7 pions autour, s'il y en a) | ||
| + | * Fait disparaître la colonne dans laquelle le pion est joué | ||
| + | * Fait disparaître la ligne dans laquelle le pion est joué | ||
| + | * Fait exploser le voisinage du pion joué (et gérer les effets en cascade) | ||
| + | * Fait apparaître de manière aléatoire un autre pion sur le jeu | ||
| - | Q5 : effectuez un commit de votre code de test et de votre code | ||
| - | d' | ||
| - | pour le code) | ||
| - | Q6 : exécutez en une seule fois l'ensemble des tests présents dans le | + | <WRAP center round help 60%> |
| - | projet. Dans le rapport, indiquez Q6 et copiez-collez la sortie de | + | **Q5 :** effectuez un commit de votre code de test et de votre code d'effet (1 point pour le commit + 1 point pour le rapport |
| - | JUnit. | + | pour le code) |
| + | </ | ||
| + | <WRAP center round help 60%> | ||
| + | **Q6 :** exécutez en une seule fois l' | ||
| + | </ | ||
| - | TODO Faire la liste des effets implémentables | ||
| ==== Phase 5. À votre tour d' | ==== Phase 5. À votre tour d' | ||
| - | Il reste beaucoup de choses à faire pour améliorer 'Magic P4' | + | Il reste beaucoup de choses à faire pour améliorer 'Magic P4'. Dans cette partie, vous pouvez choisir de traiter les questions |
| + | libres (**QL**) que vous voulez. Plus vous traitez de questions, plus vous aurez de points. | ||
| - | Q7 : lister les questions que vous traitez | + | Par ailleurs, si votre code est suffisamment bien fait, il sera intégré au projet principal et sera donc disponible pour les futurs |
| - | Dans cette partie, vous pouvez choisir de traiter | + | étudiants qui feront ce TP. **Vous deviendrez donc contributeurs officiels |
| - | libres (QL) que vous voulez. Plus vous traitez | + | |
| - | points. | + | |
| - | Par ailleurs, si votre code est suffisamment bien fait, il sera | + | <WRAP center round help 60%> |
| - | intégré au projet principal | + | **Q7 :** Dans votre rapport, écrivez Q7 et inscrivez la liste des questions que vous avez traité |
| - | étudiants qui feront ce TP. Vous deviendrez donc contributeurs | + | </ |
| - | officiels de P4Magic. | + | |
| - | QL1 : implémenter un autre effet, et écrire la classe de tests | + | **QL1 :** implémenter un autre effet, et écrire la classe de tests correspondante. Vous pouvez choisir d' |
| - | correspondante. Vous pouvez choisir d' | + | |
| - | précédente, | + | |
| - | veillez à bien expliquer le comportement attendu de votre effet. | + | |
| - | (1 point) | + | |
| - | QL2 : écrire les tests de la méthode win. La classe Game contient une | + | **QL2 :** écrire les tests de la méthode |
| - | méthode ' | + | |
| - | une suite gagnante. Dans cette question, il s'agit d' | + | |
| - | qui permettent de s' | + | |
| - | QL3 : couverture de code, couverture des tests. Ici, il s'agit de | + | **QL3 :** couverture de code, couverture des tests. Ici, il s'agit de faire une analyse du code existant et de déterminer d'une part s'il y a du code mort, et d' |
| - | faire une analyse du code existant et de déterminer d'une part s'il y | + | |
| - | a du code mort, et d' | + | |
| - | il faut faire des recommendations | + | |
| - | c' | + | |
| - | définies. Vous répondrez à cette question dans votre rapport. (2 points) | + | |
| - | QL4 : réfléchir à une ré-organisation du code qui permettrait de | + | **QL4 :** réfléchir à une ré-organisation du code qui permettrait de faire un P4Magic à plus de deux joueurs. Ici, il s'agit de réfléchir à tout ce qu'il faudrait modifier pour que l'on puisse jouer au P4Magic |
| - | faire un P4Magic à plus de deux joueurs. Ici, il s'agit de réfléchir à | + | |
| - | tout ce qu'il faudrait modifier pour que l'on puisse jouer au P4 Magic | + | |
| - | à plus de deux joueurs. Vous rapporterez le résultat de vos réflexions | + | |
| - | dans votre rapport, à moins que vous ne préfériez implémenter | + | |
| - | directement votre solution ? (2 points) | + | |
| - | QL5 : améliorer le paramétrage du jeu. Dans cette question, il s'agit | + | ** QL5 :** améliorer le paramétrage du jeu. Dans cette question, il s'agit d' |
| - | d' | + | |
| - | lancement. Les paramètres attendus sont : | + | |
| * Taille de la grille | * Taille de la grille | ||
| * Couleurs des joueurs | * Couleurs des joueurs | ||
| Ligne 252: | Ligne 373: | ||
| Vous pouvez ajouter d' | Vous pouvez ajouter d' | ||
| - | QL6 : réaliser la partie IHM pour la QL5. | + | **QL6 :** réaliser la partie IHM pour la QL5. |
| - | + | ||
| - | QL7 : durée de vie des effets. Dans la version actuelle, les effets | + | |
| - | sont actifs en permanence, ce qui peut poser problème dans certaines | + | |
| - | configuration. Votre mission : modifier l' | + | |
| - | ce que l'on puisse choisir, pour chaque effet, s'il est actif en | + | |
| - | permanence, ou bien s'il disparaît de la case après avoir été activé | + | |
| - | un certain nombre de fois. (3 points) | + | |
| - | + | ||
| - | QL8 : tester les méthodes de comptage de tuiles. | + | |
| - | + | ||
| - | QL9 : gérer les cases mortes. | + | |
| + | **QL7 :** durée de vie des effets. Dans la version actuelle, les effets sont actifs en permanence, ce qui peut poser problème dans certaines configuration. Votre mission : modifier l' | ||
| + | **QL8 :** tester les méthodes de comptage de tuiles. La classe '' | ||
| + | **QL9 :** gérer les cases mortes. Imaginez une façon de gérer des cases mortes, c' | ||
| ==== Phase 6. Rendu du TP ==== | ==== Phase 6. Rendu du TP ==== | ||
| - | **Q8 :** vérifiez que votre code est bien commenté, bien documenté et bien formaté, puis générez la javadoc totale. (2 points) | + | <WRAP center round help 60%> |
| + | **Q8 :** vérifiez que votre code est bien commenté, bien documenté et bien formaté, puis générez la javadoc totale. Ajoutez à votre rapport un screenshot qui prouve que la javadoc a bien été générée. (2 points) | ||
| + | </ | ||
| + | <WRAP center round help 60%> | ||
| **Q9 :** générez le diagramme UML du projet global, mettez-le en forme, et intégrez-le à votre rapport. (1 point) | **Q9 :** générez le diagramme UML du projet global, mettez-le en forme, et intégrez-le à votre rapport. (1 point) | ||
| + | </ | ||
| - | **Q10 :** Effectuez un dernier commit de votre projet. Assurez-vous de bien commiter la javadoc également. Ensuite, n' | + | <WRAP center round help 60%> |
| + | **Q10 :** Effectuez un dernier commit de votre projet. Ensuite, n' | ||
| + | </ | ||
| + | <WRAP center round help 60%> | ||
| **Q11 :** Depuis Github, effectuez un pull request sur le projet original. (1 point) | **Q11 :** Depuis Github, effectuez un pull request sur le projet original. (1 point) | ||
| - | + | </ | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||