#include #include #include #include #define LARGEUR_FENETRE 1050 #define HAUTEUR_FENETRE 750 #define TAILLE_CASE 15 #define ESPACE_BAS 75 #define ESPACE_HAUT 75 #define NBR_PASTILLE_INITIAL 5 #define COLONNES 60 #define LIGNES 40 #define LARGEUR_ECRAN_JEU 900 #define HAUTEUR_ECRAN_JEU 600 #define TAILLE_CARRE 120 #define CYCLE 1000000L #define MAX_LONGUEUR 100 typedef struct { int x; int y; } Segment; typedef struct { int x; int y; } Pastille; void Attendre(unsigned int millisecondes) { unsigned long debut = Microsecondes(); unsigned long attente = millisecondes * 1000; while (Microsecondes() - debut < attente) { } } /*Fonction Perdu !!!*/ void perdu(char *texte, int score, int minutes, int secondes, int pour_l_instant_t_a_pas_encore_perdue) { ChargerImage("perdu-removebg-preview.png", 300, 150, 30, 30, 900, 900); /*Afficher le score sur l'image*/ ChoisirCouleurDessin(CouleurParNom("black")); sprintf(texte, "%3d", score); EcrireTexte(455, 364, texte, 2); /*affichage du timer au menu*/ sprintf(texte, "%02d:%02d", minutes, secondes); EcrireTexte(660, 364, texte, 2); if (Touche() == XK_Escape) { pour_l_instant_t_a_pas_encore_perdue = 0; } else if (Touche() == XK_Return) { main(); } } void effacerSerpent(Segment serpent[], int longueurSerpent) { int i; ChoisirCouleurDessin(CouleurParComposante(126, 217, 87)); for (i = 0; i < longueurSerpent; i++) { RemplirRectangle(serpent[i].x, serpent[i].y, TAILLE_CASE, TAILLE_CASE); } } /*Fonction permettant d'afficher le serpent*/ void afficherSerpent(Segment serpent[], int taille) { int i; couleur couleurSerpent = CouleurParNom("yellow"); ChoisirCouleurDessin(couleurSerpent); for (i = 0; i < taille; i++) { serpent[i].x = LARGEUR_FENETRE / 2 + i * TAILLE_CASE; serpent[i].y = HAUTEUR_FENETRE / 2; } for (i = 0; i < taille; i++) { RemplirRectangle(serpent[i].x, serpent[i].y, TAILLE_CASE, TAILLE_CASE); } } /*Fonction recursive permettant d'afficher au moment de l'initialisation un nombre donnée en parametre de pastille Rouge (oui j'en suis fiere meme si c'est pas incroyable)*/ void afficherPastilleAleatoire(int z, Pastille pomme[]) { int i; for (i = 0; i < z; i++) { ; pomme[i].x = rand() % (COLONNES - 10) * TAILLE_CASE + 5 * TAILLE_CASE; pomme[i].y = rand() % (LIGNES - 5) * TAILLE_CASE + (ESPACE_HAUT - 3 * TAILLE_CASE); ChoisirCouleurDessin(CouleurParNom("red")); RemplirArc(pomme[i].x, pomme[i].y, TAILLE_CASE, TAILLE_CASE, 0, 360); } } /*Fonction initialisant la fenetre de jeux en vert*/ void EcranJeu() { int i, j; for (i = 2; i < LIGNES + 2; i++) { for (j = 5; j < COLONNES + 5; j++) { ChoisirCouleurDessin(CouleurParComposante(126, 217, 87)); RemplirRectangle(j * TAILLE_CASE, i * TAILLE_CASE, TAILLE_CASE, TAILLE_CASE); } } } void deplacerSerpent(int *longueurSerpent, Segment serpent[], int direction) { int i; effacerSerpent(serpent, *longueurSerpent); for (i = *longueurSerpent - 1; i > 0; i--) { serpent[i] = serpent[i - 1]; } switch (direction) { case 1: serpent[0].x += TAILLE_CASE; break; case 2: serpent[0].x -= TAILLE_CASE; break; case 3: serpent[0].y -= TAILLE_CASE; break; case 4: serpent[0].y += TAILLE_CASE; break; } for (i = 0; i < *longueurSerpent; i++) { ChoisirCouleurDessin(CouleurParNom("yellow")); RemplirRectangle(serpent[i].x, serpent[i].y, TAILLE_CASE, TAILLE_CASE); } Attendre(75); } int main() { unsigned long debut, suivant; int n = 0, minutes, secondes, score = 0; char texte[20]; int nbr_pastille = 5, touche, pour_l_instant_t_a_pas_encore_perdue = 1, i, j, x = 0, direction = 1, verifSerpent = 0, longueurSerpent = 10; Pastille *pomme = (Pastille *)malloc(nbr_pastille * sizeof(Pastille)); Segment *serpent = (Segment *)malloc(MAX_LONGUEUR * sizeof(Segment)); if (pomme == NULL || serpent == NULL) { printf("Erreur d'allocation de mémoire.\n"); return EXIT_FAILURE; } InitialiserGraphique(); CreerFenetre(350, 100, LARGEUR_FENETRE, HAUTEUR_FENETRE); srand(time(NULL)); EffacerEcran(CouleurParNom("black")); EcranJeu(); afficherPastilleAleatoire(NBR_PASTILLE_INITIAL, pomme); afficherSerpent(serpent, longueurSerpent); while (pour_l_instant_t_a_pas_encore_perdue) { if (longueurSerpent >= MAX_LONGUEUR){ serpent = (Segment*)realloc(serpent,(MAX_LONGUEUR+MAX_LONGUEUR) * sizeof(Segment)); } /*Temps ecoulé debut*/ if (Microsecondes() > suivant) { suivant = Microsecondes() + CYCLE; n++; minutes = n / 60; secondes = n % 60; ChoisirCouleurDessin(CouleurParNom("black")); RemplirRectangle(75, 650, 250, 40); ChoisirCouleurDessin(CouleurParNom("blue")); printf("Temps : %d secondes\n", n); sprintf(texte, "Temps : %02d : %02d", minutes, secondes); EcrireTexte(85, 685, texte, 2); } /*Temps ecoulé fin */ if (ToucheEnAttente()) { switch (Touche()) { case XK_Right: direction = 1; break; case XK_Left: direction = 2; break; case XK_Up: direction = 3; break; case XK_Down: direction = 4; break; case XK_space: ChargerImage("pause.png", 300, 150, 30, 30, 900, 900); while (Touche() != XK_space) { Attendre(10); } EcranJeu(); for(i=0;i= LARGEUR_ECRAN_JEU + 5 * TAILLE_CASE || serpent[0].y < ESPACE_HAUT - 3 * TAILLE_CASE || serpent[0].y >= HAUTEUR_ECRAN_JEU + 2 * TAILLE_CASE) { ChoisirCouleurDessin(CouleurParNom("black")); RemplirRectangle(serpent[0].x, serpent[0].y, TAILLE_CASE, TAILLE_CASE); Attendre(1000); /*Execution de la fontion perdu*/ perdu(texte, score, minutes, secondes, pour_l_instant_t_a_pas_encore_perdue = 0); } } free(pomme); free(serpent); Touche(); FermerGraphique(); return EXIT_SUCCESS; }