void init_grille_from_file (char * filename, grille* g){ FILE * pfile = NULL; pfile = fopen(filename, "r"); assert (pfile != NULL); int i,j,n,l,c,vivantes=0,non_viables=0; fscanf(pfile, "%d", & l); fscanf(pfile, "%d", & c); alloue_grille(l,c,g); fscanf(pfile, "%d", & vivantes); for (n=0; n< vivantes; ++n){ fscanf(pfile, "%d", & i); fscanf(pfile, "%d", & j); set_vivante(i,j,*g); } fscanf(pfile, "%d", & non_viables); for (n=0; n< non_viables; ++n){ fscanf(pfile, "%d", & i); fscanf(pfile, "%d", & j); set_non_viable(i,j,*g); } fclose (pfile); return; }
/** @brief Loads the content of an element of type "grille" from a compatible text file, plus loads the gamer position @param <grille * g> <an element of type "grille" to load the file content in> @param <char filename[]> <file name> @return <void> */ grille * creer_grille(char filename[], joueur * j) { FILE* fichier = NULL; fichier = fopen(filename, "r"); if (fichier != NULL) { int n, m; fscanf(fichier,"%d %d", &n, &m); fgetc(fichier); grille * g = alloue_grille(n, m); fscanf(fichier, "%d %d", &j -> x, &j -> y); fgetc(fichier); for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ fscanf(fichier,"%d",&g -> content[i][j]); } fgetc(fichier); } fclose(fichier); return g; } else { printf("Impossible d'ouvrir le fichier grille.txt"); exit (1); } }
grille charger_grille(grille L, char* nom,char* mode){ int i=0,v=0; grille charge=alloue_grille(L->N,L->M); FILE* fichier = NULL; char chaine[TAILLE_MAX] = ""; fichier = fopen(nom, mode); if (fichier != NULL) { while (fgets(chaine, TAILLE_MAX, fichier) != NULL ) { if(v==L->N) break; for(i=0;i<L->M;i++) charge->matrice[v][i]=chaine[i]; v++; } fclose(fichier); } else exit(1); return charge; }
/** * \brief initialisation et début du jeu (mode graphique) * \param argc nombre d'arguments shell * \param argv tableau des arguments shell */ int main (int argc, char *argv[]){ // argument test if (argc != 2 ){ printf("usage : main <fichier grille>\n"); return 1; } // X11 display Display *dpy; Window rootwin; Window win; int scr; // init the display if(!(dpy=XOpenDisplay(NULL))) { fprintf(stderr, "ERROR: Could not open display\n"); exit(1); } scr=DefaultScreen(dpy); rootwin=RootWindow(dpy, scr); win=XCreateSimpleWindow(dpy, rootwin, 1, 1, SIZEX, SIZEY+70, 0, BlackPixel(dpy, scr), BlackPixel(dpy, scr)); XStoreName(dpy, win, "jeu de la vie"); XSelectInput(dpy, win, ExposureMask|ButtonPressMask|KeyPressMask); XMapWindow(dpy, win); // create cairo surface cairo_surface_t *cs; cs=cairo_xlib_surface_create(dpy, win, DefaultVisual(dpy, 0), SIZEX, SIZEY+70); // init program data grille g, gc; init_grille_from_file(argv[1],&g); alloue_grille (g.nbl, g.nbc, &gc); // run the event loop debut_jeu(&g, &gc, dpy, cs); // free program data libere_grille(&g); libere_grille(&gc); cairo_surface_destroy(cs); // destroy cairo surface XCloseDisplay(dpy); // close the display return 0; }
grille charger_image( char* nom_du_fichier,char* mode,int seuil) { int i=0,v=0; char R=0,V=0,B=0; FILE* fichier = NULL; int ValMax=0; char modeImage[2]; int sizeImageH=0, sizeImageV=0; char chaine[TAILLE_MAX] = ""; grille charge; fichier = fopen(nom_du_fichier, mode); if (fichier != NULL) { fgets(modeImage,TAILLE_MAX,fichier); //1er ligne le mode fgets(chaine,TAILLE_MAX,fichier); //2eme ligne meta donnee de creation de l'image -> On passe simplement a la ligne suivante fscanf(fichier,"%d %d", &sizeImageH,&sizeImageV); //3eme ligne recuperation de la taille de l'image fscanf(fichier,"%d", &ValMax); //4eme valeurs max des composantes if (sizeImageH>15) // tronque l'image si elle est plus grande que 15 colonneS sizeImageH=15; if (sizeImageV>15) // tronque l'image si elle est plus grande que 15 lignes sizeImageV=15; charge=alloue_grille(sizeImageH,sizeImageV); // creer un logigraphe a la taille de l'image //if (modeImage=="P3"){ for(i=0; i<sizeImageV; i++) { for(v=0; v<sizeImageH; v++) { fscanf(fichier,"%c", &R); fscanf(fichier,"%c", &V); fscanf(fichier,"%c", &B); if((R*0.299+V*0.587+B*0.114)<=seuil) charge->matrice[i][v]='+'; else charge->matrice[i][v]='.'; } } //} fclose(fichier); } return charge; }
int main (int argc, char ** argv) { if (argc != 2 ) { printf("usage : main <fichier grille>"); return 1; } grille g, gc; init_grille_from_file(argv[1],&g); alloue_grille (g.nbl, g.nbc, &gc); affiche_grille(g); debut_jeu(&g, &gc); libere_grille(&g); libere_grille(&gc); return 0; }
grille compter_ligne(grille l){ grille valeur=alloue_grille(l->N,l->M); int i=0,v=0; int x=0; for(i=0;i<l->N;i++) for(v=0;v<l->M;v++) valeur->matrice[i][v]=0; for(i=0;i<l->N;i++){ x=0; for(v=0;v<l->M;v++){ if (l->matrice[i][v]=='+') valeur->matrice[i][x]+=1; else if ((valeur->matrice[i][x]!=0) && (l->matrice[i][v]=='.')) x++; } } return valeur; }
void debut_jeu(grille *g, grille *gc){ char c = getchar(); while (c != 'q') // touche 'q' pour quitter { printf("\e[J"); switch (c) { case '\n' : { // touche "entree" pour évoluer evolue(g,gc); efface_grille(*g); affiche_grille(*g); break; } case 'c' : // touche pour changer de mode cyclique/non-cyclique { cyclique=abs(cyclique-1); compte_voisins_vivants=(cyclique==0) ? compte_cyclique : compte_non_cyclique; printf("\n\e[1A"); break; } case 'v' : // touche pour activer/désactiver le veillissement { viellissement=abs(viellissement-1); if (!viellissement) { //effacer les âges d'avant int i,j; for (i=0; i<g->nbl; i++) for (j=0;j<g->nbc; j++) if (est_vivante(i,j,*g)) set_vivante(i,j,*g); else set_morte(i,j,*g); } printf("\n\e[1A"); break; } case 'o' : // touche pour tester si la colonie est oscillante { int periode=0, failsafe=0; grille gtest,gmorte; //g doit rester inchangée alloue_grille (g->nbl, g->nbc, >est); alloue_grille (g->nbl, g->nbc, &gmorte); copie_grille(*g,gtest); do { periode++; failsafe++; evolue(>est,gc); } while (!( compare_grilles(gtest,*g) || compare_grilles(gtest,gmorte) ) && failsafe < MAX_TEST ); //soit on retombe sur la même configuration (-> oscillant) //soit toutes les cellules seront mortes à un moment (-> pas oscillant) if (compare_grilles(gtest,gmorte) || failsafe==MAX_TEST) printf("Pas oscillant."); else printf("Oscillant. Période: %d ",periode); libere_grille(>est); libere_grille(&gmorte); break; } default : { // touche non traitée printf("\n\e[1A"); break; } } c = getchar(); } return; }