Exercice langage C: Flocons
Rédigé par GC Team, Publié le 17 Mars 2012, Mise à jour le Samedi, 17 Décembre 2022 22:05Créez un programme contenant:
#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;
}
- Écrivez la fonction
init_flocon
qui initialise les coordonnées du flocon passé en paramètre à une position aléatoire, et la fonctionaffiche_flocon
, qui affiche le flocon avec un pixel aux coordonnées du flocon. Le programme n'affiche pour l'instant que des points statiques. - Ajoutez une boucle comme vu en cours pour que les flocons soient animés.
- 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. - 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.
#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;
}