Exercice langage C: Flocons

Créez un programme contenant:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include 
#include "swindow.h"
 
struct Flocon
{
  int x, y;
};
 
void init_flocon(Flocon * f, int longueur, int hauteur)
{
  // ...
}
 
void dessine_flocon(SimpleWindow * window, Flocon * f)
{
  // ..
}
 
void avance_flocon(Flocon * f, int hauteur)
{
  f->y = f->y + 1;
}
 
int main(int argc, char ** argv)
{
  const int longueur = 200;
  const int hauteur  = 200;
 
  const int nb_flocons = 500;
 
  Flocon flocons[nb_flocons];
 
  SimpleWindow window("neige", longueur, hauteur);
  window.map();
 
  // Initialisation aleatoire de la position des flocons:
  for(int i = 0; i  nb_flocons; i++)
    init_flocon(flocons + i, longueur, hauteur);
 
  // Efface la fenetre en bleu clair:
  window.color(1, 0.5, 0.5);
  window.fill();
 
  // Dessine en blanc:
  window.color(1, 1, 1);
 
  // Affichage des flocons:
  for(int i = 0; i  nb_flocons; i++)
    dessine_flocon(&window, flocons + i);
 
  window.show();
 
  getchar();
 
  return 0;
}
  1. Écrivez la fonction init_flocon qui initialise les coordonnées du flocon passé en paramètre à une position aléatoire, et la fonction affiche_flocon, qui affiche le flocon avec un pixel aux coordonnées du flocon. Le programme n'affiche pour l'instant que des points statiques.
  2. Ajoutez une boucle comme vu en cours pour que les flocons soient animés.
  3. Modifiez la fonction avance_flocon pour qu'un flocon qui dépasse le bas de la fenêtre recommence à tomber du haut de la fenêtre.
  4. Le truc pour avoir un mouvement ``réaliste'' est de tirer le déplacement du flocon aléatoirement à chaque fois. Modifiez la fonction avance_flocon pour tirer le déplacement en y aléatoirement entre 0 et 3, le déplacement en x entre -2 et +2.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include 
#include "swindow.h"
 
struct Flocon
{
  int x, y;
};
 
void init_flocon(Flocon * f, int longueur, int hauteur)
{
  f->x = rand() % longueur;
  f->y = rand() % hauteur;
}
 
void dessine_flocon(SimpleWindow * window, Flocon * f)
{
  window->drawPoint(f->x, f->y);
}
 
void avance_flocon(Flocon * f, int hauteur)
{
  // Deplacement vertical entre 0 et 3.
  f->y = f->y + rand() % 4;
  // Deplacement horizontal entre -2 et 2.
  f->x = f->x + (rand() % 5) - 2;
 
  // Si le flocon est arrive en bas de la fenetre, on le replace au sommet.
  if (f->y >= hauteur)
    f->y = 0;
}
 
int main(int argc, char ** argv)
{
  const int longueur = 200;
  const int hauteur  = 200;
 
  const int nb_flocons = 500;
 
  Flocon flocons[nb_flocons];
 
  // Initialise le generateur de nombres aleatoires
  srand(time(0));
 
  SimpleWindow window("neige", longueur, hauteur);
  window.map();
 
  // Initialisation aleatoire de la position des flocons:
  for(int i = 0; i  nb_flocons; i++)
    init_flocon(flocons + i, longueur, hauteur);
 
  // boucle infinie pour afficher les flocons
  while (true) {
    // Efface la fenetre en bleu clair:
    window.color(1, 0.5, 0.5);
    window.fill();
 
    // Dessine en blanc:
    window.color(1, 1, 1);
 
    for(int i = 0; i  nb_flocons; i++) {
      // Affichage des flocons:
      dessine_flocon(&window, flocons + i);
 
      // Deplace les flocons:
      avance_flocon(flocons + i, hauteur);
    }
 
    window.show();
 
    // attends 20ms
    usleep(20000);
  }
 
  getchar();
 
  return 0;
}