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 )