Université Paris 6
Licence d'informatique
Module de Programmation
Année 1999-2000


Travaux pratiques n° 1: tétris



1   Présentation du jeu

Le projet consiste à réaliser une version simplifiée du jeu TÉTRIS. Le but du jeu est de marquer le plus de points possible.

2   Représentation des pièces

On décrit une pièce par la position de son point fixe et les trois autres carrés seront représentés relativement à ce point fixe. La figure 6 illustre la méthode pour le codage de la pièce numéro 1.

On code de la même façon les quatre positions des sept pièces dans un tableau à deux dimensions décrit par la table 1.



Après avoir rempli ce tableau p, l'affichage au point de coordonnées (x, y) de la pièce 1 en position i pour 0 £ i £ 3 est le suivant:
    moveto x y; carré ();
    moveto (x+p.(1).(6*i+1)) (y+p.(1).(6*i+2)); carré ();
    moveto (x+p.(1).(6*i+3)) (y+p.(1).(6*i+4)); carré ();
    moveto (x+p.(1).(6*i+5)) (y+p.(1).(6*i+5)); carré ();;
si la fonction carré dessine un carré de centre le point courant par exemple.

3   Les commandes graphiques de Caml-Light

On utilise la contribution libgraph de Caml-Light, appelée par camllight camlgraph, puis on rend accessible la librairie graphique par la directive: #open "graphics";; et on ouvre une fenêtre graphique sur l'écran par open_graph "";; (et on la fermera à la fin par close_graph "";;).

On dispose alors d'un ensemble de primitives graphiques, parmi lesquelles:

  clear_graph: unit -> unit

  close_graph: unit -> unit

  moveto: int -> int -> unit

  lineto: int -> int -> unit

  current_point: unit -> int * int

  set_line_width: int -> unit

  fill_rect: int -> int -> int -> int -> unit

  draw_string: string -> unit

ainsi que des primitives qui vont être utiles à la gestion des événements:

  key_pressed: unit -> bool

  read_key: unit -> char

  wait_next_event: event list -> status

 

Le générateur de nombres pseudo-aléatoires est disponible dans la bibliothèque random, par la fonction random_int initialisée par la fonction random_init.

La mesure du temps se fait par la fonction gettimeofday de la bibliothèque unix à laquelle on a accès par #open "unix";;

Pour plus de détails, on se reportera au manuel de référence (ou à sa version française [1, pp. 139--144]).

4   Vers un jeu plus réaliste

Voici une liste des améliorations les plus courantes sur les Tétris dans les divers circuits de distribution. Ces améliorations possibles du programme sont présentées par ordre de priorité décroissante de programmation. Aucune n'est obligatoire, mais on peut envisager de programmer les deux ou trois premières si l'on dispose d'assez de temps.

4.1   Niveaux de jeux

La durée de la période entre la chute de deux pièces n'est plus constante et égale à une demi-seconde mais variable selon le niveau de jeu. La table 2 indique la vitesse associée à chaque niveau de jeu.

On change de niveau chaque fois que dix nouvelles lignes ont été complétées.

4.2   Table des scores

On peut tenir une table des dix meilleurs scores.

4.3   Facilités de jeu

On peut afficher la prochaine pièce qui doit tomber.

On peut programmer des touches supplémentaires telles qu'une touche de rotation en sens inverse des aiguilles d'une montre ("i") ou bien des touches qui vont tout à fait à gauche ("g") ou à droite ("h") de l'espace de jeu directement.

De même, pour le confort du joueur, on peut proposer une touche de pause ("p"), une touche d'abandon ("a") de la partie et une touche pour quitter le jeu ("q").

La figure 8 présente un aspect possible de l'écran de jeu dans cette configuration.

4.4   Pièces et fond d'écran coloriées

On peut colorier (avec des couleurs sur un écran couleur ou à niveaux de gris ou bien avec des motifs sur un écran noir et blanc) les pièces ainsi que le fond de l'écran. Ceci est évidemment purement esthétique et ne modifie en rien le principe du jeu.

4.5   Sons et musique

On peut ajouter un son lorsqu'une pièce atteint le bas de l'espace de jeu, un son lorsqu'une ligne disparaît et une musique de fond, ainsi qu'une touche pour supprimer/ajouter le son ou la musique.

4.6   Avantages aléatoires

