Projet Cartagena
Architecture de jeu pour Cartagena
Le jeu Cartagena est un jeu de plateau où chaque joueur incarne un groupe de pirates qui tentent de s'échapper de la prison de Carthagène en parcourant un circuit de 36 cases de long menant de leur cellule jusqu'à un providentiel bateau. Le sujet de ce projet va consister à mettre en place des clients capables de jouer à une version élémentaire de ce jeu. Les clients seront mis en relation à l'aide d'un serveur central, qui proposera différentes possibilités d'affichage de la partie en cours.
Protocole de communication
_Il est demandé à ce que tous les clients et serveurs soient interopérables. Pour respecter ces conditions, ils devront respecter les conditions suivantes pour communiquer.
Remarques générales :
Séquence envoyée par le serveur au client à la première connexion :
Séquence du serveur à tous les clients :
A chaque tour d'un joueur, le serveur envoie à tous les clients l'état du jeu :
Pour une partie à 5 joueurs, le serveur enverrait donc à tous les joueurs: au début de son tour :
Remarques générales :
- Tout échange entre client et serveur doit se faire en mode texte, encodé en ASCII.
- Chaque ligne de texte échangée ne doit pas dépasser 80 caractères. Les caractères dépassant cette limite seront ignorés.
- Toute séquence d'ordres entre client et serveur doit impérativement se terminer par une ligne seule contenant la chaîne de caractères Done pour être prise en compte. Les lignes supplémentaires seront considérées comme faisant partie de la séquence d'ordre du tour suivant.
- Le client lit les données sur son entrée standard, et écrit ses ordres sur sa sortie standard.
Séquence envoyée par le serveur au client à la première connexion :
- Lors de la connexion d'un client et uniquement à ce moment là, le serveur envoie comme tout premier message une ligne avec l'ID du joueur sous la forme ID n où n est entre 0 et 4
- Ensuite, il envoie les lignes suivantes décrivant le plateau et la main de départ.
- Le plateau de jeu est constitué de 6 segments contenant chacun 6 symboles différents parmi pistolet P, sabre S, clé K, tête de mort T, bouteille B, chapeau C, arrangés aléatoirement. Le serveur envoie donc 6 lignes. Chaque ligne est une permutation des caractères de la chaine "P S K T B C" précédée du mot clé Segment Exemple : Segment T S B K C P
- Le serveur distribue la main de départ du joueur : 6 cartes représentant les différents symboles. Dans le jeu, le paquet de cartes est composé de 102 cartes (17 par symboles). Mais il est possible dans un premier temps de tirer chaque carte avec un probabilité 1/6 pour chaque symbole. La chaîne de caractères sera composée de 6 symboles (chacun pouvant apparaître plusieurs fois) précédés du mot-clé Hand n (n est le nombre de cartes de la main).
Exemple : Hand 6 P K P T T C pour une main composée de 2 pistolets, une clé, 2 têtes de mort et un chapeau.
Séquence du serveur à tous les clients :
A chaque tour d'un joueur, le serveur envoie à tous les clients l'état du jeu :
- A qui c'est le tour :
- Player n (n est l'ID du joueur),
- Ou bien, si un joueur est vainqueur (ses 6 pirates sont dans un bateau: Winner n (n est l'ID du joueur)
- Pour chaque joueur, où se trouvent ses pirates: sous la forme Position n pos1 pos2 ... pos6 où n est le numéro du joueur et posi est la position du pirate numéro i de ce joueur. La valeur d'une position est un nombre entre 0 et 37. 0 pour la prison, 37 pour le bateau et 1 à 36 pour les 36 cases du circuit.
- Pour chaque joueur, quelle est la taille de sa main sous la forme HandSize n m où n est le numéro du joueur et m le nombre de cartes en main.
Pour une partie à 5 joueurs, le serveur enverrait donc à tous les joueurs: au début de son tour :
Player 0 Position 0 0 0 0 0 0 0 Position 1 0 0 0 0 0 0 Position 2 0 0 0 0 0 0 Position 3 0 0 0 0 0 0 Position 4 0 0 0 0 0 0 HandSize 0 6 HandSize 1 6 HandSize 2 6 HandSize 3 6 HandSize 4 6 Done
Séquence envoyée par le client au serveur :
- Chaque joueur peut faire 3 actions maximum : avancer un pirate en jouant une carte, reculer un pirate pour gagner une ou deux cartes. Dans tous les cas la séquence commence par le mot-clé Action envoyé seul.
- Si l'action est de faire avancer un pirate la syntaxe est : Advance m symbole où m est le numéro du pirate (entre 0 et 5) et symbole vaut "P", "S", "K", "T", "B" ou "C".
- Si l'action est de faire reculer un pirate la syntaxe est : Reverse m ou m est le numéro du pirate (entre 0 et 5).
Action Advance 2 T Advance 1 K Reverse 1 Done
Actions réalisées par le serveur :
Remarque : contrairement au jeu original, les cartes reçues en réalisant cette action ne seront distribuées au joueur que pour le tour suivant.
- Le serveur lit les commandes envoyées par le client jusqu'à la réception de Done. Si plus de 3 actions sont envoyées, seules les 3 premières sont prises en compte.
- Toute commande concernant un pirate dans le bateau est ignorée
- Si la commande est Advance le pirate est avancé jusqu'à la première case libre correspondant au symbole joué. Si aucune case ne correspond à ce critère, le pirate a traversé le circuit et est mis dans le bateau. Si le client ne possède pas la carte jouée, le serveur doit ignorer la commande.
- Si la commande est Reverse le pirate est reculé jusqu'à la première case où il y a 1 ou 2 pirates. Si aucune case ne correspond à ce critère, le pirate est remis en début de circuit (la prison)
- Une fois le ou les ordres réalisés, le serveur met à jour la main du joueur en retirant les cartes utilsées pour avancer un pirate et en rajoutant des cartes lorsqu'un pirate a reculé suivant la règles : + 1 carte si le pirate a reculé sur une case ou il y avait 1 pirate (ou la case prison), + 2 cartes si le pirate a reculé sur une case où il y avait deux pirates. Ensuite le serveur renvoie au client la main de celui-ci sous la forme Hand <cartes>
Remarque : contrairement au jeu original, les cartes reçues en réalisant cette action ne seront distribuées au joueur que pour le tour suivant.
Partie Client
Il est demandé d'écrire un client capable de jouer à Cartagena, en utilisant le protocole précédent. L'algorithme décidant des sera basé sur l'idée d'alpha-beta pruning (cf. par exemple chap. 13 du cours de Stanford). La gestion du hasard pourra se faire avec une méthode de type Monte-Carlo.
Partie Serveur
_Il est demandé d'écrire un serveur capable de gérer les actions des clients 1 par 1. Le serveur doit vérifier que les règles du jeu sont bien respectées par les clients, calculer le nouvel état du jeu, et le renvoyer correctement au client. Il doit aussi réaliser un affichage lisible du plateau à chaque tour de jeu, en utilisant la bibliothèque ncurses.
Recommandations :
- Dans tous les cas, il est recommandé de faire le plus simple possible, avant d'atteindre le compliqué
- L'accent doit être mis sur les tests du client et du serveur. Des règles de compilation doivent être mises en place pour faire ces tests de manière automatisée, que ce soit pour la partie client ou la partie serveur.
- A part le code lui-même, il est recommandé d'échanger les cartes (par exemple sur un forum de la forge). Il est aussi recommandé de tester ses clients sur différents serveurs et réciproquement.
Extensions
On pourra implanter plusieurs variantes
- Partie à handicap. Modifier le protocole pour que le nombre de pirates par joueurs devienne une variable. Les joueurs forts pourront avoir plus de pirates à gérer que les faibles
- Partie ouverte. Tout le monde sait quelles cartes ont les autres joueurs et les 12 prochaines cartes qui vont être tirées.