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éthode shuffle de la classe Collections),
  • List<List<Card>> dealDeck(List<Card> deck, int stacksCount), qui distribue les cartes du tas deck — qu'on suppose mélangé — en stacksCount parties de taille égale ou lève l'exception IllegalArgumentException 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'atout trump.

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.