PROJET INF431 — Set multijoueurs
Objectifs :
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 :
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 ?
La réponse est 6, et voici les 6 solutions :
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 :
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é.
Le but du projet est de développer une application multi-joueurs du jeu Set!
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é.
Lors du jeu, votre application doit typiquement se comporter comme suit (voir les illustrations ci-dessous).
Comme on l'a dit plus haut, il se peut qu'on doive rajouter trois cartes sur le plateau :
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.
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 :
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.
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.
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 :
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.onClick()
comme
dans le TD 2 de l'ancien cours INF422,
modifiant l'état du jeu en conséquence.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.Handler.postDelayed()
.Pour ceux qui veulent mieux comprendre le code fourni ou aller plus loin.
Card
offre une
meilleure abstraction et des facilités de manipulations, mais
un simple entier est plus compact en mémoire et ne nécessite
pas d'allocation d'objet, coûteuse sur des systèmes plus
petits comme les téléphones. De la même manière, beaucoup de
données sont empaquetées dans des simples entiers dans les
bibliothèques Android.CardDrawable
est codée de manière
à réutiliser une poignée d'objets alloués une fois pour toute
à la création, cela afin d'éviter la création d'une multitude
d'objets à chaque dessin de la carte.ImageView
p.ex.) peut gérer la modification
elle-même (en surchargeant la
méthode performClick()
), ou le code de
l'interface principale peut modifier l'état et invalider la
vue.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.