Livrables
Livrable 1 : Jets de dés, plateau, déplacement
Les joueurs peuvent se déplacer sur le plateau. Pour l'instant les joueurs ne peuvent rien faire, le jeu progresse quand ils donnent l'ordre IDLE
(ne rien faire), ce qui passe le tour, et déclenche le jeté les dés et le déplacement pour le joueur suivant. Les ordres incohérents avec la situation courante du jeu sont ignorés. Un ordre invalide peut être un ordre d'un joueur pour qui ce n'est pas le tour de jouer, ou alors un ordre qui n'est pas cohérent avec la situation courante du tour.
La composition du plateau est la suivante, elle est décrite dans le fichier de ressources monopoly.csv
(sous core/main/resources
dans le projet). Ce fichier est à parser pour créer une représentation en mémoire du plateau.
Voici les règles concernant les dés : on simule le jet de deux dés à six face, le score de déplacement est la somme des deux dés ; il faut donc faire deux générations aléatoires pour un lancer de dés. Les dés ne sont pas testés par mes tests, ils sont remplacés par une pseudo entité, mais je corrigerai la validité de votre implémentation ainsi que comment vous l'avez testée.
En résumé, 3 tâches à faire pour ce livrable :
Parser le plateau depuis le fichier CSV et en faire une modélisation
Implémenter les dés
Combiner la modélisation du plateau dans votre simulation de Monopoly afin d'avoir la fonctionnalité de déplacement spécifiée par les tests fournis.
Livrable 2 : Argent, Achat, Loyers terrain nu
Dans ce livrable, on va implémenter :
Un système de gestion de l'argent des joueurs, et des transactions. Chaque joueur commence avec une somme de départ de 1500€.
Possibilité pour les joueurs d'acheter des propriétés, gares et companies, en donnant un ordre de type
BUY
à son tour lorsqu'on est sur une localisation de ce type.Les joueurs doivent régler un loyer lorsqu'ils arrivent sur une propriété, gare ou compagnie, déjà possédée par un autre joueur.
Les joueurs ne peuvent pas acheter une propriété, gare ou compagnie qui appartient déjà à quelqu'un d'autre.
Les loyers terrain nu sont les suivants :
Propriété | Loyer terrain nu |
---|---|
Rue Raspail | 2 |
Rue Victor Hugo | 4 |
Rue Jean Jaurès | 6 |
Boulevard Maxime Gorki | 6 |
Rue Youri Gagarine | 8 |
Avenue Louis Aragon | 10 |
Avenue de la République | 10 |
Avenue de Stalingrad | 12 |
Allée Berlioz | 14 |
Rue du Moulin de Saquet | 14 |
Sentier de la Commune | 16 |
Rue Pascal | 18 |
Rue Blanqui | 18 |
Rue Rosa Luxembourg | 20 |
Rue de Bretagne | 22 |
Rue René Hamon | 22 |
Rue Guy Môquet | 24 |
Rue Henri Barbusse | 26 |
Rue Ambroise Croizat | 26 |
Rue de Verdun | 28 |
Avenue de Paris | 35 |
Avenue Paul Vaillant Couturier | 50 |
Pour l'instant le loyer des gares est un prix fixe de 25.
Le loyer des compagnies se calcule selon la logique suivante :
Si le propriétaire de la compagnie possède une seule des deux compagnies, alors le prix est le score du joueur locataire multiplié par quatre
Si le propriétaire de la compagnie possède les deux compagnies, alors le prix est le score du joueur locataire multiplié par dix
Si un joueur est confronté à un loyer qu'il ne peut pas payer, il est déclaré en banqueroute, il perd, et est supprimé des joueurs de la partie. Le joueur propriétaire percevant le loyer qui déclenche la banqueroute perçoit l'argent du joueur en banqueroute comme loyer, pas plus. Si la partie contient moins de 2 joueurs, elle s'arrête, c'est-à-dire que tout appel ultérieur à submitOrder
jette une exception de type GameFinishedException
.
Livrable 3 : Prison, case départ, gares
Prison
Si un joueur tombe sur la case "Aller en prison", il va en prison, et est déplacé sur la case "En prison".
Lors de son prochain tour, il peut :
émettre un ordre de
PAY_PRISON
, ce qui lui coûte 50. S'il fait ça, il avance de son score, il n'est plus en prison.émettre un ordre
IDLE
, il est toujours en prison.
Ces choix s'offrent à lui pour les deux prochains tours. Au 3e tour, il est obligé de payer, et avance en fonction de son dernier jet de dés.
Case départ
Quand un joueur passe par la case départ, il gagne 200.
Gares
Le loyer d'une gare est calculé en fonction du nombre de gares possédées par le joueur qui possède la gare :
Nombre de gares possédées | Loyer |
---|---|
1 | 25 |
2 | 50 |
3 | 100 |
4 | 200 |
Livrable 4 : Construction, loyers adéquats et taxes
Les joueurs peuvent construire des maisons pour leurs propriétés en émettant un ordre BUILD
à leur tour. Cet ordre a un paramètre propertyName
: le nom de la propriété sur laquelle construire.
Pour construire, un joueur de posséder toutes les propriétés d'un groupe de couleur.
Une propriété a cinq niveaux de construction. Voici la spécification des loyer et prix de construction en fonction des propriétés :
Propriété | Cout de construction | Loyer "1 Maison" | Loyer "2 Maisons" | Loyer "3 Maisons" | Loyer "4 Maisons" | Loyer "Hotel" |
---|---|---|---|---|---|---|
Rue Raspail | 50 | 10 | 30 | 90 | 160 | 250 |
Rue Victor Hugo | 50 | 20 | 60 | 180 | 320 | 450 |
Rue Jean Jaurès | 50 | 30 | 90 | 270 | 400 | 550 |
Boulevard Maxime Gorki | 50 | 30 | 90 | 270 | 400 | 550 |
Rue Youri Gagarine | 50 | 40 | 100 | 300 | 450 | 600 |
Avenue Louis Aragon | 100 | 50 | 150 | 450 | 625 | 750 |
Avenue de la République | 100 | 50 | 150 | 450 | 625 | 750 |
Avenue de Stalingrad | 100 | 60 | 180 | 500 | 700 | 900 |
Allée Berlioz | 100 | 70 | 200 | 550 | 750 | 950 |
Rue du Moulin de Saquet | 100 | 70 | 200 | 550 | 750 | 950 |
Sentier de la Commune | 100 | 80 | 220 | 600 | 800 | 1000 |
Rue Pascal | 150 | 90 | 250 | 700 | 875 | 1050 |
Rue Blanqui | 150 | 90 | 250 | 700 | 875 | 1050 |
Rue Rosa Luxembourg | 150 | 100 | 300 | 750 | 900 | 1100 |
Rue de Bretagne | 150 | 110 | 330 | 800 | 975 | 1150 |
Rue René Hamon | 150 | 110 | 330 | 800 | 975 | 1150 |
Rue Guy Môquet | 150 | 120 | 360 | 850 | 1025 | 1200 |
Rue Henri Barbusse | 200 | 130 | 390 | 900 | 1100 | 1275 |
Rue Ambroise Croizat | 200 | 130 | 390 | 900 | 1100 | 1275 |
Rue de Verdun | 200 | 150 | 450 | 1000 | 1200 | 1400 |
Avenue de Paris | 200 | 175 | 500 | 1100 | 1300 | 1500 |
Avenue Paul Vaillant Couturier | 200 | 200 | 600 | 1400 | 1700 | 2000 |
Les classes de taxes doivent débiter les joueurs qui tombent dessus du montant correspondant, qui peut être retrouvé dans la colonne price
pour les localisations de type tax
dans monopoly.csv
.
Livrable 5 : Jeu en réseau en mode client-serveur
Nous voulons maintenant utiliser notre simulation de Monopoly afin de jouer en réseau. Nous allons donc devoir créer deux nouveaux modules dans l'application, selon le modèle client-serveur :
client
: application en ligne de commande permettant aux joueurs de jouer au jeu en leur permettant d'envoyer leurs ordres à la simulation, mais aussi de lire des informations sur la situation courante du jeu.server
: application qui fait tourner la simulation en mémoire, et intéragit via le réseau avec les clients pour le permettre de jouer ensemble.
Le client et le serveur devront implémenter un main
qui permettra de jouer en condition réelles, via une interface en ligne de commandes.
Manipulations préparatoires
Créer deux nouveaux modules gradle : `client` et `serveur`.
Ajouter le plugin Gradle `application` au script de build de ces modules.
Créer une classe `App` contenant une méthode `main` dans chacun des modules.
Ajouter la configuration du plugin application pour dire à Gradle quelle est la classe principale au script de build de ces modules :
application { mainClass = 'server.App' }Ajouter la configuration run plugin application pour correctement câbler l'entrée standard au script de build de ces modules :
run { standardInput = System.in }Ajouter les dépendances et références de projet requises au script de build de ces modules.
Dans le module
client
, créez une classe de test qui étendBaseMultiplayerMonopolyGameTests
et implémente les méthodes abstraites avec vos propres classes.
Protocole
Le protocole de jeu est le suivant :
Le serveur démarre avec en paramètre un certain nombre de joueurs attendus pour la partie. Quand un joueur se connecte, il envoie son pseudo.
Une fois le nombre de joueurs attendus connectés, le serveur crée une nouvelle simulation la partie démarre. Il envoie l'état initial de la simulation après création à tous les joueurs.
Le serveur entre en attente des envois d'ordre des joueurs. Les joueurs jouent chacun leur tour. Après chaque gestion d'ordre sur la simulation, le serveur envoie aux clients l'état courant de la partie.
L'envoie de l'état de la partie se fait sous la forme d'un format de sérialisation des informations. On envoie une ligne qui contient :
L'ordre exécuté et le joueur qui l'exécute au format
joueur:ordre
(et éventuellement un:propriété
en cas deBUILD
)La localisation des joueurs au format
joueur:location
, séparés par des virgulesLa balance des joueurs au format
joueur:balance
, séparés par des virgulesL'état de propriété de toutes les cases du plateau au format :
case:propriétaire
, séparés par des virgules
Chaque partie est séparés par des |
.
Exemple :
Tests
Les interfaces GameServer
et GameClient
feront le lien entre votre client/serveur et mes tests d'intégration, de la même manière que l'interface Monopoly
pour la simulation. Le module client doit contenir une implémentation du test d'intégration fourni qui valide le fonctionnement du système client-serveur.
Je ferai également quelques tests manuels pour vérifier que les mains de vos applications fonctionnent correctement et permettent de jouer.