Modalités de rendu
===================
Groupe de News: epita.cours.c++
Sujet de mail Yaka [CHESS]
Date de rendu: vendredi 14 fevrier 2003 - 12:00:00
Nom de l'exécutable: chess
Répertoire de rendu: ~/rendu/cpp/chess/
Droits sur le rep et les exos: 700 sur ~/rendu/cpp/, ~/rendu/cpp/chess/
600 pour les fichiers
o+x ~/ ~/rendu/ ~/rendu/cpp/
Modalités: Ce mini-projet est à faire en binôme
Compilateur: g++-3.2 (Sur les dp)
Tools: flex bison (Sur le compte d'akim)
Les informations ci-dessus peuvent changer jusqu'au 13/02/2003 12h00.
La tarball compressée avec bzip2 devra s'appeler login1-chess.tar.bz2 et
se décompresser dans le sous-répertoire login1-chess/. login1 désigne
le chef de groupe. On ne veut qu'une et une seule tarball par groupe !
Sujet
=====
Cet exercice a pour but de vous familiariser avec le langage C++.
L'objectif est de vous faire utiliser les notions vues en TP, à
savoir les classes abstraites, les hiérarchies, encapsulation ...
Dans ce sujet, comme dans les suivants que vous donneront les Yakas,
une importance toute particulière sera portée sur vos capacités :
- effectuer des recherches par vous-mêmes
- livrer un code propre et commenté
- implémenter une solution performante
- réaliser un jeu de tests complet de votre projet
Ces objectifs comptent pour moitié dans la notation : il est
impossible de dépasser 10/20 sans les avoir atteints.
Le but de ce mini-projet est de réaliser un parser de partie
d'échecs. Il doit prendre en entrée un fichier comportant
la liste des coups de cette partie sous une forme simplifiée,
et ressortir de manière explicite le déroulement de la partie.
Exemples :
==========
PROMPT$ cat testscanerror
// Ceci est un commentaire
a4-a2
a4-a6
// error de scan
a4-_h
b2-b4
PROMPT$ ./chess testscanerror
scan error unexpected character : '_'
PROMPT$ echo $?
2
PROMPT$
PROMPT$ cat invalid_parse_error_empty_line
a4-a2
a4-a6
//
a2-a3
a3-a4
POMPT$ ./chess invalid_parse_error_empty_line
parse error unexpected TOKEN END
PROMPT$ echo $?
3
PROMPT$
PROMPT$ cat invalid_parse_error_bad_token
a4-a2
a4-a6
//
a2a3
a3-a4
POMPT$ ./chess invalid_parse_error_bad_token
parse error unexpected TOKEN 'a' expecting '-'
PROMPT$ echo $?
3
PROMPT$
PROMPT$ cat testinvalidcoup
// Mouvement d'un pion noir
a7-a6
// Mouvement d'un pion noir
b7-b5
// Mouvement d'une tour blanche
a1-a3
// a7 est vide
a7-a6
b5-b4
PROMPT$ ./chess testinvalidcoup
1. black pawn moves from a7 to a6
2. black pawn moves from b7 to b5
3. white rook moves from a1 to a3
4. Invalid move
PROMPT$ echo $?
1
PROMPT$
Quelques contraintes :
- Comme le montre les exemples ci-dessus :
- une erreur de scanner ou de parser entraine une sortie immédiate
du programme (Pas de vérification de la validité des coups)
- Au niveau de la vérification des coups, le programme s'arrete au
premier coup invalide
- Si la pièce qui doit être déplacée peut, selon les règles, aller
jusqu'à la case de destination. Normalement seul le cavalier peut
passer au dessus d'autres pièces, mais on considère que toutes le
peuvent.
- Il doit gérer la prise d'une pièce (cette pièce disparaît alors de
l'échiquier).
- Il doit détecter la mise en échec. La mise en échec et mat n'est pas
obligatoire, ainsi que le Pat.
- Roque : Vous devez juste vérifier que le Roi n'est en échec ni au
début ni à la fin du mouvement. Dans le fichier d'entrée c'est un
mouvement de deux cases du Roi qui déclenche le Roque. Il faut aussi
vérifier que les cases d'arrivée du Roi et de la Tour sont vides.
- Précisions pour les esprits tordus. On ne testera pas des parties
ou l'alternance blanc, noir n'est pas respecté.
- Il faut vérifier qu'une pièce ne prend pas une pièce de sa propre
couleur. Une pièce n'a pas le droit de se déplacer sur sa propre
case.
- La prise réelle du roi adverse n'est pas un coup valide.
Format d entrée
===============
Quelques précisions sur le format d entrée qui vous est imposé.
coup ::= [a-h][1-8]'-'[a-h][1-8]'\n'
comment ::= "//".*\n
Un fichier d'entrée est composé de plusieurs coups, un par ligne et
il faut pouvoir gérer les commentaires.
Format de sortie (a afficher sur la sortie standard)
================
Quelques précisions sur le format de sortie qui vous est imposé.
Sachant que :
Piece = [rook|pawn|queen|king|bishop|knight]
Color = [black|white]
X = numéro du coup
Si vous détectez un déplacement vous devez ressortir :
>X. Color Piece moves from [case1] to [case2] [. Check]
Si vous détectez une prise :
>X. Color Piece on [case1] takes Color Piece on [case2] [. Check]
Si vous détectez un roque
>X. Color Piece does a [big|little] castling [. Check]
Si vous détectez un coup invalide :
>X. Invalid move
Vous sortez du programme au premier coup invalide.
Le [. Check] est à afficher si le roi adverse est alors en échec
Il peut se mettre sur toutes les lignes, sauf Mouvement impossible.
NB : Chaque ligne correspond à un Coup. le dernier Coup de la partie
doit se terminer par un retour chariot.
Description de l'échiquier
==========================
a b c d e f g h
---------------------------------
8 | t | c | f | d | r | f | c | t |
---------------------------------
7 | p | p | p | p | p | p | p | p | <== Pièces noires
---------------------------------
6 | | | | | | | | |
--------------------------------- P/p : Pawn T/t : Rook
5 | | | | | | | | |
--------------------------------- C/c : Knight F/f : Bishop
4 | | | | | | | | |
--------------------------------- D/d : Queen R/r : King
3 | | | | | | | | |
---------------------------------
2 | P | P | P | P | P | P | P | P | <== Pièces blanches
---------------------------------
1 | T | C | F | D | R | F | C | T |
---------------------------------
a b c d e f g h
NB: Les pièces noires sont représentées en minuscule et les
blanches en majuscule
Implémentation
==============
Il est bien évident que ce projet n'a pour but que de vous faire
réflechir à une modélisation de projet. Avant d'attaquer ce mini-projet,
il vous est fortement recommandé d'élaborer vos classes et hiérarchies sur
papier. Dans cette modélisation doit obligatoirement apparaître au minimum
une hiérarchie de classe ayant pour classe de base une classe abstraite.
Il est donc fortement conseillé de faire une hiérarchie correspondant aux
coups possibles et une autre correspondant aux pièces du jeu.
Il vous est demandé d'utiliser flex et bison pour parser
le fichier donné en entrée du programme. Il est aussi fortement conseillé
d'utiliser les templates de la STL (list, vector ...). Enfin vos fichiers devront
avoir les extensions .cc et .hh etant donné que vous faites du C++.
Sortie d'erreur
===============
Votre programme devra respecter les sorties d'erreur suivantes :
0 -> Si la partie s'est bien déroulée et que tous les coups étaient valides.
1 -> Si un coup n'était pas valide
2 -> Si il y a eu une erreur de scanner
3 -> Si il y a eu une erreur de parsing
Vous devez de plus afficher un message d'erreur explicite.
Bonus
=====
Cette section décrit les boni que vous pouvez implémenter. Ces bonus
ne doivent pas s'exécuter par défaut mais doivent être appelés de manière
explicite en ligne de commande. Ces boni ne seront corrigés que si la partie
obligatoire fonctionne parfaitement. Ci-dessous une liste non-exhaustive des
boni possibles, en ordre croissant de difficulté. Il est fortement conseillé
de les faire dans l'ordre (l'un vous aidant à faire le suivant).
* '--help' (-h) ==> MOT CLE : help
Si vous implementez une seule des options, il est obligatoire de rajouter
celle-là, qui affiche la liste des options disponibles.
* '--step' (-s) ==> MOT CLE : step
Cette option active le déroulement de la partie en mode pas à pas. On doit
pouvoir avancer ou reculer dans la partie d'un coup au moins, à l'aide du
clavier.
* '--display-text' (-t) ==> MOT CLE : display-text
Cette option active l'affichage du plateau de jeu en mode texte à chaque coup.
Elle implique l'option '--step'. L'affichage est laissé à votre discrétion.
* '--display-X' (-x) ==> MOT CLE : display-X
Cette option active l'affichage du plateau de jeu en mode graphique à chaque
coup. Elle implique l'option '--step'. L'affichage est laissé à votre
discrétion, vous pouvez utiliser n'importe quelle librairie graphique (Gtk,
OpenGL ...)
* '--rules' (-r) ==> MOT CLE : rules
Cette option active la vérification des règles qui ne figurent pas dans la
partie obligatoire :
- Lors du déroulement de la partie il faut vérifier l'alternance des
coups entre pièces noires et blanches.
- Lors d'un déplacement, une pièce ne peut pas passer au dessus d'une
autre (sauf le cavalier)
- Détection de l'échec et mat.
Pour cette détection il vous faudra afficher selon le format suivant
[. Check Mat] au lieu de [. Check]
- Détection du Pat (match Nul), pour les gens vraiment ultra motivés :)
- Règle de la prise en passant.
Pour cette détection il vous faudra afficher selon le format suivant
>X. Color Piece on [case1] takes Color Piece en passant on [case2] [. Check]
- Il est interdit de déplacer l'une de ses pièces si ce mouvement a
pour conséquence que son propre Roi se trouve en position d'Echec.
- Règle de la promotion du pion (Seule la promotion vers Dame est à
gérer)
Pour cette détection il vous faudra afficher selon le format suivant
>X. Color Piece on [case1] takes Color Piece on [case2] [promotion] [. Check]
ou
>X. Color Piece moves from [case1] to [case2] [promotion] [. Check]
- Autres contraintes du roque.
Ce bonus sera corrigé même si toutes ces règles ne sont pas implementées.
La tarball de rendu
===================
La tarball de rendu devra contenir obligatoirement les fichiers suivants
et sous cette forme.
- AUTHORS
Prenom1 Nom1
Prenom2 Nom2
- LINKS
Contient :
#http://mon.site.web.interressant/
Titre Auteur
(Attention ne mettez pas de # dans les différentes descriptions)
- ChangeLog
Contient :
AAAA-MM-JJ Prenom NOM :
* example.hh: fait ca
- TODO
Contient :
La liste des choses qu'il reste ? faire (ce n'est pas forcément vide...)
- Makefile
Contient :
- une règle "check" qui permet de lancer votre jeu de tests et signale les
tests problèmatiques.
- une règle "all" et une règle "clean" qui font le travail classique que
l'on attend de ces règles.
- chess
Attention votre exécutable devra être généré a la racine de votre tarball.
- src/
Répertoire contenant vos sources
- test/
Répertoire contenant vos tests
Si vous faites des options (seul moyen d'être noté sur vos options) :
- OPTIONS
Mettez une ligne contenant le mot clé spécifique à l'option, si ce n'est
pas fait ce n'est pas corrigé (Si une option implémentée n'a pas été prévue,
mettez le mot clé: "autre", suivi d'une description brève de cette option).
Références
==========
Règles des échecs :
http://www.conservativebookstore.com/chess/index.htm
|