énoncé - imagine

Transcription

énoncé - imagine
Introduction à la Programmation
G1: monasse(at) imagine.enpc.fr
G2: nicolas.audebert(at) onera.fr
G3: alexandre.boulch(at) onera.fr
G4: antoine.recanati(at) inria.fr
G5: bourkia(at) imagine.enpc.fr
G6: fadhela.kerdjoudj(at) u-pem.fr
TP #8 Figure 1 Jeu de Tron.
1
Tron
Dans ce TP, nous allons programmer le jeu TRON. Il s'agit d'un jeu à 2 joueurs, dans lequel chaque
joueur pilote un mobile qui se déplace à vitesse constante et laisse derrière lui une trace infranchissable. Le
premier joueur qui percute sa propre trace ou celle de son adversaire a perdu. Ce TP est assez ambitieux
et s'approche d'un mini-projet. Il nous occupera plusieurs séances.
1.1
Serpent
Nous allons procéder en deux temps. D'abord programmer un jeu de Serpent à un joueur. Le programme serpent.exe vous donne une idée du résultat recherché. Dans ce jeu, le joueur pilote un Serpent
qui s'allonge petit à petit (d'un élément tous les x tours, avec la convention que la longueur totale est
bornée à nmax éléments). Il s'agit de ne pas se rentrer dedans ni de percuter les murs.
La solution de départ comporte deux chiers, utils.h et utils.cpp, qui contiennent une structure
point (qu'il faudra éventuellement étoer de méthodes utiles) et une fonction destinée à récupérer les
touches clavier pour l'interaction avec les joueurs.
Il s'agit ici de concevoir un objet Serpent doté des méthodes adéquates, plus une fonction jeu_1p
exploitant les capacités du Serpent pour reproduire le comportement désiré. On pourra dans un premier
temps ne pas gérer les collisions (avec le bord et avec lui-même), et ne les rajouter que dans un second
temps. Votre travail se décompose en 6 étapes :
1. (sur papier) Dénir l'interface de la classe Serpent (c'est-à-dire lister toutes les fonctionnalités
nécessaires).
2. (sur papier) Rééchir à l'implémentation de la classe Serpent : comment stocker les données ?
comment programmer les diérentes méthodes ? (lire en préliminaire les remarques du paragraphe
suivant).
3. Dans un chier serpent.h, écrire la déclaration de votre classe Serpent : ses membres, ses méthodes,
ce qui est public, ce qui ne l'est pas.
4. Soumettre le résultat de vos réexions à votre enseignant pour valider avec lui les choix retenus.
1
5. Implémenter la classe Serpent (c'est-à-dire programmer les méthodes que vous avez déclarées).
6. Programmer la fonction jeu_1p utilisant un Serpent.
Remarque : Dans le chier utils.h sont dénis :
1. 4 entiers gauche, bas, haut, droite de telle manière que :
(a) la fonction x → (x + 1)%4 transforme gauche en bas, bas en droite, droite en haut et haut en
gauche ; cette fonction correspond donc à un quart de tour dans le sens trigonométrique.
(b) la fonction x → (x − 1)%4 transforme gauche en haut, haut en droite, droite en bas et bas
en gauche ; cette fonction correspond donc à un quart de tour dans le sens des aiguilles d'une
montre.
2. un tableau de 4 points dir de telle manière que, moyennant la dénition d'une fonction permettant
de faire la somme de deux points, la fonction p → p + dir[d] renvoie :
(a) pour d=gauche le point correspondant au décalage de p de 1 vers la gauche.
(b) pour d=haut le point correspondant au décalage de p de 1 vers la haut.
(c) pour d=droite le point correspondant au décalage de p de 1 vers la droite.
(d) pour d=bas le point correspondant au décalage de p de 1 vers la bas.
1.2
Tron
A partir du jeu de Serpent réalisé précédemment, nous allons facilement pouvoir implémenter le jeu
Tron. Le programme tron.exe vous donne une idée du résultat recherché. Le principe de ce jeu est que
chaque joueur pilote une moto qui laisse derrière elle une trace infranchissable. Le but est de survivre
plus longtemps que le joueur adverse.
1. Passage à deux joueurs.
A partir de la fonction jeu_1p, créer une fonction jeu_2p implémentant un jeu de serpent à 2
joueurs. On utilisera pour ce joueur les touches S, X, D et F. La fonction Clavier() renverra donc
les entiers int ( 'S'), int ( 'X'), int ( 'D') et int ( 'F'). Remarque : on ne gèrera qu'une touche par
tour, soit un seul appel à la fonction Clavier() par tour.
2. Ultimes réglages
(a) Gérer la collision entre les deux serpents.
(b) Le principe de Tron est que la trace des mobiles reste. Pour implémenter cela, il sut d'allonger
nos serpents à chaque tour.
1.3
Graphismes
Petit bonus pour les rapides : nous allons voir comment gérer des graphismes un peu plus sympas que
les rectangles uniformes que nous avons utilisés jusqu'ici. L'objectif est de remplacer le carré de tête par
une image que l'on déplace à chaque tour.
Nous allons utiliser pour cela les NativeBitmap d'Imagine++, qui sont des images à achage rapide.
Pour charger une image dans une NativeBitmap on procède ainsi :
// E n t i e r s p a s s é s par r é f é r e n c e l o r s du chargement de l ' image pour
// qu ' y s o i e n t s t o c k é e s l a l a r g e u r e t l a hauteur de l ' image
i n t w, h ;
// Chargement de l ' image
byte ∗ rgb ;
l o a d C o l o r I m a g e ( " n o m _ f i c h i e r . bmp" , rgb , w, h ) ;
// D é c l a r a t i o n de l a NativeBitmap
NativeBitmap ma_native_bitmap (w, h ) ;
// On p l a c e l ' image dans l a NativeBitmap
ma_native_bitmap . s e t C o l o r I m a g e ( 0 , 0 , rgb , w, h ) ;
L'achage d'une NativeBitmap à l'écran se fait alors avec la méthode :
v o i d putNativeBitmap ( i n t x , i n t y , NativeBitmap nb )
1. Remplacer dans le serpent l'achage de la tête par l'achage d'une image. On pourra utiliser les
images moto_blue.bmp et moto_red.bmp fournies.
2. Utiliser l'image explosion.bmp lors de la mort d'un des joueurs.
2