Vous êtes sur la page 1sur 16

Algorithmique et Programmation


Projets 2004

G1: keriven(at)certis.enpc.fr G2: juan(at)certis.enpc.fr
G3: gmellier(at)melix.org G4: pierre.maurel(at)ens.fr
G5: pierre(at)senellart.com G6: adde(at)certis.enpc.fr

F IG . 1 – Tetris 3D.

1 Tetris 3D
1. Modèle : Block Out (Fig. 1) :
– Page WEB : http://www.blockout.de/
– Programme : http://www.blockout.de/download/blockout.exe
2. A faire :
– Imiter le programme le mieux possible en mode "out of control".
3. A faire éventuellement :
– Gestion des scores.
4. Techniquement :
– Utiliser les instructions 3D de la WinLib dans une fenêtre à caméra fixe.

2 Retouche d’images
1. Modèle : si vous ne connaissez pas Photoshop, un clone gratuit : Gimp (Fig. 2) :
– Page WEB : http://www.gimp.org
– Progamme : http://gimp-win.sourceforge.net/stable.html
2. A faire au minimum :
– Une classe image couleur raisonnable.
– Deux types de fonctionnalités :
– Un algorithme appliqué automatiquement à toute l’image (négatif ou flou).
– Une retouche interactive de type pinceau.
3. A faire ensuite :
– D’autres algorithmes (netteté, déformations, contours, débruitage, etc.) : demandez à ceux de vos en-
seignants spécialistes d’images.
– D’autres types de retouches : clone par exemple (utile pour truquer des images)

1
F IG . 2 – Retouche d’images

– Une notion de sélection pour limiter l’effet de la retouche (rectangle par exemple).
4. A ne pas faire :
– Ne pas considérer le côté "vectoriel" de Gimp. Seul le côté "Bitmap" (i.e. pixels) nous intéresse.
– Ne pas gérer les calques.
5. Techniquement :
– Utiliser la WinLib.
– Ne pas faire de menus, etc. Utiliser le clavier. Ou mieux : dessiner des boutons très simples dans un
coin de la fenêtre.
– Ne pas tout afficher tout le temps.

3 Séquenceur
Le but de ce projet est de produire une version allégée d’un séquenceur MIDI.
1. A faire au minimum
Ce logiciel prendra en entrée un fichier MIDI (en gros, une partition) et devra pouvoir jouer ce fichier
en temps réel à partir d’échantillons (’samples’) fournis. Ce logiciel possédera également une interface
graphique.
– Le séquenceur devra être capable de charger un fichier midi en mémoire. Une fois ce fichier chargé, le
séquenceur devra être capable de lancer et d’arrêter la reproduction du morceau au travers de l’inter-
face graphique.
– Le séquenceur comportera un nombre maximal de piste à déterminer. Pour chaque piste, l’interface
devra présenter un certain nombre de contrôles, notamment : le niveau de la piste, sa balance et sa
réverbération.
– Le séquenceur devra pouvoir reproduire n’importe quel fichier MIDI, quitte à ne pas jouer certaines
pistes ou à les jouer avec l’instrument le plus proche disponible dans le séquenceur.
– L’interface graphique sera programmée à l’aide de la Winlib.
– Il n’est pas demandé d’implémenter toutes les possibilités de la norme MIDI (Pitch Bend, Control
Change, Bank Select, par exemple ne seront pas implémentés).
2. Pour commencer
La production d’un tel logiciel requiert notamment deux étapes difficiles et fastidieuses pour un débu-
tant. Il s’agit de :
– L’étape de lecture et d’interprétation du fichier MIDI.
– L’interfacage avec le système pour pouvoir effectuer une sortie sonore
Ces deux étapes ont donc été programmées et une démonstration en est faite dans la solution de départ.
Finalement restent à faire pour ce projet :
– Charger les fichiers WAV des samples.
– Synthétiser le son.
3. Quelques liens en vrac...
– http ://www.harmony-central.com/MIDI/Doc/tutorial.html
http ://www.sonicspot.com/guide/wavefiles.html

2
F IG . 3 – Asteroids

4 Asteroids
1. Modèle : un des tous premiers "jeux de café", bien avant PacMan : Asteroids (Fig. 3) :
– Page WEB : http://www.programurl.com/asteroids-extreme.htm
– Progamme : http://www.chunkypig.com/games/download/asteroids_extreme.exe
– Touches : les flèches, la barre d’espace, mais aussi Shift.
2. A faire au minimum :
– Gérer l’inertie.
– Un tir à la fois.
– Des astéroïdes que ne se coupent pas en deux.
3. A faire éventuellement :
– Des astéroïdes qui se divisent.
– Des tirs multiples.
– L’hyper-espace (touche Shift )
– La soucoupe volante.
– Gestion des scores.
4. Techniquement :
– Utiliser la WinLib : penser au paramètre XOR des tracés de ligne.

