362 lines
10 KiB
C
362 lines
10 KiB
C
/**
|
|
*
|
|
* 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 <MLV/MLV_all.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <getopt.h>
|
|
#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)
|
|
{
|
|
MLV_draw_text(
|
|
width / 2 - 75, height / 2,
|
|
"Game Over! You hit something.",
|
|
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;
|
|
} |