Mini-Projet ABALONE Rapport écrit Groupe B4 Laurent FRADIN laurent.fradin@ens2m
Mini-Projet ABALONE Rapport écrit Groupe B4 Laurent FRADIN laurent.fradin@ens2m.org Arnaud LEUNG-TACK arnaud.leungtack@ens2m.org Rédigé le 18/06/10 Sommaire 1) Introduction 2) Analyse du problème, cahier des charges 1) Capture des besoins 2) Initialisation du plateau : définition des types plateau, élement_plateau 3) Visionnage des coups joués : définition des types séquence, coup_joué 4) Spécification des sous-programmes principaux 3) Implantation 1) Définition précise des types plateau, element_plateau 2) Définition précise des types sequence, coup_joue 3) Explication détaillée de l’initialisation du plateau 4) Schéma explicatif du sous-programme PointerCase 5) Ecriture en pseudo-langage du sous-programme Deplacement 6) Explications détaillées des sous-programmes permettant de gérer l’interface console 4) Conclusion 5) Liste de tous les sous-programmes utilisés dans le projet Abalone I. Introduction Le but de ce mini-projet est de créer une interface de jeu afin que 2 joueurs puissent s’affronter sur Abalone et une fois la partie la partie terminée, de pouvoir visionner chacun des coups joués par les 2 joueurs. Une des difficultés consiste à traduire en langage C++ les différentes cases et le déplacement des boules sur le plateau. En effet, le plateau d’Abalone a la forme particulière d’un hexagone et les abscisses des cases sont alors repérées en diagonale comme sur le schéma ci-contre. A cela s’ajoutent les différentes règles d’Abalone (Sumito, Pac, mouvement en ligne…) qui restreignent les choix de déplacement des boules. Le joueur noir commence toujours la partie et la partie s’arrête dès qu’un joueur a réussi à éjecter 6 boules adverses. Nous avons choisi la 1ère représentation de programmation conseillée dans le sujet, c’est-à- dire représenter toutes les cases du plateau sous forme d’une liste chaînée. Ainsi chaque case comporte 6 pointeurs afin de pouvoir accéder aux cases adjacentes. Les bords du plateau sont représentés par un pointeur NULL. L’accès au plateau se fait via le pointeur de tête positionné en A1. Enfin, le joueur pourra déplacer la boule en cliquant sur celle-ci puis sur la position finale de la boule. II. Analyse du problème, cahier des charges 1) Capture des besoins Lorsque nous nous sommes engagés sur la représentation de toutes les cases du plateau, la 1ère question a été de se demander de quels sous-programmes nous aurions besoin afin de relier toutes les cases du plateau entre elles pour créer un plateau vide. Le plateau étant de forme hexagonale, il fallait trouver un moyen de rentrer toutes les cases dans une liste chaînée sans alourdir le programme. Nous avons donc créé les sous programmes CreerLigneVide, AjouterLignePlateau et CréerPlateauVide décrits dans la partie Implantation. Après avoir placé les boules dans l’état initial du jeu, nous nous sommes intéressés aux différentes conditions de déplacement imposées par les règles du jeu : Le joueur doit cliquer sur une boule de sa couleur La case d’arrivée doit être adjacente à la case de départ Le joueur ne peut déplacer que 3 boules au maximum La règle du Sumito impose d’être en supériorité numérique lorsqu’un joueur pousse les boules adverses En cas d’égalité numérique (Pac), le mouvement est impossible Ces conditions de déplacement ont été écrites via 4 sous-programmes : CaseAdjacente, PresenceBouleCouleur, NombreMax et Sumito. Nous avons ensuite implanté ces conditions dans un sous-programme Déplacement qui modifie le plateau selon le déplacement imposé. La règle du jeu impose de plus que chaque joueur ne peut effectuer qu’un mouvement par tour. Les déplacements du joueur noir puis du joueur blanc ont donc été insérés dans une boucle qui s’arrête lorsque la condition de victoire a été validée. Le sous- programme CompteurBoulesEjectees permet de savoir le nombre de boules éjectées pour chacun des joueurs. Il est ensuite utilisé par le sous-programme Victoire qui permet de terminer la partie lorsque 6 boules d’une même couleur ont été éjectées. Vient ensuite la possibilité de visionner chaque coup joué de la partie précédente. Pour cela, nous avons créé un fichier texte « sequence » qui enregistre les coordonnées de départ et d’arrivée de chaque coup joué. A chaque fin de partie, ce fichier est écrasé par les nouvelles coordonnées des coups joués. L’utilisateur a alors le choix de visionner la partie via le menu principal. En appuyant sur une touche du clavier, il peut alors voir le coup joué sur le plateau, le numéro du tour et les coordonnées correspondant au mouvement. Pendant la dernière partie de la programmation, nous nous sommes concentrés sur l’interface et la représentation du plateau. Au départ nous avons utilisé par défaut l’invite de commande afin d’afficher le plateau. Les coordonnées de départ et d’arrivée devaient alors être rentrées au clavier afin de pouvoir déplacer une boule. L’utilisation des outils Console et Coord, fournis dans le dossier « outils utiles à la programmation », nous ont permis plutôt d’ouvrir une fenêtre console et ainsi de cliquer sur la boule à déplacer. Cependant l’utilisation de ces outils nous a mis face à de nouveaux problèmes : Nécessité d’établir une règle de passage des coordonnées du repère de la console à celles du plateau. Nécessité d’établir de nouveaux sous-programmes afin de ne pas faire planter le programme lorsqu’un joueur ne clique pas sur une case définie. Il ne restait plus ensuite qu’à créer des menus et modifier l’apparence de l’interface afin que celle-ci soit ergonomique. 2) Initialisation du plateau : définition des types plateau, element_plateau Le type plateau correspond au pointeur qui permet d’accéder à toutes les cases du plateau. Element_plateau correspond à une case du plateau. Elle est définie par ses coordonnées (abscisse et ordonnée en chiffre), la présence d’une boule noire, blanche ou non et enfin les 6 cases adjacentes. Pour plus de clarté, nous les avons nommées comme des points cardinaux. 3) Visionnage des coups joués : définition des types séquence, coup_joue Le type sequence correspond au pointeur qui permet d’accéder à tous les coups joués de la partie précédente. Le type coup_joue correspond à un coup joué contenu dans la séquence. Il est défini par les coordonnées de départ et d’arrivée (abscisse et ordonnée en chiffre) et le coup joué suivant. 4) Spécification des sous-programmes principaux /* Initialisation du plateau */ plateau CreerPointeurVide (void); //Crée le pointeur de tête plateau CreerLigneVide (int longueur, int ord); //Crée une ligne de cases vides plateau AjouterLignePlateau (plateau P1, plateau P2, int ligne); //Ajoute une ligne du plateau à une autre ligne plateau CreerPlateauVide (void); //Concatène les lignes et relie les pointeurs afin de créer un plateau de 9 lignes void PlacerBoules (plateau &P); //Modifie les valeurs des cases afin de placer les boules blanches et noires en début de partie /* Actions de l'utilisateur */ void Deplacement (int Da, int Do, int Aa, int Ao, plateau &P, int couleuractif, int couleurpassif, int &r); //Déplace la boule sur le plateau en fonction du déplacement choisi par l'utilisateur Nord-Ouest Nord-Est Ouest Est Sud-Ouest Sud-Est /* Fin de partie */ int CompteurBoulesEjectees (int couleur,plateau P); //Compte le nombre de boules éjectées de même couleur bool Victoire (plateau P); //Renvoie vrai si 6 boules d'un joueur ont été éjectées, faux sinon /* Visionnage des coups joués de la partie précédente */ void Visionnage (sequence S,plateau P, int n); //Permet de visionner tous les coups joués d'une partie précédente void EnregistrementSequence (sequence S); //Enregistre les coups joues dans un fichier texte sequence ChargementSequence (); //Crée une séquence à partir d'un fichier texte III. Implantation 1) Définition précise des types plateau, element_plateau /* Définition du plateau comme une collection de cases (element_plateau) */ typedef struct element_plateau* plateau; typedef struct element_plateau { int abscisse; //retourne les coordonnées de la case int ordonnee; int valeur; //=0 si pas de boule;=1 si présence d'une boule noire;=2 si présence d'une boule blanche plateau O,NO,NE,E,SE,SO; //pointeurs sur les 6 cases adjacentes } element_plateau; 2) Définition précise des types sequence, coup_joue /* Définition de la séquence des coups joués comme une liste chaînée */ typedef struct coup_joue* sequence; typedef struct coup_joue { int Da; // abscisse de départ int Do; // ordonnée de départ int Aa; // abscisse d'arrivée int Ao; // ordonnée d'arrivée sequence suivante; } coup_joue; 3) Explication détaillée de l’initialisation du plateau L’initialisation du plateau a été la partie la plus difficile de la programmation car elle fait intervenir de nombreux pointeurs. Nous allons expliquer ci-dessous le raisonnement effectué pour créer le plateau avec les boules à l’état initial. La 1ère étape a été d’imaginer un processus itératif permettant de relier le plus de cases possibles entre elles grâce aux 6 pointeurs adjacents. Nous avons alors remarqué que chaque ligne du plateau avait les mêmes caractéristiques mises à part leur longueur qui varie suivant l’ordonnée. En effet chaque ligne commence par une case dont le pointeur Ouest est NULL et se termine par une case dont le pointeur Est est NULL. Entre ces 2 cases, toutes les cases sont reliées par le fait que le pointeur Est correspond au pointeur Ouest de la case adjacente droite et le pointeur Ouest correspond au pointeur Est de la case adjacente gauche. Cela à conduit à créer le sous-programme CreerLigneVide : plateau CreerLigneVide (int longueur, int ord) //longueur=nombre uploads/Sports/ rapport-ecrit-abalone.pdf
Documents similaires
-
14
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Apv 14, 2022
- Catégorie Sports
- Langue French
- Taille du fichier 1.1027MB