5 Calcul formel
Le but de ce projet est de produire un petit calculateur symbolique, version extrêmement réduite de logi-
ciels connus tels que Maple, Mathematica ou Maxima, capable d’exécuter quelques traitements élémentaires
tels que : dériver, développer ou réduire une expression.
1. A faire au minimum
Le programme devra s’exécuter sur une console texte. Cette dernière servira d’interface avec l’utilisateur
qui y entrera des lignes de commande. Chaque ligne de commande sera suivie d’un écho indiquant la
réaction du calculateur. Il n’est pas demandé de faire un affichage graphique des expressions mathéma-
tiques. Parmi les fonctionnalités à implémenter on peut citer :
– Le calculateur doit pouvoir comprendre n’importe quelle expression contenant les opérateurs et fonc-
tions usuelles (+,-,*,,,̂cos,sin,tan,arccos,arcsin,arctan,exp,log,cosh,sinh,tanh,arccosh,arcsinh,arctanh,(,),...).
– Le calculateur doit être capable de mémoriser des variables contenant des expressions. Ces variables
doivent pouvoir être réutilisées pour entrer d’autres expressions. Le calculateur doit, en outre, diposer
d’une commandes who pour lister l’enesemble des variables mémorisées et d’une commande kill pour
effacer une variable donnée.
– Le calculateur doit être capable de developper une expression, i.e. faire usage des règles de ditributi-
vité.
– Le calculateur doit être capable de dériver une expression par rapport à une variable.
– Le calculateur doit être capable de simplifier une expression ; au moins suffisamment pour rendre
lisible le résultat d’une dérivation.
2. Pour commencer
La production d’un tel logiciel requiert deux étapes assez différentes.
– L’étape de ’parsing’ qui consiste à partir d’une expression entrée au clavier à en vérifier la syntaxe et
dresser l’arbre correspondant.
– L’étape de calul symbolique à proprement parler.

3
Afin d’alléger la charge de travail, la première étape est déjà implémentée dans le projet de départ. Ce der-
nier contient une démonstration de ’parsing’ d’une expression entrée au clavier. Il est possible d’étendre
assez facilement la syntaxe et la grammaire du langage utilisé en modifiant les fichier ’.y’ et ’.lm’. Pour
davantage de détails se renseigner auprès de son professeur.
3. Quelques liens en vrac...
– google : Computer Algebra Systems
– http ://stommel.tamu.edu/ baum/graphics-math.html
http ://planetmath.org/encyclopedia/ComputerAlgebraSystems.html
http ://www.math.wpi.edu/IQP/BVCalcHist/calc5.html
http ://www.sai.msu.su/sal/A/1/index.shtml
– Computer Algebra - Symbolic and Algebraic Computation, B. Buchberger, G.E. Collins, R. Loos (eds.)
Computing (Archiv for Informatics and Numerical Computation), Supplement Nr. 4 (1st ed.), Springer
Verlag Wien, (2nd edition : Springer-Verlag Wien-New York, 1982, 1983 ; Reprinted : World Publishing
Coorporation, Beijing, 1988 ; Russian translation : translated by V.P. Gerdt, D.Yu.Grigoryev, V.A. Ros-
tovtsev, S.Yu. Slavyanov, Mir Publishing Company, Moscow, 1986) ISSN 0344-8029, ISBN 3-211-81684-
4, ISBN 0-387-81684-4, ISBN 3-211-81776-X, ISBN 0-387-81776-X, ISBN 7-5062-0253-0, BBK 22.14+22.16

6 Calcul scientifique
Le but de ce projet est de produire un petit calculateur matriciel, version extrêmement réduite de logiciels
connus tels que Matlab, SciLab ou Octave, capable d’exécuter des traitements élémentaires sur des matrices
tels que : charger, écrire des matrices, calculer des expressions à partir de ces matrices...
1. A faire au minimum
Le programme devra s’exécuter sur une console texte. Cette dernière servira d’interface avec l’utilisateur
qui y entrera des lignes de commande. Chaque ligne de commande sera suivie ou non d’un écho indi-
quant la réaction du calculateur (le ’ ;’ finale interdisant l’écho). Parmi les fonctionnalités à implémenter
on peut citer :
– Le calculateur doit pouvoir charger et écrire sur le disque (fonctions ’load’ et ’save’) des matrices (au
format texte). Ces matrices sont ainsi stockées dans des variables. De même le calculateur doit mettre
à la disposition de l’utilisateur une syntaxe permettant d’entrer au clavier une matrice.
– Le calculateur doit disposer d’une commandes who pour lister l’ensemble des variables mémorisées
ainsi que leurs caractéristiques et d’une commande kill pour effacer une variable donnée.
– Le calculateur doit pouvoir comprendre n’importe quelle expression contenant les opérateurs et fonc-
tions usuelles (+,-,*,,,̂cos,sin,tan,arccos,arcsin,arctan,exp,log,cosh,sinh,tanh,arccosh,arcsinh,arctanh,(,),...)
appliqués à des variables et calculer l’expression résultante.
2. Pour commencer La production d’un tel logiciel requiert deux étapes assez différentes.
– L’étape de ’parsing’ qui consiste à partir d’une expression entrée au clavier, à en vérifier la syntaxe et
à dresser l’arbre correspondant.
– L’étape de calcul à proprement parler, qui une fois l’arbe de l’expression dressé est obtenue aisément.
La première étape représente donc la part la plus importante du travail, elle peut elle même se décom-
poser en deux sous-étapes :
(a) ’tokenize’ : Cette étapes consiste à découper la chaîne de caractères entrée en une successions
morceaux (’token’) ayant un sens pour le langage considéré. Par exemple (mat1 + 2 ∗ −mat2)
donne { ( , mat1 , + , 2 , ∗ , − , mat2 , ) }
(b) ’parse’ : qui est l’étape de parsing à proprement parler. Cette étape consiste, à partir de la sortie
du ’tokenizer’, à dresser l’arbre de l’expression, étant données les règles de grammaire du langage
considéré.
Il existe des logiciels capables de générer des code de tokenizer et de parser (lex, flex, bison, yacc...)
mais ces logiciels sont assez compliqués pour des débutant et les sources qu’ils produisent ne sont pas
d’une grande aide pour essayer de les imiter.
3. Quelques liens en vrac...
– http ://epaperpress.com/oper/index.html http ://www.ibiblio.org/obp/thinkCSpy/chap20.htm
– Et bien entendu : google

