PROJET INF431 — Set multijoueurs

Objectifs :

1. Présentation du jeu

Set! © est un jeu de cartes qui peut se jouer à un ou plusieurs joueurs. Le jeu est constitué de 81 cartes toutes différentes qui se distinguent selon 4 caractéristiques :

Un set est un ensemble de trois cartes qui sont soit toutes les trois identiques, soit toutes les trois différentes, pour chacune des caractéristiques prises séparément. Voici quelques exemples de sets :
set1 set2 set3 set4
En revanche, les triplets suivants de cartes ne sont pas des sets :
nonSet1 nonSet2 nonSet3 nonSet4
Dans le premier, il y a deux cartes losanges alors que la troisième est une carte ovale ; dans le second, il y a deux cartes rouges alors que la troisième est bleue ; etc.

Le jeu se déroule de la manière suivante : on dispose 12 cartes sur la table (en général sur une grille 3 x 4). Tout le monde joue en même temps. Le premier joueur qui voit un set dit « Set ! » et le montre aux autres. Si le set est bon, le joueur prend les trois cartes et les garde dans sa pile de gain. On complète avec trois cartes de la pioche. S'il n'est pas bon, le jeu continue mais celui qui s'est trompé doit attendre qu'un autre joueur trouve un set avant de pouvoir rejouer. Le gagnant est celui qui a trouvé le plus de sets. Alternativement, le jeu peut se jouer tout seul, en essayant de trouver les sets le plus rapidement possible. On joue alors face à la montre.

Par exemple, combien de sets pouvez-vous trouver dans les douze cartes suivantes ?
board
La réponse est 6, et voici les 6 solutions :
solution1 solution2 solution3
solution4 solution5 solution6

Notez qu'il peut arriver que 12 cartes ne contiennent aucun set. Dans ce cas, on doit ajouter 3 nouvelles cartes sur la table et chercher dans les 15 cartes alors présentes. Lorsque l'on trouve le premier set, on ne rajoutera alors pas de nouvelles cartes (sauf s'il n'y a à nouveau aucun set sur la table). En fait, on peut montrer que :

Dans notre version, on pourra donc toujours supposer que lorsque l'on a 15 cartes sur la table, elles contiennent toujours un set. Voir ici et ici ou si vous êtes intéressés par la combinatoire de ce jeu.

Ce jeu a été créé par Marsha Falco et auto-édité en 1991. Il est maintenant édité par une grande maison d'édition de jeux de société.

2. Description du projet

Le but du projet est de développer une application multi-joueurs du jeu Set!

2.1. Application à un joueur

Dans un premier temps, vous vous contenterez de développer une application pour un joueur seul. L'objectif ici est de manipuler l'interface graphique d'android ou une interface graphique de votre choix, comme SWING, et les threads utiles pour cela.
Voici à quoi doit ressembler votre application, en tout cas sous Android, ici. Notez la présence d'un panneau de contrôle en bas à droite qui contient le temps écoulé depuis le début de la partie, le score, et le dernier set attrapé.
initial
Lors du jeu, votre application doit typiquement se comporter comme suit (voir les illustrations ci-dessous).

On illustre ci-dessous le déroulement typique du jeu.
initial select1 select2 accept afterAccept select3 select4 reject afterReject

Comme on l'a dit plus haut, il se peut qu'on doive rajouter trois cartes sur le plateau :
additional
Il faudra donc penser à tester chaque fois qu'on remet des cartes s'il existe bien un set dans les cartes qui sont sur le plateau.

2.2. Multi-joueurs

Vous devez développer une version multi-joueur du jeu Set!. Le plus simple sera d'utiliser un serveur central qui tourne sur votre ordinateur. Sous Android, on pourra s'inspirer du TD 3 de l'ancien cours INF422 et du code du serveur de chat correspondant. Ensuite, chaque utilisateur se connecte à ce serveur central en communiquant par exemple à travers des sockets. Vous pouvez choisir d'autres options d'implémentation (un serveur sur l'un des téléphones, ...).

Vous devez définir le protocole de votre jeu. Par exemple, on pourra élaborer sur le protocole suivant :

3. Modalités

Vous pouvez préparer ce projet seul ou par binôme. Cette décision doit nous être notifiée par email avant le cours 6.

Pour nous rendre votre travail, vous devez déposer un fichier zip de votre application (ie. un zip du répertoire principal de votre application, qui contiendra donc non seulement le répertoire src, mais aussi tous les autres répertoires nécessaires à l'application, en particulier le répertoire res et le fichier AndroidManifest.xml si vous faites une version Android). Nous devons pouvoir faire tourner votre application sur notre émulateur ou machine virtuelle Android.

4. Conseils et coups de pouce

N'hésitez pas à nous envoyer un email pour prendre rendez-vous et venir nous voir si vous êtes coincés sur votre projet.

Pour créer votre application Android, suivez ce tutoriel. Le plus simple est sans doute d'utiliser eclipse et de suivre les indications qu'il vous donne.

Version initiale, simple

Le code fournit en exemple comporte deux classes : Cards et CardDrawable. Pour la suite, voici une liste de choses à faire, pas forcément dans cet ordre :

Afficher douze cartes sur un plateau
Il s'agit essentiellement de créer douze vues contenant chacune un objet de type CardDrawable. Un bon point de départ est la vue ImageView et sa méthode setImageDrawable(). Vous pouvez insérer douze vues dans un groupe TableLayout, ou dans des groupes LinearLayout avec des attributs layout_weight appropriés. Voyez aussi la méthode ViewGroup.getChildAt() si vous ne voulez pas nommer toutes les vues individuellement avec un ID.
Mémoriser et gérer la sélection du joueur
En répondant aux événements onClick() comme dans le TD 2 de l'ancien cours INF422, modifiant l'état du jeu en conséquence.
Représenter les cartes sélectionnées
Pour cela, vous voudrez changer l'état de vos objets CardDrawable. Il faut modifier le code de la classe pour gérer différents couleurs de fond pour la carte selon un état (sélectionné/non sélectionné). Cet état peut alors être modifié de diverses manières, et la vue contenant la carte doit être invalidée afin que le nouveau dessin apparaisse.
Représenter les combinaisons gagnantes et perdantes
Il s'agit d'animations (très simples) : vous voulez afficher une transition graphique indiquant la nature de la combinaison sélectionnée, avant de déselectionner les cartes. Il y a plusieurs manières de procéder ; une façon simple est de poster des tâches à exécuter à des instants précis (p.ex. une seconde après l'instant courant) et qui modifient les vues affichées temporairement. Cf. Handler.postDelayed().
Gérer le tirage de nouvelles cartes depuis une pile
Retenir quelles cartes ont déjà jouées, s'assurer que les cartes tirées contiennent au moins un set, et détecter les combinaisons gagnantes pour remplacer les cartes concernées.

Pour ceux qui veulent mieux comprendre le code fourni ou aller plus loin.

Approche initiale, plutôt plus difficile à suivre

On vous fournit une classe Card disponible dans le fichier Card.java. Cette classe modélise une carte du jeu set. Elle contient trois méthodes publiques :

Pour gérer la mise en page, vous avez deux options :

D'autres coups de pouce viendront s'ajouter ici en fonction de votre travail et intérêt pour ce projet.