Certains Tétris intègrent aussi des bombes de la taille d'un carré qui explosent au contact du fond de l'espace de jeu ou au contact de pièces, provoquant un disparition de tout carré dans un espace de 3 par 3 centré sur leur emplacement au moment de l'explosion.

Certains Tétris proposent des jokers qui se transforment en la pièce qui convient le mieux à cet emplacement.

Enfin, certains Tétris présentent des destructeurs de colonnes qui détruisent de 1 à 3 colonnes là où ils descendent, mais diminuent le score en proportion du nombre de carrés supprimés.

Par ailleurs, il existe de nombreuses variantes de Tétris dont on ne parlera pas ici.

Références

[1]
X. Leroy et P. Weis. Manuel de référence du langage Caml. InterÉditions, 1993.

5   Travail demandé

5.1   Programmation

Vous devez réalisé une implantation du jeu Tétris.

Pour cela :
  1. Représenter la description des positions des quatre carrés de chaque pièce correspondant à chacune des rotations de la pièce.
  2. Choisir une représentation de l'espace de jeu
  3. Quelques primitives de gestion de cette représentation interne (par opposition à graphique) du jeu :
    1. la fonction valide indique si le point fixe de la pièce pièce dans la position pos peut occuper le point de coordonnées (x, y) de l'espace de jeu.
    2. la fonction ligne_pleine qui détermine si la i-ème ligne de l'espace de jeu est pleine ou non.
    3. la fonction supprime_ligne qui supprime la ligne numéro i de la représentation interne de l'espace de jeu
  4. Quelques primitives d'affichage :
    1. la fonction décor qui plante le décor, la partie graphique qui ne varie pas au cours du jeu.
    2. la fonction carré qui peint un carré avec la couleur courante au point de l'espace de jeu de coordonnées (x, y).
    3. la fonction affiche_piece qui affiche la pièce numéro pièce en position pos au point de coordonnées (x, y) de la couleur couleur.
    4. en déduire la fonction efface_piece qui efface la pièce numéro pièce en position pos au point de coordonnées (x, y) ainsi que la fonction piece_descend qui affiche la pièce numéro pièce en position pos qui se trouvait au point de coordonnées (x, y) quand elle descend d'un cran.
    5. la fonction redessine qui réaffiche tout l'espace de jeu.
  5. la fonction mise_à_jour qui met à jour la représentation interne de l'espace de jeu quand la pièce numéro pièce en position pos au point de coordonnées (x, y) ne peut plus descendre.
  6. la fonction en_attendant_le_tic_suivant qui effectue la gestion des événements (l'utilisation des touches par un joueur) en attendant que le temps soit écoulé et que la pièce descende d'un cran supplémentaire si c'est possible.
  7. enfin la fonction principale tetris.

5.2   Compte-rendu

Le compte-rendu que vous rendrez devra détailler la représentation du jeu, des pièces et de leur mouvements ainsi que la gestion des évènements. Ce compte-rendu doit être clair et bref.

Ensuite si vous avez le temps vous pouvez implanter quelques-unes des améliorations demandées et en dire quelques mots dans votre compte-rendu.



Figure 1 : Phase de jeu.




Si l'on fait tomber la pièce dans la situation représentée ci-dessus, alors le score est augmentée de 13 points car la pièce chute de 13 lignes. De plus une ligne est complètée, il faut donc ajouter 100 points de plus au score et par conséquent le score passe des 25 points affichés à 138 points.

Figure 2 : Calcul des points sur un exemple.



Figure 3 : Jeu terminé.



Figure 4 : Les pièces.



Figure 5 : Les mouvements des pièces.


Les éléments sont repèrés par les coordonnées suivantes:



           élément 1: (-1, -1)

           élément 2: (0, -1)

           élément 3: (0, 1)






Figure 6 : Description de la pièce numéro 1.



Figure 7 : La rotation des pièces autour de leur point fixe.


Pièce Position 0 Position 1 Position 2 Position 3
1 -1 0 1 0 1 -1                                    
2                                                
3                                                
4                                                
5                                                
6                                                
7                                                

Table 1 : Tableau descriptif des positions des pièces.


Niveau Période Niveau Période
1 1000 11 200
2 800 12 180
3 600 13 160
4 500 14 140
5 440 15 120
6 400 16 100
7 360 17 80
8 320 18 60
9 280 19 40
10 240 20 20

Table 2 : Période en millisecondes en fonction du niveau de jeu.



Figure 8 : L'écran après quelques améliorations.


Ce document a été traduit de LATEX par HEVEA.