/** * * Ce programme montre comment il est possible de dessiner les figures * géométriques suivantes : * * cercle * disque ( cercle plein ) * ellipse * ellipse pleine * rectangle * rectangle plein * ligne * point * Courbe de Bézier * polygone * polygone plein * * Pour cela le programme utilise les fonctions suivantes : * *------------------------------------------------------------------------------ * MLV_draw_circle: Dessine un cercle à une position et un rayon spécifiés en * paramètres. * * void MLV_draw_circle( * int x, Coordonnée en X du centre du cercle * int y, Coordonnée en Y du centre du cercle * int radius, Rayon du cercle * MLV_Color color Couleur du tracé * ); * * ----------------------------------------------------------------------------- * MLV_draw_filled_circle : Dessine un disque plein dont le centre et le rayon * sont passés en parametres. * * void MLV_draw_filled_circle( * int x, Coordonnée en X du centre du cercle * int y, Coordonnée en Y du centre du cercle * int radius, Rayon du cercle * MLV_Color color Couleur du tracé * ); * * ----------------------------------------------------------------------------- * MLV_draw_ellipse : Dessine une ellipse dont la position, les rayons et la * couleur sont passés en paramètres. * * MLV_draw_ellipse( * int x, Coordonnée en X du centre de l'ellipse * int y, Coordonnée en Y du centre de l'ellipse * int radius_x, Rayon en X de l'ellipse * int radius_y, Rayon en Y de l'ellipse * MLV_Color color Couleur du tracé * ); * * ----------------------------------------------------------------------------- * MLV_draw_filled_ellipse : Dessine une ellipse pleine dont la position, les * rayons et la couleur sont passés en paramètres. * * void MLV_draw_filled_ellipse( * int x, Coordonnee en X du centre de l'ellipse * int y, Coordonnee en Y du centre de l'ellipse * int radius_x, Rayon en X de l'ellipse * int radius_y, Rayon en Y de l'ellipse * MLV_Color color Couleur du tracé * ); * * ----------------------------------------------------------------------------- * MLV_draw_rectangle : Dessine un rectangle dont la taille, la couleur et la * position du sommet Nord-Ouest sont données en * paramètres. * * void MLV_draw_rectangle( * int x, Coordonnée en X du sommet Nord-Ouest du rectangle * int y, Coordonnée en Y du sommet Nord-Ouest du rectangle * int width, Largeur du rectangle * int height, Hauteur du rectangle * MLV_Color color Couleur du tracé * ); * * ----------------------------------------------------------------------------- * MLV_draw_filled_rectangle : Dessine un rectangle dont la taille, la couleur * et la position du sommet Nord-Ouest sont données * en paramètres. * void MLV_draw_filled_rectangle( * int x, Coordonnée en X du sommet Nord-Ouest du rectangle * int y, Coordonnée en Y du sommet Nord-Ouest du rectangle * int width, Largeur du rectangle * int height, Hauteur du rectangle * MLV_Color color Couleur du tracé * ); * * ----------------------------------------------------------------------------- * MLV_draw_line : Dessine une ligne dont les coordonnées des deux extrémités * sont passées en paramètres. * void MLV_draw_line( * int x1, Coordonnée en X de la première extrémité de la ligne * int y1, Coordonnée en Y de la première extrémité de la ligne * int x2, Coordonnée en X de la deuxième extrémité de la ligne * int y2, Coordonnée en Y de la deuxième extrémité de la ligne * MLV_Color color Couleur du tracé * ); * * ----------------------------------------------------------------------------- * MLV_draw_point : Dessine un point dont les coordonées sont passées * en paramètres. * * void MLV_draw_point( * int x, Coordonnée en X du point * int y, Coordonnée en Y du point * MLV_Color color Couleur du tracé * ); * * ----------------------------------------------------------------------------- * MLV_draw_bezier_curve: Dessine une courbe de Bézier à partir d'une liste de * sommets. * * void MLV_draw_bezier_curve( * const int* vx, La liste des coordonnées en X des différents * sommets de la courbe. * const int* vy, La liste des coordonnées en Y des différents * sommets de la courbe. * int npoints, Le nombre de sommets de la courbe de Bézier. * MLV_Color color La couleur du tracé * ); * * ----------------------------------------------------------------------------- * MLV_draw_polygon: Dessine un polygone à partir d'une liste de sommets. * * void MLV_draw_polygon( * const int* vx, La liste des coordonnées en X des différents * sommets du polygone. * const int* vy, La liste des coordonnées en Y des différents * sommets du polygone. * int npoints, Le nombre de sommets du polygone. * MLV_Color color La couleur du tracé * ); * * ----------------------------------------------------------------------------- * MLV_draw_polygon: Dessine un polygone plein à partir d'une liste de sommets. * * void MLV_draw_filled_polygon( * const int* vx, La liste des coordonnées en X des différents * sommets du polygone. * const int* vy, La liste des coordonnées en Y des différents * sommets du polygone. * int npoints, Le nombre de sommets du polygone. * MLV_Color color La couleur du tracé * ); * * ----------------------------------------------------------------------------- * * Il existe d'autres fonctions de dessin. Vous les trouverez en consultant * le fichier MLV_shape.h ou en tapant dans le terminal la commande : * * man MLV_shape.h */ #include #include #include #include #include #include "grid.h" #include "snake.h" #define DIFFICULTY 6 void print_help() { printf("Usage: snake2025 [OPTIONS]\n"); printf("Options:\n"); printf(" -h, --help Display this help message\n"); printf(" -i, --input FILE Load initial grid configuration from FILE\n"); printf("\n"); printf("This is a simple snake game. Use the arrow keys to control the snake.\n"); printf("Press ESC to exit the game.\n"); } int read_grid_from_file(const char *filename, char grid[NBL][NBC + 1]) { int i, j, nb_fruit = 0; FILE *file = fopen(filename, "r"); if (!file) { fprintf(stderr, "Error: Could not open file %s\n", filename); exit(EXIT_FAILURE); } for (i = 0; i < NBL; i++) { if (!fgets(grid[i], NBC + 2, file)) { fprintf(stderr, "Error: File %s does not contain enough lines\n", filename); fclose(file); exit(EXIT_FAILURE); } grid[i][strcspn(grid[i], "\n")] = '\0'; for (j = 0; j < NBC; j++) { if (grid[i][j] == FRUIT) { nb_fruit++; } } } fclose(file); return nb_fruit; } int count_fruits(char grid[NBL][NBC + 1]) { int i, j, nb_fruit = 0; for (i = 0; i < NBL; i++) { for (j = 0; j < NBC; j++) { if (grid[i][j] == FRUIT) { nb_fruit++; } } } return nb_fruit; } int main(int argc, char *argv[]) { int opt, option_index = 0, loop_count = 0, nb_fruit = 0; char *input_file = NULL; MLV_Keyboard_button touche = MLV_KEYBOARD_NONE; int width = 640, height = 480; char grid[NBL][NBC + 1] = {0}; static struct option long_options[] = { {"help", no_argument, 0, 'h'}, {"input", required_argument, 0, 'i'}, {0, 0, 0, 0}}; Snake snake; snake.pos[0].x = 1; snake.pos[0].y = 3; snake.pos[1].x = 1; snake.pos[1].y = 2; snake.pos[2].x = 1; snake.pos[2].y = 1; snake.pos[3].x = 1; snake.pos[3].y = 0; snake.dir = RIGHT; while ((opt = getopt_long(argc, argv, "hi:", long_options, &option_index)) != -1) { switch (opt) { case 'h': print_help(); return 0; case 'i': input_file = optarg; break; default: fprintf(stderr, "Unknown option. Use -h or --help for usage information.\n"); return 1; } } if (input_file) { nb_fruit = read_grid_from_file(input_file, grid); } else { int i, j; for (i = 0; i < NBL; i++) { for (j = 0; j < NBC; j++) { grid[i][j] = EMPTY; } } nb_fruit = count_fruits(grid); } place_snake(grid, &snake); MLV_create_window("SNAKE", "3R-IN1B", width, height); MLV_change_frame_rate(24); while ( MLV_get_event( &touche, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) == MLV_NONE || touche != MLV_KEYBOARD_ESCAPE) { Element result; MLV_clear_window(MLV_COLOR_BLACK); loop_count = (loop_count + 1) % DIFFICULTY; if (loop_count == 0) { result = move_snake(&snake, grid); if (result == WALL || result == SNAKE) { if (result == WALL) { MLV_draw_text(width / 2 - 75, height / 2, "Game Over! You hit a wall.", MLV_COLOR_RED); } else if (result == SNAKE) { MLV_draw_text(width / 2 - 75, height / 2, "Game Over! You hit yourself.", MLV_COLOR_RED); } MLV_actualise_window(); MLV_wait_seconds(3); break; } else if (result == FRUIT) { nb_fruit--; if (nb_fruit == 0) { MLV_draw_text( width / 2 - 75, height / 2, "You Win! All fruits collected.", MLV_COLOR_GREEN); MLV_actualise_window(); MLV_wait_seconds(3); break; } } } draw_grid(grid); MLV_actualise_window(); switch (touche) { case MLV_KEYBOARD_DOWN: if (snake.dir != TOP) snake.dir = BOTTOM; break; case MLV_KEYBOARD_UP: if (snake.dir != BOTTOM) snake.dir = TOP; break; case MLV_KEYBOARD_LEFT: if (snake.dir != RIGHT) snake.dir = LEFT; break; case MLV_KEYBOARD_RIGHT: if (snake.dir != LEFT) snake.dir = RIGHT; break; default: break; } touche = MLV_KEYBOARD_NONE; MLV_delay_according_to_frame_rate(); } MLV_free_window(); return 0; }