7 Jeu en réseau
Ce projet s’adresse à un public averti et consiste à faire un mini doom-like en 3D + réseau.
1. Modèle : WOLFENSTEIN 3D : premier jeu en 3D d’ID Software, grand nom de la scène du jeux vidéo en
ce moment.
– Page WEB : http://www.idsoftware.com/games/wolfenstein/wolf3d/

4
– Progamme : http://www.jeuxgratis.com/download_43.php
– Touches : les flèches, la barre d’espace, la souris ...
2. A faire au minimum :
– Réaliser un serveur capable de synchroniser les déplacements et des tirs des joueurs dans l’arène (ou
carte de jeu).
– Un client ’Joueur’ qui permet à un utilisateur humain de se déplacer dans l’arène et de tirer sur les
autres joueurs.
– Le client affiche l’arène en 3D avec un modèle de déplacement à la première personne avec la WinLib.
3. Quelques étapes :
– Construire un ’langage’ de communication entre le serveur et les clients.
– Se limiter à un seul tir par joueur.
4. A faire éventuellement :
– Un client ’Ordinateur’ qui permet à un personnage non-joueur de se déplacer dans l’arène et de tirer
sur les autres joueurs avec une certaine forme d’intelligence.
– Des tirs multiples.
– Des Portes ?
– Gestion des scores.
– Gestion d’un système de points de vie.
– Bonus de vie, etc...
5. Pour les fans :
– Migration du jeu vers une deuxième version plus proche d’un PACMAN 3D réseau.
6. Techniquement :
– Utiliser la WinLib pour la 3D. (cf poly)
– Utiliser la couche d’abstraction réseau fournie pour le serveur et le client (Héritage C++ pour le ser-
veur).
– Le client affiche et gère le clavier ou la souris.
– Le serveur gère l’arène entière ainsi que les règles du jeu.

8 Editeur de sons
Le but de ce projet est de produire un petit logiciel capable de traiter en temps réel du son. Fonctionnelle-
ment, ce logiciel se présentera comme un enchaînement de petits modules spécialisés et paramétrisables.
1. A faire au minimum
Le programme devra pouvoir charger en mémoire un fichier son (sous forme de fichier wav) puis le faire
passer à travers un pipeline de modules modifiant le son à chaque étapes et enfin reproduire le son ainsi
modifié. Le programme devra présenter un interface graphique simple codée grâce à la Winlib. Parmi les
fonctionnalités à implémenter, on peut citer :
– un module Volume/Balance
– un module Equalizer
– Un module Delay/Reverb
– Un module Compresseur/Expandeur
2. Pour Commencer
La production d’un tel logiciel recouvre .
– La programmation de l’interface graphique
– La programmation du traitement du son
Afin de pouvoir se consacrer exclusivement à ces deux taches un programme de départ est fourni. Ce
programme prend en charge la restitution d’un son synthétisée au travers d’une interface graphique
élémentaire.
Il conviendra avant de la coder, de convenir de l’aspect de l’interface graphique avec son professeur.
3. Quelques liens en vrac...
– google : sound Signal Processing, chorus, reverb, equalizer ....
– http ://www.harmony-central.com/Effects/effects-explained.html
http ://www.lnt.de/lms/lecture/digsounds/index.php ?lang=eng
http ://sonicflow.sourceforge.net/sounds/
http ://www.harmony-central.com/Computer/Programming/
http ://sonicflow.sourceforge.net/resources.html

9 Ray tracing
1. Modèle : un programme d’images de synthèse gratuit : Pov Ray (Fig. 4) :

5
F IG . 4 – Ray tracing

– Page WEB : http://www.povray.org/


