Skip to content
Snippets Groups Projects
Commit a4620e9f authored by MOSA SAMY's avatar MOSA SAMY
Browse files

Initial commit

parents
Branches
No related merge requests found
bin/
obj/
*.tar
*.tar.gz
*.pdf
*.zip
\ No newline at end of file
# Jeu de la vie
Le jeu de la vie est un automate cellulaire imaginé par John Horton Conway en 1970.
\ No newline at end of file
#ifndef __GRILLE_H
#define __GRILLE_H
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
// structure grille : nombre de lignes, nombre de colonnes, tableau de tableau de cellules
typedef struct {int nbl; int nbc; int** cellules;} grille;
// alloue une grille de taille l*c, et initialise toutes les cellules à mortes
void alloue_grille (int l, int c, grille* g);
// libère une grille
void libere_grille (grille* g);
// alloue et initalise la grille g à partir d'un fichier
void init_grille_from_file (char * filename, grille* g);
// rend vivante la cellule (i,j) de la grille g
static inline void set_vivante(int i, int j, grille g){g.cellules[i][j] = 1;}
// rend morte la cellule (i,j) de la grille g
static inline void set_morte(int i, int j, grille g){g.cellules[i][j] = 0;}
// teste si la cellule (i,j) de la grille g est vivante
static inline int est_vivante(int i, int j, grille g){return g.cellules[i][j] == 1;}
// recopie gs dans gd (sans allocation)
void copie_grille (grille gs, grille gd);
#endif
#ifndef __IO_H
#define __IO_H
#include <stdio.h>
#include "grille.h"
#include "jeu.h"
// affichage d'un trait horizontal
void affiche_trait (int c);
// affichage d'une ligne de la grille
void affiche_ligne (int c, int* ligne);
// affichage d'une grille
void affiche_grille (grille g);
// effacement d'une grille
void efface_grille (grille g);
// debute le jeu
void debut_jeu(grille *g, grille *gc);
#endif
#ifndef __JEU_H
#define __JEU_H
#include "grille.h"
// modulo modifié pour traiter correctement les bords i=0 et j=0
// dans le calcul des voisins avec bords cycliques
static inline int modulo(int i, int m) {return (i+m)%m;}
// compte le nombre de voisins vivants de la cellule (i,j)
// les bords sont cycliques.
int compte_voisins_vivants (int i, int j, grille g);
// fait évoluer la grille g d'un pas de temps
void evolue (grille *g, grille *gc);
#endif
#include "grille.h"
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;
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);
}
fclose (pfile);
return;
}
void copie_grille (grille gs, grille gd){
int i, j;
for (i=0; i<gs.nbl; ++i) for (j=0; j<gs.nbc; ++j) gd.cellules[i][j] = gs.cellules[i][j];
return;
}
src/io.c 0 → 100644
#include "io.h"
void affiche_trait (int c){
int i;
for (i=0; i<c; ++i) printf ("|---");
printf("|\n");
return;
}
void affiche_ligne (int c, int* ligne){
int i;
for (i=0; i<c; ++i)
if (ligne[i] == 0 ) printf ("| "); else printf ("| O ");
printf("|\n");
return;
}
void affiche_grille (grille g){
int i, l=g.nbl, c=g.nbc;
printf("\n");
affiche_trait(c);
for (i=0; i<l; ++i) {
affiche_ligne(c, g.cellules[i]);
affiche_trait(c);
}
printf("\n");
return;
}
void efface_grille (grille g){
printf("\n\e[%dA",g.nbl*2 + 5);
}
void debut_jeu(grille *g, grille *gc){
char c = getchar();
while (c != 'q') // touche 'q' pour quitter
{
switch (c) {
case '\n' :
{ // touche "entree" pour évoluer
evolue(g,gc);
efface_grille(*g);
affiche_grille(*g);
break;
}
default :
{ // touche non traitée
printf("\n\e[1A");
break;
}
}
c = getchar();
}
return;
}
#include "jeu.h"
int compte_voisins_vivants (int i, int j, grille g){
int v = 0, l=g.nbl, c = g.nbc;
v+= est_vivante(modulo(i-1,l),modulo(j-1,c),g);
v+= est_vivante(modulo(i-1,l),modulo(j,c),g);
v+= est_vivante(modulo(i-1,l),modulo(j+1,c),g);
v+= est_vivante(modulo(i,l),modulo(j-1,c),g);
v+= est_vivante(modulo(i,l),modulo(j+1,c),g);
v+= est_vivante(modulo(i+1,l),modulo(j-1,c),g);
v+= est_vivante(modulo(i+1,l),modulo(j,c),g);
v+= est_vivante(modulo(i+1,l),modulo(j+1,c),g);
return v;
}
void evolue (grille *g, grille *gc){
copie_grille (*g,*gc); // copie temporaire de la grille
int i,j,l=g->nbl, c = g->nbc,v;
for (i=0; i<l; i++)
{
for (j=0; j<c; ++j)
{
v = compte_voisins_vivants (i, j, *gc);
if (est_vivante(i,j,*g))
{ // evolution d'une cellule vivante
if ( v!=2 && v!= 3 ) set_morte(i,j,*g);
}
else
{ // evolution d'une cellule morte
if ( v==3 ) set_vivante(i,j,*g);
}
}
}
return;
}
#include <stdio.h>
#include "grille.h"
#include "io.h"
#include "jeu.h"
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;
}
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment