tete du loic

 Loïc YON [KIUX]

  • Enseignant-chercheur
  • Référent Formation Continue et alternance ingénieur
  • Responsable de la filière F2 ingénieur
  • Secouriste Sauveteur du Travail
mail
loic.yon@isima.fr
phone
(+33 / 0) 4 73 40 50 42
location_on
Institut d'informatique ISIMA
  • twitter
  • linkedin
  • viadeo

[C] Moteur texte du jeu Flood It

Date de première publication : 2014/09/17

Principe du jeu

Nous vous proposons de coder le moteur d’un jeu qui s’intitule Flood It (de LabPixies disponible sur iPhone et Android). Le principe est très simple : Vous disposez d’une zone de jeu carrée de 12 cases par 12 cases. Chacune des cases est remplie d’une couleur sur 6 possibles. Vous devez vous arranger pour que toutes les cases soient de la même couleur en 22 coups maximum. Pour cela, vous choisissez une couleur pour la case en haut à gauche et cela peint toutes les cases adjacentes de cette couleur : le raz de marée. On dira qu’une case est adjacente si elle est de la couleur de la première case avant le changement et si elle touche une case de cette couleur soit par le haut/bas, soit par la gauche ou la droite (on ne considère pas les cases en diagonales).

Si vous voulez tester le jeu, voici une version HTML / Javascript

On remplace les couleurs par un chiffre entre 0 et 5. Voici un petit exemple :

Situation initiale :

0131
2122
3113
0044
La première case est de la couleur 0...

Premier coup :

1131
2122
3113
0044
On choisit la couleur 1. On aurait pu choisir la couleur 2 mais une seule case aurait été couverte en plus. Choisir les couleurs 3 ou 4 n'aurait pas eu d'intérêt.

Deuxième coup :

3331
2322
3333
0044
On choisit la couleur 3 arbitrairement (toutes les autres à l'exception de la 1 auraient pu convenir).

La partie se termine alors en 6 coups (choisir dans n'importe quel ordre les couleurs 2, 1, 0 et 4). Vous avez compris ?

Ce qu'il faut faire ...

  1. Définir deux constantes symboliques COULEURS de valeur 6 et TAILLE de valeur 12.
  2. Écrire une fonction initialiser() qui prend en paramètre le tableau à deux dimensions et qui initialise le tableau avec des couleurs au hasard.
  3. Écrire une fonction afficherGrille() qui affiche la grille donnée en paramètre. On pourra afficher les entiers mais aussi utiliser une séquence d'échappement pour que ce soit plus visible.
  4. Écrire une fonction fin() qui renvoie 1 si la grille est remplie de cases de la même couleur, 0 sinon. La grille est donnée en paramètre.
  5. Écrire la fonction remplir() qui prend en paramètre la grille courante, la couleur de la première case avant changement, la nouvelle couleur, des coordonnées i et j du tableau. Si la couleur de la case (i,j) est de la couleur originale de la case (0,0), on la change pour la nouvelle puis on propage aux cases adjacentes.
  6. Écrire une fonction main() qui définit une grille, initialise la grille et l’affiche. La boucle principale du programme demandera à l’utilisateur un nombre, en général une couleur, et lancera le raz de marée. Le programme se termine :
    • quand la grille est uniforme
    • si l’utilisateur force la fin du programme (code 999 par exemple).
    • si le nombre d’itérations dépasse 22.

Si l’utilisateur donne la couleur de la case (0,0), on ne doit rien faire.

Ce TP se poursuit pour en faire une version graphique et en couleurs avec la Xlib ou la -SDL2.

Compléments

Fonction remplir()

Je vous propose de programmer remplir() de manière récursive en appelant la fonction sur les cases adjacentes :

 
?
???
?
Les cases en couleurs sont les cases adjacentes à tester pour le remplissage.

L'algorithme est très simple :

Couleurs dans un terminal

Il est plus facile pour le joueur d'afficher des couleurs en lieu et place des nombres représentant la couleur. C'est tout à fait possible d'afficher de la couleur dans un terminal UNIX en utilisant ce que l'on appelle des séquences d'échappement en octal

Pour modifier la couleur de fond, il faut utiliser la séquence \033[nmn est un nombre qui va de 40 (fond noir) au 47.

La séquence \033[0m permet de restituer les valeurs par défaut au shell.

Plus d'explications ici.

Aller plus loin...

  1. Quelles(s) fonction(s) doit-on modifier pour que l’utilisateur puisse donner la taille de la zone de jeu, le nombre de couleurs et le nombre maximum de coups en ligne de commande ?
  2. Faire les modifications. Si aucun paramètre n’est donné, on doit utiliser 12 cases, 6 couleurs et 22 coups au maximum.
  3. Modifier la fonction main() pour que la grille soit maintenant allouée dynamiquement. Mettre à jour les autres fonctions.