– Progamme : http://www.povray.org/ftp/pub/povray/Official/Windows/povwin36.exe
2. A faire au minimum :
– Comprendre le principe du Ray Tracing (lancé de rayons ). (Recherche WEB).
– Commencer par un programme simple, sans fichier de description, pour lequel les objets sont des
sphères, sans traiter les reflets.
– Rajouter un affichage progressif : ne pas calculer les pixels ligne par ligne mais par grilles de plus en
plus fines, en les affichant au fur et à mesure.
– Rajouter les reflets.
– Rajouter d’autres objets analytiques (cubes, cylindres, etc.).
– Construire de nouveaux objets par intersection, union et différence d’objets de base.
3. A faire éventuellement :
– Lire un fichier de description des objets.
– Rajouter les transparences.
– Gérer des objets de type maillage (ex. : R2D2 dans C:\Program Files\WinLib5\Test\Test\surprise.3d
– Optimiser le calcul d’intersections avec une notion de boites.

F IG . 5 – Cyber-pinball

10 Flipper
1. Modèle : un petit flipper :
– premier exemple : le flipper de windows (démarrer → programmes → Jeux → Pinball)
– un autre progamme (Fig. 5) : ftp://ftp.moraff.com/permanent-link/cyberpinball.exe
2. A faire au minimum :
– une balle soumise à un champ de pesanteur uniforme dirigé vers le bas

6
– deux "flips" que l’utilisateur peut actionner pour frapper la balle
– des obstacles sur lesquels la balle rebondit
3. A faire éventuellement :
– des obstacles plus interactifs (bumpers, etc ...)
– gestion du score
– des multi-balles
– faites parler votre imagination ...

F IG . 6 – Morphing

11 Morphing
On se donne deux images A et B. On souhaite passer de manière "continue" de l’une à l’autre. On cherche
donc à définir une suite d’image C(t) telle que C(0) = A et C(1) = B. Supposons que l’on dispose de deux
fonctions :
ft : C(t) → A
gt : C(t) → B
qui, à chaque pixel P de C(t), associent un pixel ft (P ) de A et un pixel gt (P ) de B, alors on peut définir
l’intensité du pixel P de C(t) par
P = (1 − t) ft (P ) + t gt (P ).
La difficulté est donc de trouver les fonctions ft et gt qui associent des points qui semblent se correspondre.
Pour cela, on va demander à l’utilisateur d’indiquer une grille sur chaque image initiale A et B (Fig. 6).
Ces grilles vont guider la transformation. Soit (ai,j )1≤i,j≤n les points constituant la grille sur A, et (bi,j )1≤i,j≤n
pour celle sur B. On a donc ai,j qui "correspond"’ à bi,j pour tout (i, j).
Soit t ∈ [0, 1], on veut remplir l’image C(t), c’est-à-dire définir une fonction φC qui à chaque pixel de C(t)
associe une valeur (une intensité, une couleur). On commence par définir une grille sur C(t) par :

ci,j = (1 − t) ai,j + t bi,j , 1 ≤ i, j ≤ n

Soit P un point de C(t), on veut définir φC (t).


– si P = ci,j , φC (P ) = (1 − t) φA (ai,j ) + t φB (bi,j )
– si P n’est pas sur la grille, on cherche dans quelle "case" de la grille il est, puis on cherche à quel point de
la case correspondante sur A on va l’associer (Fig. 7) et on fait de même pour B.

12 Cubebuster
CubeBuster est un jeu mêlant rapidité et réflexion. Différents versions peuvent être essayées aux adresses
suivantes :
– http://www.miniclip.com/cubebuster.htm
– http://www.shockwave.com/bin/content/shockwave.jsp?id=collapse

12.1 Règles
Dans un tableau bidimensionnel sont empilés des cubes de couleurs différentes. La difficulté du jeu aug-
mente avec le nombre de couleurs différentes, le niveau le plus facile commençant avec 3 couleurs.

7
F IG . 7 – correspondance entre deux quadrilatères

F IG . 8 – Exemple de niveau

8
12.1.1 Disparition de cubes
Le joueur peut cliquer sur les cubes à l’aide de la souris. LorsquŠil clique sur un cube possédant au moins
deux voisins de la même couleur que lui, tous les cubes voisins de cette couleur disparaissent. Si n cubes dis-
paraissent, le joueur marque n*(n-2) points. Tous les cubes situés au dessus des cubes qui ont disparu tombent
pour s’empiler sur ceux du dessous. Une fois que tous les cubes sont descendus, si il reste des colonnes mé-
dianes vides, les colonnes de gauche se décalent vers la droite pour les combler. Si le joueur clique sur un cube
ne possédant moins de deux voisins de même couleur, il perd 10 points.

12.1.2 Apparition de cubes


A intervalle régulier, une nouvelle ligne de cubes est insérée par le bas, l’ensemble des cubes présents dans
le tableau étant décalé d’un cran vers le haut. Si ce décalage conduit un ou plusieurs cubes à sortir du tableau
par le haut, le joueur a perdu. La couleur des différents cubes insérés est choisie de manière aléatoire. Plus le
jeu avance, plus on augmente la difficulté en réduisant l’intervalle de temps entre deux insertions.

12.1.3 Déroulement du jeu


Deux déroulements de jeu peuvent être choisis :
– un jeu continu, au cours duquel la difficulté (fréquence d’insertion de nouvelles lignes, nombre de cou-
leurs différentes, ...) augmente progressivement.
– un jeu par tableaux : un tableau dure le temps d’insérer n lignes et se fait avec un nombre de couleurs
constantes. La fréquence d’insertion des lignes peut soit être constante au cours du tableau soit augmen-
ter à l’intérieur d’une plage donnée. Au fil des tableaux, le nombre de lignes, le nombre de couleurs et la
fréquence d’insertion augmentent.

12.1.4 Bonus
Dans un second temps, il est possible d’insérer des bonus, sous la forme de petites bombes prenant la place
de cubes. On pourra gérer deux types de bombes :
– des bombes de couleur : lorsque que le joueur clique sur une de ces bombes, tous les cubes de cette
couleur disparaissent. Les cubes restants tombent et se réempilent. Le joueur ne marque aucun point.
– des bombes blanches : lorsque que le joueur clique sur une de ces bombes, tous les cubes situés à moins
d’une distance donnée de la bombe disparaissent. Les cubes restants tombent et se réempilent. Le joueur
ne marque aucun point.
La fréquence d’insertion de ces bonus constitue alors une manière supplémentaire de faire varier la diffi-
culté du jeu.

12.2 Programmation
12.2.1 Données et fonctionnalités
Commencer par définir les données nécessaires, et la manière de les stocker. Puis lister l’ensemble des
fonctions nécessaires, et les implémenter.
La principale difficulté algorithmique réside dans la fonction de comptage du nombre de cubes voisins de
même couleur. Avant de la programmer, décrivez sur papier (en français et non en C++) l’algorithme que vous
comptez implémenter et soumettez le à votre professeur.

12.2.2 Tests
Afin de tester et débugger votre programme, il pourra être intéressant de prévoir de quoi afficher simulta-
nément plusieurs états successifs du jeu (avant et après un clic notamment).
La Winlib autorise l’ouverture de plusieurs fenêtres. Une fenêtre peut être stockée dans une variable de
type Window :
– Window win1 = OpenWindow(w,h) ;
– Window win2 = OpenWindow(w,h) ;
La commande UseWindow permet de spécifier quelle fenêtre utiliser pour les prochaines opérations de
dessin :
– UseWindow(win1) ;
– FillRect(x1,y1,w1,h1,Blue) ;
– UseWindow(win2) ;
– FillRect(x2,y2,w2,h2,Red) ;

9
12.3 Extensions possibles
Différentes possibilités d’extensions, à choisir en fonction du temps restant.

12.3.1 JawBreaker
Principe A partir des éléments programmés pour réaliser CubeBuster, il est assez rapide de programmer un
jeu proche mais jouant davantage sur la réflexion que sur la rapidité : JawBreaker.
L’objectif du joueur est de marquer le maximum de points. Au départ le tableau est entièrement rempli de
cubes. Il n’y a pas d’insertion de lignes au cours de la partie. Le joueur peut faire disparaître les ensembles
de deux ou plus cubes voisins de même couleur (au lieu de trois ou plus pour CubeBuster). Il marque alors
n*(n-1) points, et ne perd pas de points s’il clique sur un cube isolé. La partie se termine lorsque le joueur ne
peut plus faire disparaître aucun cube.
Au démarrage, le joueur aura accès à un écran lui permettant de choisir entre le mode CubeBuster ou le
mode JawBreaker.

Programmation Programmer ce jeu en créant une nouvelle fonction jeu différente de celle du CubeBuster,
mais en réutilisant les autres fonctions, si nécessaire en leur passant de nouveaux paramètres leur permettant
d’adapter leur comportement suivant le type de jeu (CubeBuster ou JawBreaker) en cours.
Avant de modifier les fonctions du CubeBuster pour leur permettre de gérer également un JawBreaker,
pensez à réaliser une sauvegarde de votre projet au cas où ...

12.3.2 Gestion des hi-scores


Stocker les meilleurs scores dans un fichier texte.

12.3.3 Jeu à 2 joueurs


Il s’agira de dédoubler le jeu sur un même ordinateur. On pourra par exemple retenir comme principe
d’interaction entre les deux joueurs qu’un ń gros coup ż d’un joueur insère des lignes supplémentaires chez
l’adversaire.
L’impossibilité de brancher deux souris sur un même ordinateur conduira à remplacer la souris par le
clavier ...

12.3.4 Jeu en réseau


Plutôt que de jouer à plusieurs sur un même ordinateur, chaque joueur pourra jouer sur son propre ordi-
nateur (ce qui résout par ailleurs le problème de la souris Ě). On pourra pour gérer les échanges par le réseau
se baser sur les éléments fournis pour le projet Mini-Doom.

13 Stack Attack
13.1 Règles
Dans un entrepôt, des grues laissent tomber des caisses de couleur. Le travail du manutentionnaire de
l’entrepôt consiste à garder celui-ci rangé. Pour ce faire, il doit regrouper les caisses de même couleur.

13.1.1 Jeu standard


Déplacement du manutentionnaire Le manutentionnaire peut se déplacer dans les quatre directions tant
qu’une caisse ne le bloque pas. Il est capable de sauter de la hauteur d’une caisse, et donc de monter sur une
caisse qui lui fait face.

Apparition des caisses Les grues lâchent les caisses depuis le plafond de manière aléatoire. Il existe 5 cou-
leurs de caisses : noires, rouges, vertes, bleues, jaunes. Une fois lâchées, les caisses tombent verticalement à
vitesse constante jusqu’à ce qu’elles rencontrent un obstacle, sol ou autre caisse. A chaque apparition d’une
nouvelle caisse, le joueur marque 1 point.

Fin de partie Si une caisse tombe sur la tête du manutentionnaire, celui-ci meurt et la partie se termine.
Si une caisse apparaît à un endroit où se trouve déjà une autre caisse, la partie se termine.

10
F IG . 9 – Stack Attack

Déplacement des caisses Les caisses noires sont inamovibles. Seules les caisses de couleur peuvent être
déplacées. La seule manière pour le manutentionnaire de déplacer une caisse est de la pousser. Le manuten-
tionnaire ne peut pousser une caisse que si :
– l’espace situé immédiatement derrière la caisse est libre
– rien n’est posé sur la caisse
– elle n’est pas noire
Au cours d’un saut, le manutentionnaire peut pousser une caisse sous les mêmes conditions.

Disparition des caisses Lorsque le manutentionnaire regroupe trois ou plus caisses de même couleur, celles-
ci disparaissent. Des caisses sont considérées comme regroupées lorsqu’elles sont en contact par une face (le
contact par une arête uniquement ne compte pas).
Lorsqu’il effectue un regroupement, le joueur gagne :
– 3 points pour 3 caisses
– 8 points pour 4 caisses
– 20 points pour 5 caisses
– 48 points pour 6 caisses
Le manutentionnaire peut également faire disparaître des caisses en remplissant une rangée complète à
l’intérieur de l’entrepôt. Toutes les caisses de la rangée disparaissent alors, quelle que soit leur couleur, mais le
joueur ne marque aucun point.

13.1.2 Bonus
Dans un second temps, il est possible d’insérer des bonus. Il s’agit d’éléments lâchés par les grues comme
des caisses, et qui peuvent être ramassés par le manutentionnaire. Lorsque le manutentionnaire ramasse un
bonus, il décide du moment de son utilisation. Il ne peut ramasser qu’un bonus à la fois.
Différents types de bonus :
– un aimant : lorsque le manutentionnaire l’utilise face à une caisse, il lui permet de tirer la caisse vers lui
(sous réserve que l’espace derrière lui soit libre). L’aimant permet de tirer une caisse ou un autre bonus,
même si d’autres éléments sont posés dessus.
– un chronomètre : lorsque le manutentionnaire l’utilise, l’apparition de nouvelles caisses s’interrompt
pendant un court laps de temps
– un marteau : lorsque le manutentionnaire l’utilise face à une caisse, celle-ci disparaît, sauf si il s’agit d’une
caisse noire. Le marteau permet aussi de faire disparaître un bonus.
– une bombe de couleur : lorsque le manutentionnaire l’utilise, toutes les caisses de cette couleur présentes
dans l’entrepôt disparaissent.
– une bombe noire : lorsque le manutentionnaire l’utilise, tous les éléments situés au contact du manuten-
tionnaire (par une face, une arête ou un coin) disparaissent, y compris les caisses noires.
– une plume : lorsque le manutentionnaire l’utilise, elle lui permet de sauter deux fois plus haut pendant
un court laps de temps
– un poids : lorsque le manutentionnaire l’utilise, il lui permet de pousser deux caisses l’une derrière l’autre
pendant un court laps de temps

11
13.2 Programmation
13.2.1 Phasage
Commencer par programmer le jeu sans bonus : apparition des caisses, déplacements et suppression des
caisses. Dans un second temps, une fois que le jeu avec les caisses marche, ajouter progressivement la gestion
des différents bonus.

13.2.2 Données et fonctionnalités


Commencer par définir les données nécessaires, et la manière de les stocker. Puis lister l’ensemble des
fonctions nécessaires, et les implémenter.
La principale difficulté algorithmique réside dans la fonction de comptage du nombre de caisses voisines
de même couleur. Avant de la programmer, décrivez sur papier (en français et non en C++) l’algorithme que
vous comptez implémenter et soumettez le à votre professeur.

13.2.3 3D
Une annexe du poly du cours présente les différentes fonctionnalités 3D de la Winlib. Les fonctions indis-
pensables ici sont :
– le constructeur Mesh : :Mesh permettant de créer un maillage (un Mesh) à partir d’une liste de points
(des Vect) et d’une liste de triangles (des Triangle) précisant parmi ces points quels sont ceux à relier
– la fonction Mesh : :SetColor permettant de fixer ou modifier la couleur d’un maillage
– la fonction Mesh : :Move permettant de déplacer un maillage
– la fonction SetCamera permettant de spécifier de placer le point d’observation de la scène
– éventuellement la fonction Mesh : :SetGeometry permettant de modifier un maillage après sa création

13.2.4 Tests
Afin de simplifier les tests au cours de la programmation, il pourra être intéressant de programmer un
affichage 2D de l’état de l’entrepôt, en le décomposant en couches.
Cela devrait permettre de distinguer les problèmes de gestion du jeu de ceux de gestion de l’affichage en
3D.

13.3 Extensions possibles


Différentes possibilités d’extensions, à choisir en fonction du temps restant.

13.3.1 Gestion des hi-scores


Stocker les meilleurs scores dans un fichier texte.

13.3.2 Jeu à 2 joueurs


Il s’agira de dédoubler le jeu sur un même ordinateur. On pourra par exemple retenir comme principe
d’interaction entre les deux joueurs qu’un ń gros coup ż d’un joueur insère des caisses supplémentaires chez
l’adversaire.

13.3.3 Jeu en réseau


Plutôt que de jouer à plusieurs sur un même ordinateur, chaque joueur pourra jouer sur son propre or-
dinateur. On pourra pour gérer les échanges par le réseau se baser sur les éléments fournis pour le projet
Mini-Doom.

14 Pathological
14.1 Objectif
Il s’agit de reproduire le jeu Pathological. Le jeu est téléchargeable à l’adresse suivante :
http://pathological.sourceforge.net
Pathological est un jeu mêlant réflexion et rapidité. Il s’agit de diriger des billes de couleur dans des tuyaux
reliant des roues à réceptacles. L’objectif de chaque niveau est de "valider" toutes les roues en remplissant
chacune avec des billes de même couleur.

12
F IG . 10 – Exemple de niveau

14.2 Règles
La page suivante présente le détail des règles du jeu :
http://pathological.sourceforge.net/howtoplay.php

14.3 Programmation
14.3.1 Données et fonctionnalités
Commencer par définir les données nécessaires, et la manière de les stocker. Bien réfléchir au découpage en
objets, et aux fonctionnalités nécessaires. En discuter avec votre enseignant avant de commencer à program-
mer.

14.3.2 Phasage
Programmer le jeu par étapes : dans un premier temps les tuyaux puis le lanceur, dans un second temps les
roues. Il sera ensuite possible de rajouter un par un les différents éléments spéciaux : filtres, colorateurs, sens
uniques, switchs ...
Il faudra également implémenter un module permettant de charger différents tableaux à partir d’un fichier
texte. Le plus simple consistera à utiliser le format défini dans le fichier ń all-boards ż du jeu téléchargeable, ce
qui permettra de récupérer tous les tableaux existants.

15 Compression
15.1 Objectif
Il s’agit ici d’implémenter différents algorithmes de compression. Dans un premier temps, vous implé-
menterez un algorithme simple de type Run Length Encoding. Dans un second temps, vous implémenterez
l’agorithme de Huffman (1950s).

15.2 Run Length Encoding


15.2.1 Principe
Le principe consiste à détecter une donnée ayant un nombre d’apparitions consécutives qui dépasse un
seuil fixe. Puis à remplacer cette séquence par deux informations : un chiffre indiquant le nombre de répé-
titions et l’information à répéter. Aussi, cette méthode remplace une séquence par une autre beaucoup plus
courte moyennant le respect du seuil (souvent fixé à 4). Elle nécessite la présence de répétitions relativement
fréquentes dans l’information source à compresser.

Exemple :

13
– Information à compresser : vrillette
– Information compressée : vri2le2te

L’exemple précédent révèle cependant deux problèmes : d’une part il n’y a pas de compression puisque
le codage prend autant de place que l’information source ; d’autre part il est nécessaire pour le décodage de
pouvoir distinguer les zones codées des zones intactes.

15.2.2 Elaboration de l’algorithme


Afin que la méthode permette une compression effective et ne risque pas d’augmenter la taille des données
de base, il ne faut encoder que lorsque le facteur de répétition est supérieur à 3.
Il faut aussi distinguer la séquence de remplacement de l’information non compressée, c’est-à-dire faire
ressortir du texte compressé les information compactées. Pour cela, on utilise un caractère spécial. Il indique
que la séquence des 2 caractères suivants est le résultat d’une compression. C’est la raison pour laquelle on fixe
le seuil de répétition à 4. Toute séquence d’au moins 4 caractères répétitifs sera compressée en 3 caractères. On
commence donc à gagner de la place.
Cette méthode présente peu d’avantages pour la compression de fichier texte. Par contre, sur une image,
on rencontre régulièrement une succession de données de même valeur, des pixels de même couleur.

Exemple : le caractère # repésente le caractère spécifique.


– Source : 18 18 18 18 18 167 167 167 167 167 167 167 32 9 9 9 9 9 9 203 203 203 203
– Compression : # 5 18 # 7 167 32 # 6 9 # 4 203

Telle quelle, la méthode présente encore deux défauts. Tout d’abord le caractère spécial (Cs) introduisant la
répétition doit être un caractère unique dans tout le fichier source. S’il apparaît en tant que donnée, à la phase
de compression, il sera pris comme tel. Par contre, lors de la décompression, ce caractère sera détecté comme le
caractère spécial, et le décompresseur lui fera remplir son rôle, entraînant des erreurs. Dans un second temps,
on remarque la limite du compteur de répétitions. Dans notre exemple, le compteur était stocké sur un octet,
d’où un comptage limite de 255 répétitions.

15.2.3 Travail demandé


Concevoir un programme capable de comprimer un fichier en Run Length Encoding, puis un second pro-
gramme capable de décomprimer ces fichiers. Après avoir vérifié que le gain obtenu en traitant un fichier
texte était faible, spécialiser le programme dans la compression d’images, en niveaux de gris dans un premier
temps, puis en couleur dans un second temps.

15.3 Compression de Huffman


15.3.1 Principe
Considérons la suite de caratères : AABACDAABBABADABAACA. On a ici un alphabet de 4 caractères : A,
B, C, D. La méthode la plus simple pour représenter cette suite de caractères consiste à coder chaque caractère
sur 2 bits. On peut ainsi par exemple poser : A=00,B=01, C=10, D=11. La séquence précédente devient alors :
0000010010110000010100010011000100001000. La séquence initiale comportait 20 caractères, il nous a fallu 40
bits pour la représenter.
Considérons une autre manière de coder notre alphabet. Soit A=0, B=10, C=110, D=111. La séquence de-
vient : 001001101110010100100111010001100. Il n’y a plus besoin que de 33 bits pour stocker la séquence. En
utilisant un codage plus court pour le caractère le plus fréquent, on réduit la taille nécessaire pour stocker la
séquence. Sur des séquences plus longues, le gain s’accroît.

15.3.2 Algorithme
Le codage de Huffman, qui date des années 50, repose sur une analyse statistique préalable des données
à comprimer. A l’issue de cette analyse, un arbre est construit qui permet d’attribuer à chaque symbole un
code dont le nombre de bits est inversement proportionnel à la probabilité d’apparition du symbole. Ainsi, les
symboles les plus fréquents se voient affecter des codes plus courts, et les codes les plus longs sont attribués
aux symboles rares. En outre, ces codes sont séparables, c’est-à-dire qu’un code donné ne peut pas être le pré-
fixe d’un autre code. Bien sûr, pour permettre au décodeur de reconnaître les symboles, il est nécessaire de lui
transmettre le dictionnaire obtenu après la phase d’analyse statistique des données.

Nous allons illustrer l’algorithme de construction de l’arbre de Huffman sur un exemple. Soit à coder le
message : "EXEMPLE DE CODAGE DE HUFFMAN".

14
L’algorithme commence par calculer la probabilité de chaque symbole : (E,6/28), (X,1/28), (M,2/28), (P,1/28),
(L,1/28), (espace,4/28), (D,3/28), (C,1/28), (O,1/28), (A,2/28), (G,1/28), (H,1/28), (U,1/28), (F,2/28), (N,1/28).
A chaque étape, les deux symboles de plus petite probabilité sont regroupés en un nouveau symbole ayant
pour probabilité la somme des deux probabilités. Le processus est itéré jusqu’à obtenir un unique symbole de
probabilité 1 (cf figure 11).

F IG . 11 – Exemple de construction de l’arbre de Huffman. Les bits de codages sont en gras (et en rouge), pour
les probabilités, on n’a pas fait figurer le dénominateur (28)

Le code de chaque symbole est ensuite obtenu en suivant le chemin depuis la racine de l’arbre de Huffman
jusqu’à la feuille contenant le symbole. Un bit est ajouté à chaque embranchement : 0 si le chemin emprunte
la branche supérieure, 1 si c’est la branche inférieure. Ainsi, le code du symbole le plus fréquent (E : 00) est de
longueur 2, tandis qu’un symbole rare (H : 11101) est codé sur 5 bits.

15.3.3 Travail demandé


Concevoir un programme capable de comprimer un fichier en utilisant l’algorithme de Huffman, puis
un second programme capable de décomprimer ces fichiers. Il est à noter que lors de la décompression, il est
nécessaire de connaître le codage qui a été utilisé à la compression. Il est donc nécessaire lors de la compression
d’inclure ce codage dans le fichier comprimé.

F IG . 12 – Jeu de dames

16 Jeu de dames
1. Modèle : Dam (Fig. 12) :
– Page WEB : http://www.xs4all.nl/~hjetten/dameng.html
– Programme : http://www.xs4all.nl/~hjetten/dam227.exe

15
2. Règles du jeu : http://membres.lycos.fr/nic55/dames/regles.htm
3. A faire :
– Affichage et mouvement des pièces (pions et dames) sur l’échiquier
– Autoriser uniquement les coups valides suivant les règles du jeu
– Jeu à deux joueurs
– Jeu contre l’ordinateur, ce dernier utilisant un Minimax
(cf http://cermics.enpc.fr/~keriven/Info/Projets/2003/alphabeta.pdf)
– Fonction d’évaluation pour le minimax : nombre de pièces (une dame valant 2 pions)
4. A faire éventuellement :
– Utiliser un algorithme αβ plutôt que Minimax (cf document cité plus haut)
– Raffiner la fonction d’évaluation

16

Vous aimerez peut-être aussi