[ Retour à l'index ] | |
Projets universitaires : | [ Triangulation de Delaunay ] [ Algorithme de Dijkstra ] [ Gror ] [ LAM ] |
Projets personnels : | [ Jeux d'échecs ] |
Le but de ce programme est de réaliser une interface pour jouer au bingo en réseau. Le programme nécessite qu'il y ait un serveur et des clients qui échange des messages grâce à la bibliothèque RMI.
Notez bien tout d'abord, que nous n'avons pas exactement respecté les règles du Bingo. En effet, nous ne les connaissions pas, et de toutes façons, le but n'était pas de développer le jeu, mais plutôt de réaliser une application qui mettait en oeuvre les outils à notre disposition.
Le serveur ouvre une partie et attend que des clients s'inscrivent. Lors de l'inscription le serveur distribue une grille (remplie aléatoirement) à chaque client. Les grilles comportent trois lignes de neuf cases, sur lesquelles sont disposés des numéros compris entre 1 et 90, et des cases grisées qui sont au nombre de 12 (dans le jeu original, il y en a exactement 4 par ligne). Une fois un nombre suffisant de clients inscrits, la partie débute : le serveur tire des numéros aléatoirement et les client consultent ces réultats. Puis, chaque client cherche le numéro reçu dans sa grille et le coche s'il y est. Si un client a tous les numéros de sa grille cochés, alors il dit : "Bingo!".
Pour aboutir à un résultat satisfaisant en peu de temps (5 jours), il a fallu adopter une certaine démarche.
Dans un premier temps, nous avons repris le tutoriel cité quelques pages auparavant, pour lui ajouté des méthodes et mieux comprendre le fonctionnement des appel de méthodes distantes. Puis nous avons modifier la classe Hello, afin de modéliser une grille de Bingo, et ensuite de faire une méthode qui permettent au client de retirer une grille auprès du serveur
Les RMI n'était pas un outil franchement adapté à notre problème. En effet, RMI ne permet pas d'échanger des messages. Il nous a donc fallu chercher une manière de concevoir notre jeu sous forme de consultation de données. Prenons l'exemple des tirages : le serveur tire des numéros lorsqu'on clique sur le boutons approprié. Mais ensuite comment faire pour communiquer les numéros aux clients : impossible ! C'est là que nous avons décidé que le client devait choisir de consulter le serveur pour voir s'il y avait des numéros de tirés (un peu comme si il était inatentif à chaque tirage). De même que lorsque le serveur se ferme, comment en informer les clients connectés ? Encore ici, c'est au client de faire le travail, si lorsque le client essaie d'envoyer un requête au serveur, une exception est levée, c'est que la communication a été rompu.
Etant des ardents développeurs en C++, nous n'avons pas trop été dépaysés par la syntaxe. En revanche le fait que tout soit "objet", nous faisait un peu peur au début, nous avions l'impression que le programmeur n'avait pas de liberté. Mais nous avons pris l'habitude des conventions utilisées et des instructions "à ralonge" lorsqu'il faut inclure du transtypage d'objets. La surprise fut l'abondance d'outils graphiques mis à notre disposition, notament par la librairie Swing.
C'est une interface qui va servir de support au client pour appeler les méthodes implémentées par la classe Bingo.
C'est l'objet distant lui-même, que vont donc manipuler les clients. Cette classe contient également des méthodes locales. c'est-à-dire que seul le serveur pourra les utiliser. Elle nous servirons à manipuler les données.
Elle va servir au serveur à stocker les informations concernant les joueurs connectés (contenu de leur grille, leur nom et si ils sont prêts).
Fenêtre principale de l'application côté client. Elle gère tous les événements utilisateurs et agit sur la fenêtre client et sur l'objet distant.
Cette classe sert à dessiner une case de bingo, qui peut donc soit contenir un numéro, soit être grisée. Et si elle est grisée, elle peut être cochée ou non.
C'est tout simplement une grille qui affiche les 27 cases.
Une petite boîte "about".
C'est la classe principale de l'application côté client, elle se contente d'afficher une instance de la classe BingoClientFrame
Fenêtre principale de l'application côté serveur. Elle réagit aux méthodes appelées par les client sur l'objet Bingo que possède le serveur (Activation/désactivation de boutons/menus).
C'est la classe principale de l'application côté servuer, elle se contente d'afficher une instance de la classe BingoServerFrame
Ce ne fut pas sans douleur, mais nous pensons que nous sommes arrivés à un résultat satisfaisant dans l'ensemble.
L'interface présente une grille (qui est pour l'instant vide), trois boutons et deux menus. Le premier bouton ouvre une boîte de saisie pour se connecter à une adresse (par défaut l'adresse locale est présente).. Le deuxième bouton sert à se déconnecter. Le troisième sert à signaler au serveur que l'on est prêt.
Le menu "File" propose plusieurs choix. On peut consulter les numéros qui ont été tirés, obtenir une nouvelle grille, si celle que l'on possède ne nous plait pas. On peut également obtenir quelques informations : notre nom d'enregistrement (saisie au début) et l'état de notre connexion). Le menu "Connect" contient lui, quelques raccourci vers des adresses pour se connecter directement.
Elle se compose de deux listes. La première affiche le nom des joueurs actuellement connectés, et la deuxième les numéros qui ont été tirés. Sur la droite, le premier bouton sert à supprimer le joueur selectionné dans la liste (s'il y en a un). Juste en dessous, une information sur l'état du joueur sélectionné (prêt/pas prêt). Le second bouton (qui n'est activé que lorsqu'un joueur minimum n'est prêt) permet de démarrer la partie, on peut alors tirer des numéros en cliquant sur le bouton "Effectuer un tirage", le nombre de tirages effectués étant affichés en dessous. Lorsque les 90 numéros ont été tirés, on peut "terminer la partie", c'est à dire vider la liste des joueurs et celle des numéros.
Au démarrage de l'application côté client, l'utilisateur est invité à entrer un nom, s'il n'en rentre pas, le nom "Guest" lui est attribué. Ensuite lors de la connection, le nom du client est passé en paramètre, et le serveur va regarder si un autre client déjà inscrit, auquel cas le premier client est invité à resaisir un autre nom. |
Au niveau de l'affichage de la liste des joueurs, subsiste un bug : à force de connexion/déconnexion, le nom du joueur ne s'insère plus dans la liste graphique, bien qu'il soit présent dans la liste des objets "Joueur" (on peut le vérifier en cliquant sur le bouton "Prêt" du dit joueur, à ce moment, le serveur réagit e active le boutons de démarrage de partie). En testant le jeu, nous avons pu nous rendre compte que ce jeu n'est pas très interressant (sisi c'est vrai!), mais qu'il était robuste. Nous l'avons testé avec plusieurs joueurs, les résultats sont concluant : pas de défaillance..
Nous n'avons pas coder le fait que le client se déconnecte lorsqu'il ferme la fenêtre brutalement. Pour l'instant la fin est quasi-inexistante, dans ce sens que, la fin est détectée, mais rien ne se passe. Nous n'avons pas du tout pris en compte, le fait que, dans le vrai Bingo, lorsqu'un joueur a toute une ligne cochée, il gagne des points, et que de manière générale, il peut gagner des points. L'application ne permet pas également de faire plusieurs parties à la suite.
Le développement de cette application nous a permis de prendre connaissance avec le langage Java et de ses bibliothéques standards. Le Java est un langage qui permet de développer rapidement une application graphique qui a l'enorme avantage d'être portable, et qui offre de multiples possibilités facilement accessibles. L'utilisation des RMI, nous a fait découvrir toutes la puissance de cet outil. En effet, il permet d'élever le développement d'applications distribués à un niveau d'abstraction très appréciable.