Partiel – Le jeu du casseur de rochers
Transcription
Partiel – Le jeu du casseur de rochers
Université Pierre et Marie Curie (UPMC) – Master d’Informatique – M1/STL/CPS 1 Partiel – Le jeu du casseur de rochers Frédéric Peschanski Mars 2012 Durée : 2 heures Document autorisé : Notes de cours Introduction Ce devoir consiste à formaliser, à l’aide du langage de spécifications de services vu en cours, un modèle légèrement simplifié du jeu : «le casseur de rochers» ou boulder dash TM (également connu sous le nom emerald mine, rocks & diamonds, . . . ). Important : l’objectif de ce devoir est d’exploiter au mieux les constructions du langage de spécification étudié en cours. On souhaite obtenir une spécification cohérente, complète et bien modulaire. Cahier des charges L’objectif du jeu est de mener le héro — originellement connu sous le nom de Rockford — dans un dédale sous-terrain à la recherche de diamants. Les principaux concepts à formaliser pour ce jeu sont les sui0000000 1111111 000000 111111 0000000 1111111 000000 111111 000000 111111 vants : 0000000 1111111 000000 111111 0000000 1111111 000000 111111 000000 111111 0000000 1111111 000000 111111 0000000 1111111 000000 111111 000000 111111 – le héro (en jaune) que l’on déplace dans les quatre directions 1111111 0000000 000000 111111 0000000 1111111 000000 111111 000000 111111 0000000 1111111 000000 111111 0000000 1111111 000000 111111 000000 (gauche/droite et haut/bas), 0000000111111 1111111 000000 0000000111111 1111111 000000111111 000000 111111 0000000 1111111 000000 111111 0000000 1111111 000000 111111 000000 111111 000000 111111 – les blocs graphiques qui composent le terrain de jeu, 000000 111111 000000 111111 – les blocs vides (fond noir) dans lesquels le héro peut se 000000 111111 000000 111111 déplacer librement, 000000 111111 000000 111111 – les blocs en terre que le héro peut creuser (il deviennent 000000 111111 000000 111111 alors vides), 000000 111111 000000 111111 000000 111111 – les murs qui sont infranchissables et indestructibles, 000000 111111 000000 111111 – les rochers que le héro peut pousser à gauce et ou à droite 000000 111111 000000 111111 vers des blocs vides et qui tombent vers le bas lorsqu’ils se 000000 111111 000000 111111 retrouvent sous des blocs vides (attention à la tête !), 000000 111111 000000 111111 000000 111111 – les diamants que le héro doit ramasser. Si un diamant 000000 111111 000000 111111 se trouve au dessus d’un bloc vide, alors il peut égale000000 111111 000000 111111 ment tomber comme un rocher . . . et écraser le héro ! (en 000000 111111 000000 111111 revanche, on ne peut pousser un dimant puisqu’on le ra000000 111111 000000 111111 masse en se déplaçant vers lui), 000000 111111 – la sortie (unique) fermée à l’origine et qui ne s’ouvre que lorsque tous les diamants du terrain ont été collectés. On donne ci-dessous l’ensemble des services à modéliser, mais on pourra les formaliser dans un ordre quelconque. Cet ordre ne pourra être déterminé qu’après lecture complète du cahier des charges et premières ébauches au brouillon. On pourra aussi ajouter des services auxiliaires, si on le juge nécessaire ou utile. Université Pierre et Marie Curie (UPMC) – Master d’Informatique – M1/STL/CPS 2 Terrain de jeu Le service Terrain représente un niveau de jeu qui est composé d’un ensemble de blocs disposés selon un rectangle. Chaque coordonnée (i, j) dans ce rectangle correspond à un bloc. Sur la figure du jeu ci-dessus, le bloc aux coordonnées (1, 1) est le mur en haut à gauche, juste au dessus de la sortie en (1, 2). Le bloc en (2, 2) (à droite de la sortie) est vide et le bloc en (1, 3) (en dessous de la sortie) est en terre. Un rocher en (3, 4) est en train de tomber sur le héro localisé en (3, 6). Si ce dernier reste immobile pendant encore deux pas de jeu il sera écrasé par le rocher et la partie sera terminée. Pour éviter cette issue fatale, il peut creuser en se déplaçant vers le bloc de terre en (2, 6) ou il peut collecter le diamant en (4, 6) par un déplacement vers la droite . . . bonne opération ! Le héro peut également se déplacer vers le haut pour se rapprocher du rocher, mais cette direction lui sera fatale ! Pour simuler un terrain «infini» on considère que les coordonnées sont cycliques. Par exemple le bloc situé en dessous du héro devrait être aux coordonnées (3, 7) mais on «sort» alors du terrain. Ce bloc en (3, 7) est fusionné avec le bloc en (3, 1) (au milieu en haut) qui est un mur. De ce fait, le héro ne peut se déplacer vers le bas puisqu’il est bloqué par le mur (3, 1). Si le bloc en (3, 1) était vide, le héro pourrait se déplacer vers le bas et serait «téléporté» dans le bloc (3, 1). La taille du terrain de jeu sera fixée lors de la construction, et les blocs seront par défaut tous vides avec le joueur en haut à gauche. On pourra modifier un bloc à une coordonnées spécifiée en faisant attention de bien respecter les invariants du jeu (ex. : un seul joueur dans le terrain). Blocs Le service Bloc permet de modéliser la base commune des objets manipulés dans le jeu : en pratique des rectangles graphiques mais dans le modèle la représentation graphique peut être abstraite. Les différentes catégories de blocs sont : Vide, Terre, Mur, Hero, SortieFermee, SortieOuverte, Rocher, Diamant. Moteur du jeu Le service MoteurJeu modélisera le jeu lui-même avec comme principale opération le calcul d’un pas de jeu. Lors de ce calcul, on pourra passer en paramètre un déplacement éventuel du héro dans une direction gauche, droite haut ou bas et on met à jour le terrain. Par exemple, si le joueur creuse un bloc de terre, ce dernier sera remplacé par le bloc héro et l’ancien bloc héro sera lui remplacé par un bloc vide. Autre exemple : un rocher avec un bloc vide sous-lui prendra la place de ce dernier, et le rocher sera remplacé par un bloc vide. Remarque : le nombre maximal de pas de jeu sera fixé à l’avance. On prendra soin de détecter la fin du jeu : partie gagnée ou perdue avec un observateur adéquat. On ne pourra entreprendre un pas de jeu supplémentaire si la partie est terminée. Les possibilités de terminaison de partie sont les suivantes : 1. le joueur se déplace vers la sortie ouverte : la partie est gagnée ! 2. le joueur reçoit un rocher ou un diamant sur la tête : la partie est perdue ! 3. le nombre maximal de pas de jeu est atteint : la partie est perdue !