Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Sommaire
Sommaire................................................................................................................................................. 2
Détails administratifs ............................................................................................................................... 3
Introduction ............................................................................................................................................. 3
Restrictions .............................................................................................................................................. 3
Projet ....................................................................................................................................................... 3
Première Partie : Installation ............................................................................................................... 4
Deuxième Partie : Mes premiers tests unitaires ................................................................................. 5
Classe Deck ...................................................................................................................................... 5
Classe Hand...................................................................................................................................... 7
Class Board ...................................................................................................................................... 8
Class Cemetary ................................................................................................................................ 8
Class Pawn ....................................................................................................................................... 8
Class Player ...................................................................................................................................... 9
Class Game..................................................................................................................................... 10
Troisième partie : Let’s play............................................................................................................... 10
my_tcg 2
Détails administratifs
• Le projet est à réaliser seul
• Les sources devront être rendues avec Blih
• Le nom du rendu est : « my_tcg »
• La stabilité du code devra être garantie par un maximum de tests unitaires
Introduction
Ce sujet sera l’occasion d’aborder une notion très importante dans le développement d’application
moderne, les tests unitaires. Pour ce faire vous allez développer (la partie logique métier) un jeu de
type « Collectible Card Game ». Les tests unitaires permettront de garantir la qualité du code.
Restrictions
Toutes les technologies (JS) sont autorisées, toutefois, si certains outils/technologies sont indiquées
au fil du sujet, vous devez les utiliser.
Projet
my_tcg 3
Première Partie : Installation
Souhaitant vous concentrer sur la conception des mécaniques de votre jeu, vous avez délégué la
partie visuelle à un tiers développeur. Par ailleurs, et comme vous avez pu le constater les
technologies web évoluent très vite. Vous décidez donc que le projet sera codé en EcmaScript 6
(aussi appelé es2015). Pour ce faire le développeur tiers qui travaille avec vous, vous parle des outils
suivants : gulp, babel, et browserify. Vous irez donc vous renseigner sur le rôle et l’utilisation de
chacun.
Une fois qu’il a fini son travail, le développeur en charge de la partie visuelle vous a livré un pack de
scripts ( http://lyon-2017.wac.epitech.eu/my_ccg.zip ). Mais une fois décompressé, en ouvrant le
script index.html (dans le dossier public), vous n’obtenez qu’une page blanche… Vous êtes pourtant
convaincu de la fiabilité de la personne qui vous a livré le code. Vous avez donc sans doute oublié de
faire quelque chose pour que l’interface s’affiche (il n’y a aucune ligne de code à toucher à cette
étape…).
Voici ce que doit afficher la page index.html une fois l’installation du projet terminée :
my_tcg 4
Deuxième Partie : Mes premiers tests unitaires
L’une des pires choses qui puisse arriver à un développeur (toutes technologies confondues), c’est de
provoquer des régressions (de nouveau bugs dans une partie d’application qui fonctionnait
jusqu’alors). Il faut refaire (débugger) un travail que l’on a déjà fait, c’est ennuyeux et parfois le code
à débuguer n’est plus tout jeune (on ne s’en souviens plus) ou pire encore, on est pas la personne à
l’origine du code en question.
Renseignez-vous sur la philosophie des tests unitaires (pourquoi unitaires ? qu’est-ce que cela
implique ?).
Pour vous avancer, dans le début de projet qui vous a été livré, l’environnement de test est déjà
prêt (nous utiliserons le framework de test « Jasmine »). Vous devez trouver la commande (à taper
dans la console) qui exécute les tests. Vous devriez obtenir quelque chose ressemblant à ceci :
Le framework « jasmine » promeut la méthode « Behavior Driven Development » (ou « BDD »), qui
consiste à écrire les tests au fur et à mesure que l’on décrit le comportement souhaité de
l’application (avant d’avoir écrit du code applicatif à proprement parler). Vous irez vous renseigner
sur l’intérêt de cette méthode.
Conformément, à la philosophie de la méthode BDD, nous allons commencer par écrire des tests en
suivant les spécifications suivantes :
Classe Deck
Permet de gérer les opérations courantes sur un paquet de carte.
my_tcg 5
Doit implementer les methodes : shuffle, draw, insertAt, getCardsCount.
constructor(object config)
Accepte un objet en premier argument. Cet objet doit avoir une propriété cards contenant
un tableau (de cartes) qui constituerons les cartes du paquet.
mixed draw()
Supprime et retourne la première carte du paquet, ou false s’il n’y a plus de carte dans le
paquet.
void shuffle()
Doit mélanger les cartes du paquet, retourne true si le paquet a été mélangé. False sinon.
Doit permettre d’ajouter une carte (premier paramètre) dans le paquet à une position
donnée en deuxième paramètre.
int getCardsCount()
Faites exécuter les tests. Si vous n’avez pas d’erreurs (erreur de syntaxe, mauvaise utilisation du
framework, etc…), le rapport d’exécution (ce qui s’affiche) devrait vous dire que les tests « FAIL ».
Finissez d’implémenter la classe Deck (dans le fichier src/models/deck). Une fois que vos tests
« pass » (indique « SUCCESS »), et tant qu’il en sera ainsi, cela signifiera que vous n’avez pas à vous
souciez de la classe Deck, elle fait ce qu’on attend d’elle (donc aussi les différentes parties de son
code). Pour preuve, si vous retournez et exécutez le nouveau code dans un navigateur, en cliquant
sur l’un des decks, vous devriez être en mesure de faire piocher une carte à l’un des joueurs.
Nous allons donc passer à la suite, en commençant d’abord par écrire les tests correspondants (aux
spécifications) des différentes classes…
Note :
- Pour la suite vous pouvez, au choix, écrire tous les tests (de toutes les classes), puis
implémenter (toutes) les classes, ou implémenter les classes au fur et à mesure (une fois que
les tests correspondant ont été écrits). Quoi qu’il en soit, relier « l’intelligence de jeu » (vos
my_tcg 6
classes) et l’affichage (le code qui vous ai fourni) comme pour le Deck, n’est prévu que dans
la 3e partie du sujet.
- Certaines classes sont déjà créées, il s’agit alors de les modifier / compléter selon les
spécifications.
Comme dans toute conception en POO, les objets auront un rôle précis et délimité. Nous allons donc
faire des classes pour chaque « aspect » du jeu.
Classe Hand
Permet de gérer la main d’un joueur.
constructor(object config)
Accepte un objet en premier argument. Cet objet doit avoir une propriété cards contenant
un tableau (de carte) qui constituerons les cartes de la main
On pourra préciser une limite maximum de carte qu’il est possible d’avoir en main. Pour ce
faire, il faudra préciser une propriété « limit » dans l’objet passé en paramètre au
constructeur.
Si cette limite n’est pas précisée, la valeur par défaut de cette limite sera 7.
Ajoute une carte (qui est passé en paramètre) à la fin de la liste des cartes déjà dans la main.
Si tout s’est bien passé, la fonction retourne true, sinon false.
Aucune carte ne doit être ajoutée si la limite est déjà atteinte, la méthode doit retourner
false.
Retire de la main la carte positionnée à l’index passé en paramètre. Retourne la carte s’il n’y
a pas eu de souci, false sinon.
array getAllCards()
int getCardsCount()
my_tcg 7
Retourne le nombre de carte actuellement dans la main.
Class Board
Permet de gérer un board (l’ensemble des cartes mises en jeu).
Class Cemetary
Permet de gérer un cimetière.
Class Pawn
Classe abstraite qui sert de base a tout ce qui pourra combattre.
Doit implémenter les methodes suivantes : getLife, getStrength, getDef, attack, recieveAttack.
Accepte 3 entiers en paramètre, le premier étant le niveau de vie initial, le second la force, le
dernier la défense.
Accepte en paramètre un objet (ci-après désigné par « target ») qui sera lui aussi une
instance de Pawn (ou d’une classe dérivée).
my_tcg 8
A l’exécution de cette méthode si le 2nd paramètre est présent et qu’il vaut « true » (il s’agit
d’une contre-attaque), on décrémentera la vie de la valeur de la défense de l’(contre-
)attaquant, non de la valeur de la force, et on ne fera pas de contre-contre-attaque.
Class Player
Permet la gestion d’un joueur.
Doit implémenter les méthodes suivantes : shuffle, draw, playCard, discard, attack.
Doit avoir les propriétés suivantes : (Deck) deck, (Board) board, (Hand) hand, (Cemetary) cemetary
constructor(object config)
Accepte un objet de configuration en paramètre. Cet objet, pour initialiser le deck du joueur,
doit avoir une propriété deck qui sera soit un tableau, soit une instance de la classe Deck.
Accepte en paramètre une chaine de caractère servant à désigner quel paquet mélanger.
Si un paquet a été mélangé, la méthode retourne true, dans tous les autres cas, elle retourne
false.
bool draw()
Doit piocher la première carte du deck du joueur et l’ajouter à la main du joueur. Retourne la
carte piochée si toutes les opérations se sont bien passées, false sinon.
Doit déclencher une attaque avec la carte du board désignée par le premier paramètre, et
cibler l’adversaire passée en second paramètre.
my_tcg 9
Class Game
Permet l’encapsulation du jeu dans une seule instance.
constructor(object config)
string getTurn()
string changeTurn()
Exécute la méthode indiquée par le paramètre « action » pour le joueur désigné par le
paramètre « side ». Le « payload » sera passé en paramètre à la méthode appelée.
Si tout s’est bien passé la méthode proxy retourne le résultat de la méthode invoquée, false
sinon.
Vous avez désormais toutes les cartes en main pour implémenter un jeu de type « Collectible Card
Game ».
Les écouteurs d’événements DOM (clic par exemple) sont ajoutés au niveau du composant, puis, s’il y
a lieu les « événement » sont remontés au composant parent. Les événements peuvent être
remonté jusqu'à la racine des composants (l’arène). C’est ce dernier (et lui uniquement) qui devra
my_tcg 10
communiquer avec le modèle, puis éventuellement (en fonction des retours du modèle) lancer à son
tour un « événement » qui sera écouté par les composants enfants.
La partie graphique étant bien séparée de la logique de jeu, les « points de contact » étant identifiés
et limité (seul l’arène doit communiquer avec le modèle), la logique de jeu peut être aisément portée
coté serveur pour permettre de jouer à 2. Les tests unitaires nous permettront de nous assurer
qu’une fois le code porté côté serveur, la logique n’aura pas changé.
Pas de restriction quant aux règles du jeu, vous pouvez implémenter les règles qui vous plaisent,
attention toutefois à conserver les précédentes (ce sont elles qui comptent le plus dans la notation).
my_tcg 11