#include <stdlib.h> #include <stdio.h> #include <graph.h> #include <time.h> #define W_WINDOW 930 /* Largeur de la fenêtre*/ #define H_WINDOW 710 /* Hauteur de la fenêtre*/ #define W_GAME 900 #define H_GAME 600 #define T_PIXEL 15 /* Taille d'un pixel*/ #define DECALEMENT 30 #define delta 100000L void Affichertimeretscore(int m,int n,int score) /*Afficher le temps passé et le score*/ { char buf[100]; char buff[100]; couleur j; j=CouleurParNom("yellow"); ChoisirCouleurDessin(j); ChoisirEcran(1); CopierZone(2,1,0,0,930,710,0,0); snprintf(buf,100,"temps : %02d:%02d",m,n); snprintf(buff,100,"SCORE : %07d",score); EcrireTexte(60,650,buf,2); EcrireTexte(600,650,buff,2); CopierZone(1,0,0,0,930,710,0,0); } void grandirserpent(int *serpent) { } void DeplacementSerpent(int direction ,int *serpent, int longueur) { int tempX = serpent[0]; int tempY = serpent[1]; int i; couleur g; couleur j; ChoisirEcran(2); j=CouleurParNom("yellow"); g=CouleurParNom("lightgreen"); ChoisirCouleurDessin(g); RemplirRectangle(serpent[longueur-2],serpent[longueur-1],T_PIXEL,T_PIXEL); for (i = 2; i < longueur; i += 2) { int tempX2 = serpent[i]; int tempY2 = serpent[i + 1]; serpent[i] = tempX; serpent[i + 1] = tempY; tempX = tempX2; tempY = tempY2; } ChoisirCouleurDessin(j); if(direction == 0) /* Direction vers la gauche */ { printf("Gauche %d\n",direction); serpent[0]-=T_PIXEL; RemplirRectangle(serpent[0],serpent[1],T_PIXEL,T_PIXEL); printf("Longueur = %d | x %d | y %d",longueur,serpent[longueur-1],serpent[longueur-2]); } else if(direction == 1) /* Direction vers le haut */ { printf("Haut %d\n",direction); serpent[1]-=T_PIXEL; RemplirRectangle(serpent[0],serpent[1],T_PIXEL,T_PIXEL); } else if(direction == 2) /* Direction vers la droite */ { printf("Droite %d\n",direction); serpent[0]+=T_PIXEL; RemplirRectangle(serpent[0],serpent[1],T_PIXEL,T_PIXEL); } else if(direction == 3) /* Direction vers le bas */ { printf("Bas %d\n",direction); serpent[1]+=T_PIXEL; RemplirRectangle(serpent[0],serpent[1],T_PIXEL,T_PIXEL); } } int ArrondirPixel(int nombre) /* Calcule un arrondi du pixel pour pouvoir respecter la norme des 40 lignes et 60 colonnes */ { /* Calcul du reste de la division par 15 */ int reste = nombre % 15; /* Calcul de l'arrondi au multiple de 15 le plus proche */ int arrondi = (reste <= 7) ? nombre - reste : nombre + (15 - reste); return arrondi; } void gen_pastille(int nb_pastille, int *p_pastilles) /* Ajout des pointeurs pour le futur tableau de pastilles */ /* nb_pastille = int nombre de pastille voulue , p_pastilles est un pointeur d'un tableau de pixels qui sont des pastilles*/ /*Générer une pastille dans la grid*/ /*Code n'est pas complet*/ /*-Elles se génèrent à des endroits qui peuvent être les mêmes ou gêner le snake*/ { couleur r; int x_pastille,y_pastille,i; r=CouleurParNom("red"); srand(time(NULL)); for(i=0;i<nb_pastille*2;i+=2) { x_pastille= ArrondirPixel(rand()%W_GAME); y_pastille = ArrondirPixel(rand()%H_GAME); if(x_pastille < DECALEMENT) { x_pastille =+ DECALEMENT; } else if(x_pastille >W_GAME-DECALEMENT) { x_pastille - DECALEMENT; } if(y_pastille < DECALEMENT) { y_pastille =+ DECALEMENT; } else if(y_pastille > H_GAME-DECALEMENT) { y_pastille - DECALEMENT; } p_pastilles[i] = x_pastille ; p_pastilles[i+1] = y_pastille ; printf("x : %d ; y : %d\n",p_pastilles[i],p_pastilles[i+1]); ChoisirEcran(2); ChoisirCouleurDessin(r); RemplirRectangle(x_pastille,y_pastille,T_PIXEL,T_PIXEL); } } void DessinerScene(int* pastilles) /* Dessine la scène */ { couleur c; ChoisirEcran(2); c=CouleurParNom("lightgreen"); ChoisirCouleurDessin(c); RemplirRectangle(T_PIXEL,T_PIXEL,W_GAME,H_GAME); gen_pastille(5,pastilles); } void InitialisationDuSerpent(int *p_serpent) /* L'initialisation du serpent */ { int x_millieu = 0, y_millieu = 0 , compteur = 0; couleur j; int i = 0; j=CouleurParNom("yellow"); ChoisirCouleurDessin(j); x_millieu = T_PIXEL*30; /* 30 = 60 colonnes divisé par 2*/ y_millieu = T_PIXEL*20; /* 20 = 40 colonnes divisé par 2*/ ChoisirEcran(2); RemplirRectangle(x_millieu,y_millieu,T_PIXEL,T_PIXEL); /* printf("x_millieu : %d | y_millieu : %d\n",x_millieu,y_millieu); DEBUG*/ p_serpent[0] = x_millieu; p_serpent[1] = y_millieu; for(compteur=0;compteur<=18;compteur+=2) /* Commence par 1 car p_serpent index 0 initialisées pour la tête et 2 + 2x9 = 10 couples de coordonnées 2D */ { p_serpent[compteur+2] = p_serpent[compteur]+T_PIXEL; p_serpent[compteur+3] = p_serpent[compteur+1]; /*printf("x_millieu : %d | y_millieu : %d\n",p_serpent[compteur+2],p_serpent[compteur+3]); DEBUG*/ RemplirRectangle(p_serpent[compteur+2],p_serpent[compteur+3],T_PIXEL,T_PIXEL); } printf("Avant \n"); for (i = 0; i < 20; i += 2) { printf("(%d, %d) ", p_serpent[i], p_serpent[i + 1]); } printf("\n"); } int main() { int score =0; unsigned long suivant; int go_on=1; int x_pastille,y_pastille; int n = 0; int m = 0; size_t longueur_serpent = 20; size_t longueur_pastilles = 10; int *serpent = (int *)malloc(longueur_serpent * sizeof(int)); int *pastilles = (int *)malloc(longueur_pastilles * sizeof(int)); int direction = 0; 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; } 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); InitialisationDuSerpent(serpent); while(go_on) /* Lancement du cycle pour les Inputs et le Jeu*/ { if (ToucheEnAttente() == 1) { switch (Touche()) { case XK_Up: direction = 1; break; case XK_Down: direction = 3; break; case XK_Left: direction = 0; break; case XK_Right: direction = 2; break; case XK_space: switch (Touche()) { case XK_space: break; } default: printf("Autre touche\n"); break; } } else { if (Microsecondes()>suivant) { n++; if(n%60==0) { m++; n=0; } Affichertimeretscore(m,n,score); suivant=Microsecondes()+delta; DeplacementSerpent(direction,serpent,longueur_serpent); } } } FermerGraphique(); return EXIT_SUCCESS; }