Série 3 – Jeu de Jass
Introduction
Le Jass est un jeu de cartes très populaire en Suisse. Le but de cette série est d'écrire une toute petite partie des classes nécessaires à la mise en œuvre de ce jeu, principalement celle des cartes.
Exercice 1 : cartes
Pour commencer, écrivez une classe finale et immuable nommée Card
, modélisant une carte d'un jeu de 36 cartes.
Les deux attributs d'une telle carte sont sa couleur — piques, carreaux, trèfles ou cœurs — et sa valeur — six, sept, huit, neuf, dix, valet, dame, roi ou as. Chacun de ces attributs se représente idéalement au moyen d'une énumération Java, comme cela a été vu au cours. Un accesseur doit être fourni pour chacun d'entre-eux.
Votre classe des cartes doit implémenter l'interface Comparable
de telle manière que les cartes soient triées d'abord par couleur puis par valeur, dans l'ordre donné plus haut (piques d'abord, carreaux ensuite, etc. puis dans une même couleur le six d'abord, le sept ensuite, etc.).
Etant donné que les cartes sont immuables, il est également judicieux de redéfinir les méthodes hashCode
et equals
pour que cette dernière mette en œuvre l'égalité structurelle.
Afin que les cartes puissent être affichées à l'écran sous une forme compréhensible, votre classe doit offrir une méthode frenchName
retournant le nom français d'une carte. Pour la mettre en œuvre, ajoutez aux deux énumérations mentionnées ci-dessus une méthode frenchName
. Cela vous permettra d'exercer l'ajout de code à une énumération Java.
Exercice 2 : Jeu de Jass
Une fois la classe des cartes terminée, votre but est d'écrire une classe nommée p.ex. JassGame
et modélisant un jeu de Jass. Une version réaliste de cette classe posséderait probablement des attributs comme les joueurs, un tas de cartes, des plis, etc. Pour cet exercice, vous vous contenterez d'en écrire un embryon très simple dont tout le code sera placé dans des méthodes statiques. Cela n'est pas très propre mais simplifie les choses. Nous vous proposons d'offrir les méthodes suivantes :
List<Card> buildDeck()
, qui retourne une liste contenant les 36 cartes d'un jeu standard,void shuffleDeck(List<Card> deck)
, qui mélange les cartes d'une liste (aidez-vous de la méthodeshuffle
de la classeCollections
),List<List<Card>> dealDeck(List<Card> deck, int stacksCount)
, qui distribue les cartes du tasdeck
— qu'on suppose mélangé — enstacksCount
parties de taille égale ou lève l'exceptionIllegalArgumentException
si le tas ne peut être distribué en ce nombre de parties,int cardPoints(Card c, Card.Suit trump)
, qui retourne la valeur d'une carte en points selon les règles du Jass, étant donné l'atouttrump
.
Exercice 3 : Classe principale
Pour terminer, écrivez un petit programme principal qui crée un tas de 36 cartes, le mélange, et le distribue entre 4 joueurs puis affiche les mains de chacun avec leur valeur, en faisant l'hypothèse que l'atout est piques. La sortie de votre programme devrait ressembler à ceci :
Main du joueur n°1 (vaut un total de 34 points). sept de piques dix de piques as de piques sept de carreaux dame de carreaux sept de trèfles roi de trèfles valet de cœurs roi de cœurs Main du joueur n°2 (vaut un total de 39 points). huit de piques dame de piques valet de carreaux six de trèfles dix de trèfles dame de trèfles sept de cœurs dix de cœurs as de cœurs Main du joueur n°3 (vaut un total de 15 points). six de piques six de carreaux neuf de carreaux roi de carreaux huit de trèfles as de trèfles six de cœurs huit de cœurs neuf de cœurs Main du joueur n°4 (vaut un total de 64 points). neuf de piques valet de piques roi de piques huit de carreaux dix de carreaux as de carreaux neuf de trèfles valet de trèfles dame de cœurs
Notez que la somme totale des points vaut 152 comme il se doit, et que les cartes de chaque main sont ordonnées comme mentionné précédemment.
Afin d'afficher les cartes d'une main dans l'ordre, nous vous proposons d'écrire une méthode qui, étant donné un itérateur quelconque, produit un autre itérateur qui retourne les mêmes éléments que le premier mais ordonnés selon leur ordre naturel. Il s'agit d'un excellent exercice pour entraîner les concepts vus jusqu'à présent ! Aidez-vous au besoin des méthodes sort
et unmodifiableCollection
de la classe Collections
.