#include <stdlib.h> #include <stdio.h> #include <graph.h> #include <time.h> #include "evenements.h" #include "main.h" #include "gui.h" #include "scene.h" #define DELTA 100000L #define DELTA2 1000000L void FinJeu(PIXELS* serpent,PIXELS* pastilles,PIXELS* obstacle) { free(serpent); free(pastilles); free(obstacle); FermerGraphique(); } int main() { /* Déclarations des variables */ unsigned char pause = 0; unsigned long score = 0; unsigned long suivant; unsigned long suivant2; int game_on=0; int window_on=1; int secondes = 0; int minutes = 0; unsigned long int vitesse = DELTA; int valeur_retourne = 0; unsigned char perdu = 0; /* Tailles des tableaux dynamiques */ size_t longueur_serpent = 10; size_t longueur_pastilles = PASTILLES; size_t longueur_obstacle = OBSTACLE; /* Allocation dynamique des tableaux */ PIXELS *serpent = (PIXELS *)malloc(longueur_serpent * sizeof(PIXELS)); PIXELS *pastilles = (PIXELS *)malloc(longueur_pastilles * sizeof(PIXELS)); PIXELS *obstacle = (PIXELS *)malloc(longueur_obstacle * sizeof(PIXELS)); int direction = 0; int direction_davant = 0; /* Vérification des allocations mémoire */ if(serpent == NULL) { fprintf(stderr, "Erreur d'allocation de mémoire.\n"); return EXIT_FAILURE; } if(pastilles == NULL) { fprintf(stderr, "Erreur d'allocation de mémoire.\n"); return EXIT_FAILURE; } if(obstacle == NULL) { fprintf(stderr, "Erreur d'allocation de mémoire.\n"); return EXIT_FAILURE; } /* Initialisations */ InitialiserGraphique(); CreerFenetre(10,10,W_WINDOW,H_WINDOW); /* Peut être changer cette ligne avec la fonction Maxx et Maxy fournie dans graph.h ??*/ ChoisirTitreFenetre("SNAKE SAE11 IN C"); DessinerScene(pastilles,serpent,obstacle,longueur_serpent,longueur_pastilles,longueur_obstacle); while(window_on) { if(perdu == 1) { /* Affichage de l'écran de fin de partie */ PerduGUI(); if (ToucheEnAttente() == 1) { switch (Touche()) { case XK_Return: perdu = 0; break; case XK_Escape: FinJeu(serpent,pastilles,obstacle); return EXIT_SUCCESS; } } } else { /* Affichage du menu principal */ Menu(); if (ToucheEnAttente() == 1) { switch (Touche()) { case XK_Return : game_on=1; secondes = 0; minutes = 0; score = 0; vitesse = DELTA; longueur_serpent = 10; direction = 0; direction_davant = 0; DessinerScene(pastilles,serpent,obstacle,longueur_serpent,longueur_pastilles,longueur_obstacle); break; case XK_Escape: FinJeu(serpent,pastilles,obstacle); return EXIT_SUCCESS; } } } while(game_on) /* Lancement du cycle pour les Inputs et le Jeu*/ { if (ToucheEnAttente() == 1) { switch (Touche()) { case XK_Up: direction = 1; if(direction_davant == 3 && direction == 1) { direction = direction_davant; } break; case XK_Down: direction = 3; if(direction_davant == 1 && direction == 3) { direction = direction_davant; /* Changements de direction du serpent */ } break; case XK_Left: direction = 0; if(direction_davant == 2 && direction == 0) { direction = direction_davant; } break; case XK_Right: direction = 2; if(direction_davant == 0 && direction == 2) { direction = direction_davant; } break; case XK_space: if(pause ==0) { pause=1; break; } pause=0; break; case XK_Escape: if(pause == 1) { FinJeu(serpent,pastilles,obstacle); return EXIT_SUCCESS; } break; } } if(pause==1) { Pause(); } else if(pause==0) { if (Microsecondes()>suivant2) { secondes++; if(secondes == 60) { minutes++; secondes = 0; } suivant2=Microsecondes()+DELTA2; } if (Microsecondes()>suivant) { serpent = (PIXELS*) realloc(serpent,longueur_serpent * sizeof(PIXELS)); suivant=Microsecondes()+vitesse; AfficherTimerEtScore(&score,minutes,secondes); direction_davant = direction; /* Check si le serpent à le droit de changer de direction */ valeur_retourne = Serpent(serpent,pastilles,obstacle,&score,&longueur_serpent,longueur_obstacle,&vitesse,direction); if(valeur_retourne == 1) { } else if (valeur_retourne == 2) { CheckScore(score); perdu=1; game_on=0; } } } } } FinJeu(serpent,pastilles,obstacle); return EXIT_SUCCESS; }