Partiel Le jeu du casse

Transcription

Partiel Le jeu du casse
Université Pierre et Marie Curie (UPMC) Master d'Informatique M1/STL/CPS
1
Partiel Le jeu du casse-briques
Frédéric Peschanski
Mars 2011
Durée : 2 heures
Document autorisé : Notes de cours
Description du problème
(0,0)
wall
brick
Ce devoir consiste à formaliser, à l'aide du langage de
spécications de services vu en cours, le modèle d'un
jeu simple : le casse-brique. L'objectif de ce jeu de
réexes est de détruire un mur de briques en le percutant à l'aide d'une balle lancée par une raquette.
ball
Les principaux concepts à formaliser sont décrits en
termes informels ci-dessous.
paddle
(Xmax, Ymax)
Objets rectangulaires
Le service RectObj permet de modéliser la base commune des objets manipulés dans le jeu : conceptuellement de simples rectangles. Les observations de base portent sur les coordonnées cartésiennes entières
caractérisant le rectangle. On ajoutera un test qui permet de savoir si l'objet rectangle entre en collision avec un autre objet rectangle. Pour connaître la zone de collision approximative - pas de collisition,
collision à gauche, en haut, à droite ou en bas - on utilisera le type énuméré suivant :
type TCollision = { NO , LEFT, UP, RIGHT, DOWN }
L'opération principale consiste à déplacer les objets rectangulaires vers de nouvelles coordonnées. En
revanche, on ne peut changer la taille du rectangle.
Balle
La service Ball est un ranement du service RectObj permettant de gérer la balle dans le jeu du cassebriques. La balle se déplace selon un sens de déplacement δx, δy ∈ {−1, 1} ainsi qu'une vitesse strictement
positive. L'opération principale consiste à modier les coordonnées de la balle en fonction de son déplacement. On ajoutera également un opérateur pour pouvoir inverser le sens de déplacement (en x, en y ou
les deux) en cas de collision.
Université Pierre et Marie Curie (UPMC) Master d'Informatique M1/STL/CPS
2
Briques et Mur
Un objet rectangle de type Brick possède une résistance (entier positif). Il est possible de tenter de casser
une brique par collision avec la balle. La résistance baisse alors de une unité. Lorsque la résistance atteint
0 la brique est considérée cassée. On ajoutera également la possibilité de rendre une brique indestructible.
Le mur (service Wall) est un regroupement de briques. On souhaite pouvoir construire le mur brique par
brique, à condition de ne pas avoir de chevauchement entre les briques. Au cours du jeu, on doit pouvoir
observer le mur pour savoir quelle(s) brique(s) sont en collision avec un objet donné. On ajoutera une
opération permettant de décrire l'impact d'une collision sur les briques du mur.
Raquette
La raquette est un objet rectangulaire de type Paddle. On peut la déplacer vers la gauche ou vers la droite
exclusivement.
Modèle du jeu
Le service Breakout dénit le modèle du jeu de casse-briques en intégrant les services décrits précédemment. Parmi les observations, en plus des éléments constitutifs du jeu, on souhaite savoir si le jeu est
en cours ou non (détection de la n du jeu). En cas de terminaison, on souhaite savoir s'il s'agit d'une
victoire. On souhaite également pouvoir oserver les actions du joueur, qui utilisent le type suivant :
type TMove = { NONE , LEFT, RIGHT }
Le jeu possède également une notion de coordonnées maximales pour la surface de jeu. On prendra soin
de vérier que ces limites sont respectées par la spécication.
Les opérations du modèle de jeu sont les suivantes :
calcul d'un pas de jeu :
déplacement de la raquette en fonction du mouvement courant du joueur, dans les limites de
la surface de jeu
déplacement de la balle selon son sens de déplacement et sa vitesse, mais en prenant en compte
les limites de la surface de jeu ainsi que les collisions éventuelles .
prise en compte d'une collision de la balle avec la raquette, dans ce cas la balle rebondit
prise en compte d'une collision de la balle avec le mur, dans ce cas les briques touchées sont
percutées et la balle rebondit selon la zone de collision
si la balle percute le bord gauche, droite ou haut de la surface de jeu alors elle rebondit.
si la balle se retrouve sous la raquette alors le jeu est terminé et c'est une défaite.
si toutes les briques destructibles du mur sont détruites, alors le jeu est terminé et c'est une
victoire.
commande du joueur : information de type TMove
Consignes concernant les spécications
L'objectif est de rédiger des spécications les plus concises et complètes possibles pour les 5 services
décrits informellement ci-dessus. Pour chaque service on indiquera si la spécication est complète ou
partielle. Pour les cas de ranement (de RectObj) on justiera précisément la validité de la relation.
Important : les spécications des services ne doivent pas obligatoirement suivre l'ordre de la description
ci-dessus. En particulier on s'intéressera prioritairement à la vision générale du jeu oerte par le service
BreakOut. On souhaite que l'essentiel de la logique du jeu soit visible à ce niveau. D'autre part il est
possible d'introduire d'autres services annexes si nécessaire.
Remarque : on pourra introduire des notations personnelles pour le langage de spécication. En particulier il sera utile d'introduire une variante logique de l'alternative if-then-else des langages de programmation, avec la sémantique suivante :
if
c
then
e1
else
e2 ≡ (c =⇒ e1 ) ∧ (¬c =⇒ e2 )