Programmation impérative, projet 2015
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
4/1/2016 à
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.
- **Une archive qui n'est pas au format demandé (archive
tar gzippée avec suffixe .tgz) ne sera
pas corrigée** donc c'est 0/20.
Vous devez enregistrer
votre archive tgz dans le dépôt dédié au cours IPI (ipi-2015) en vous
connectant à http://exam.ensiie.fr. Ce dépôt sera ouvert
jusqu'au 4 janvier inclus.
Contexte
Le but de ce projet est d'implanter une plateforme de jeu de
type deux-mille-quarante-boum.
Ce jeu se présente sous la forme d'un tableau en deux dimensions
dans lequel sont placés des objets de différentes familles ordonnées.
Initialement un seul objet est présent, placé de façon
aléatoire.
On distingue les familles de nombres et les familles de bombes.
Deux objets de même famille qui se percutent forment un objet de
famille supérieure (les nombres entre eux ou les bombes entre
elles).
Le principe général est de faire apparaître un nombre supérieur ou
égal à une borne fixée au lancement.
Fonctionnement
- Initialement, le tableau est vide sauf à un endroit (choisi
aléatoirement) qui contient un objet nombre de valeur 1.
- Le but du jeu est de faire apparaître l'objet nombre de la
valeur fixée au départ.
- Le jeu prend fin lorsque l'objet est apparu ou lorsqu'il
devient impossible de faire évoluer la situation.
- Le joueur sélectionne une direction d'attraction ou bien
sélectionne une bombe.
- La direction ou la bombe sélectionnée est mise en évidence au niveau de
l'affichage.
- Sur confirmation du joueur, la bombe explose. L'explosion fait
disparaître la bombe ainsi que :
- Les quatre objets au contact en haut, en bas, à droite
et à gauche dans le cas d'une bombe +,
- Les quatre objets au contact haut-gauche, bas-gauche, haut-droite,
bas-droite dans le cas d'une bombe x,
- Les huit objets entourant directement la bombe dans le cas
d'une bombe *.
- Sur confirmation du joueur, tous les éléments se déplacent dans
la direction indiquée.
- Les objets nombre ont des valeurs entières.
- L'objet initial est un nombre de valeur 1.
- Les objets bombe ont les valeurs +, x ou *,
ordonnées comme + < x < *.
- Les objets à déplacer (à ne pas confondre avec les
déplacements) sont sélectionnés depuis le bord de la direction indiquée
vers le bord opposé.
- Un objets devant se déplacer (pour la direction) dans un
trou (case vide) va dans celui-ci en laissant un trou à son
emplacement initial.
- Un objet devant se déplacer (pour la
direction) dans un objet de même valeur disparaît et l'objet
cible :
- Voit sa valeur multipliée par deux si c'est un nombre,
- Prend la valeur directement supérieure si c'est une
bombe + ou x,
- Explose si c'est une bombe *.
- La réalisation d'un explosion ou de tous les déplacements
possibles définit un round.
- Une bombe non déclenchée explose spontanément au bout de 7
rounds (en début de round 8).
- Un nouvel objet est
ajouté dans une case vide aléatoire à la fin de chaque
round ;
la partie est perdue s'il est impossible de placer ce
nouvel objet.
- L'objet placé aléatoirement est :
- Un objet nombre de valeur 1 si aucune valeur
supérieure à 64 n'a été créée,
- Un objet nombre de valeur 1 (proba 70%) ou 2 (proba 20%)
ou une bombe + (proba 10%) si la valeur maximale créée
est entre 64 et
256,
- Un objet nombre de valeur 1 (proba 60%) ou 2 (proba 25%)
ou une bombe + (proba 10%) ou x (proba 5%) sinon.
- Après le round on revient à la phase de sélection.
Interface
On travaille dans un premier temps en mode texte.
L'affichage propose le tableau et ses objets : les nombres sont
représentés par des suites de chiffres et les bombes par +, X, *;
Les lignes du tableau sont séparées pas des suites de -, les
colonnes par des | (3 lignes de texte par ligne du tableau).
En dessous du tableau se trouvent :
- Une ligne de - de la largeur du tableau,
- L'invite de sélection/confirmation à l'extrême droite et en
dessous de cette ligne.
Initialement la valeur limite, 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.
Une direction est selectionnée par la lettre la désignant. On peut
penser à i, j, k et l. Une confirmation est alors attendue.
Lorsqu'un objet bombe est sélectionné par son abscisse et son ordonnée,
son symbole est présenté entre accolades et
une confirmation est attendue.
- Si le caractère 'y' est entré, 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 se déplacent
ou disparaîssent.
Un affichage spécifique alerte de la fin de partie.
Questions
- Proposez le jeu sans bombes.
- Proposez le jeu complet.
Conseils
Pour la récupération des caractères de confirmation
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.