Programmation impérative, projet 2014
Dates et principe
Cette page peut être mise à jour, avec informations complémentaires,
précisions,
questions
bonus, etc. Pensez à y revenir souvent.
Projet à rendre pour le
14/11 à
23h59, aucun retard ne sera toléré.
Des soutenances pourront être organisées ensuite.
Lire tout le sujet.
Un rendu de projet comprend :
- Un rapport typographié précisant vos choix, les problèmes
techniques qui se posent et les solutions trouvées ; il précise en
conclusion les limites de votre programme. Le rapport sera de
préférence composé avec LaTeX. Le soin apporté à la grammaire et à
l'orthographe est largement pris en compte.
- Un code abondamment commenté ; la première partie des
commentaires comportera systématiquement les lignes :
- @ requires décrivant les préconditions : c'est-à-dire
conditions sur les paramètres pour une bonne utilisation (pas de
typage ici),
- @ assigns listant les zones de mémoire modifiées,
- @ ensures décrivant la propriété vraie à la sortie de la
fonction lorsque les préconditions sont respectées, le cas échéant
avec mention des comportements en cas de succès et en cas d'échec,
En outre chaque boucle while doit contenir un commentaire
précisant la raison de sa terminaison (le cas échéant).
On pourra
préciser des informations additionnelles si des techniques
particulières méritent d'être mentionnées.
Le code doit enfin compiler sans erreur (évidemment) et sans warning lorsque
les options -Wall -Wextra -ansi sont utilisées.
- Un manuel d'utilisation de votre exécutable, même minimal, est toujours bienvenu.
Avez-vous lu tout le sujet ?
Protocole de dépôt
Vous devez rendre
- Votre rapport (en pdf) et
- Vos fichiers de code
rassemblés dans une archive tar gzippée identifiée
comme
votre_prénom_votre_nom.tgz.
La commande
devrait ressembler à :
tar cvfz randolph_carter.tgz rapport.pdf fichiers.c
autres_truc_éventuels.c…
N'OUBLIEZ surtout PAS de mettre le nom identifiant l'archive
(donc nouveau)
en PREMIER.
Lisez le man ! et testez le contenu de votre archive (une
commande comme par exemple :
tar tvf
randolph_carter.tgz doit lister les fichiers et donner leur
taille). Une archive qui ne contient pas les fichiers demandés ne
sera pas excusable.
Vous devez enregistrer
votre archive tar dans le dépôt dédié au cours IPI (ipi-2014) en vous
connectant à http://exam.ensiie.fr. Ce dépôt sera ouvert
jusqu'au 14 novembre inclus.
Contexte
Le but de ce projet est d'implanter une plateforme de jeu de
type Pareil ou Bonboncrush.
Les jeux de ce type se présentent sous la forme d'un tableau en
deux dimensions dans lequel sont empilés des objets de différentes
familles, initialement placés dans tout le tableau de façon
aléatoire.
Les objets de même famille forment des groupes,
c'est-à-dire des ensembles dont les éléments sont voisins directs
d'autres éléments (voisinage par dessus, par dessous, par la droite
ou par la gauche).
Le principe général de ces jeux est de faire disparaître ces
groupes, par sélection d'un groupe d'au moins deux éléments (Pareil)
ou par construction d'un groupe d'au moins trois éléments (Bonboncrush).
Vous devez au minimum réaliser le jeu Pareil.
Pareil
Fonctionnement
- Le but du jeu est de faire disparaître tous les objets du
tableau tout en faisant le maximum de points.
- Le jeu prend fin lorsque tous les objets ont disparu ou lorsqu'il
devient impossible de faire disparaître des objets.
- Le joueur sélectionne un groupe d'au moins deux éléments en
désignant l'un d'eux.
- Un groupe sélectionné est mis en évidence au niveau de
l'affichage.
- Sur confirmation du joueur, tous les éléments du groupes
disparaissent.
- Les objets situés au dessus d'un trou (objet disparu)
descendent dans celui-ci en laissant un trou à leur
emplacement initial.
- Les colonnes situées à droite d'une colonne ne comportant
que des trous sont déplacées vers la gauche.
- Le total des points est mis à jour :
- L'élimination d'un groupe de n objets
rapporte (n-1)*(n-2)/2 points.
- L'élimination de tous les objets du tableau rapporte 1000
points.
- On revient alors à la phase de sélection.
Interface
On travaille dans un premier temps en mode texte.
L'affichage propose le tableau et ses objets dont les quatre
familles sont représentées respectivement par les lettres X,O,H,A.
En dessous du tableau se trouvent :
- Une ligne de - de la largeur du tableau,
- Le score à jour à gauche en dessous de cette ligne,
- L'invite de sélection/confirmation à l'extrême droite et en
dessous de cette ligne.
Initialement les largeur et hauteur du tableau sont demandées ;
l'affichage et le remplissage initial se font en fonction des
entiers entrés.
L'origine du repère est le coin en bas à gauche.
Lorsqu'un objet est sélectionné par son abscisse et son ordonnée,
tous les objets de son groupe sont représentés par le caractère # et
une confirmation est attendue.
- Si le caractère 'y' est entré, le groupe est effacé et le
tableau mis à jour.
- Si un autre caractère que 'y' est entré, rien ne se
passe.
L'affichage est rafraîchi chaque fois que des objets sur une ligne
prennent la place des trous directement en dessous d'eux.
Un affichage spécifique alerte de la fin de partie.
Bonboncrush
Fonctionnement
- Le but du jeu est d'atteindre une certaine limite de points en
faisant disparaître des groupes d'objets.
- Le joueur sélectionne un objet.
- La saisie supplémentaire d'une direction désigne un voisin direct
de l'objet sélectionné.
- Si la transposition des deux voisins crée un ou deux groupes
d'au moins trois objets, la transposition a lieu et ces groupes
disparaissent.
- Sinon rien ne se passe (pas de transposition).
- Le score est mis à jour à chaque disparition de groupe :
l'élimination d'un groupe de n objets
rapporte (n-1)*(n-2)/2 points.
- Les objets situés au dessus d'un trou (objet disparu)
descendent dans celui-ci en laissant un trou à leur
emplacement initial.
- Les cases laissées vides sont remplies en totalité
aléatoirement par des objets.
- Tant que des groupes de plus de trois objets sont créés par
ces opérations, ils disparaissent à leur tour et les deux étapes
précédentes sont répétées.
- On revient à l'étape de sélection.
- Tous les 1000 points, une nouvelle famille peut
apparaître (lors des remplissages aléatoires).
Interface
On travaille dans un premier temps en mode texte.
L'affichage propose le tableau et ses objets dont les cinq familles
initiales sont représentées respectivement par les lettres
X,O,H,A,Z.
En dessous du tableau se trouvent :
- Une ligne de - de la largeur du tableau,
- Le score à jour à gauche en dessous de cette ligne,
- L'invite de sélection à l'extrême droite et en
dessous de cette ligne.
Initialement les largeur et hauteur du tableau sont demandées ;
l'affichage et le remplissage initial se font en fonction des
entiers entrés.
L'origine du repère est le coin en bas à gauche.
Un objet est sélectionné par la donnée de son abscisse et de son
ordonnée, une direction est donnée
par h (haut), b (bas), d
(droite), g (gauche). Attention le tableau est
torique : le voisin de droite d'un objet de la colonne à l'extrême droite est
sur la colonne de l'extrême gauche, symmétriquement le voisin de
gauche d'un objet de la colonne à l'extrême gauche est sur la
colonne à l'extrême droite.
L'affichage est rafraîchi chaque fois que des objets sur une ligne
prennent la place des trous directement en dessous d'eux.
Un affichage spécifique alerte de la fin de partie.
Conseils
Pour la récupération des caractères de confirmation
pour
Pareil et de direction pour
Bonboncrush il
est
fortement déconseillé d'utiliser :
- atoi, préférez strtol dans la mesure du
possible ;
- scanf avec %c qui a un comportement un peu
particulier. Une solution de remplacement consiste à utiliser le
format %1s de la façon suivante :
char c;
char buffer[2]; /* 2 car 1 caractère PLUS le \0 des chaînes */
scanf("%1s", buffer);
c=buffer[0];
Pour récupérer un deuxième caractère on réitère cette opération, avec
le même tableau buffer.
Vous devez avoir lu jusqu'ici avant de commencer.