Advertisement
Eastkap

ecosys va

Nov 16th, 2016
252
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.90 KB | None | 0 0
  1. #include <time.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include "ecosys.h"
  5.  
  6. /* Pour utiliser la correction automatique:
  7. cavecorrector 6-7 repertoire
  8.  */
  9.  
  10.  
  11.  
  12. Animal *creer_animal(int x, int y, float energie) {
  13.     //srand(time(NULL));
  14.     Animal *animal = (Animal*)malloc(sizeof(Animal));
  15.     if(animal == NULL) return NULL;
  16.     animal->x = x;
  17.     animal->y = y;
  18.     animal->dir[0] = 1 - (rand()%3);
  19.     animal->dir[1] = 1 - (rand()%3);
  20.     animal->energie = energie;
  21.     animal->precedent=NULL;
  22.     animal->suivant=NULL;
  23.     return animal;
  24. }
  25.  
  26. Animal *ajouter_en_tete_animal(Animal *liste, Animal *animal) {
  27.     animal->precedent = liste;
  28.     animal->suivant =(liste->suivant==NULL)?NULL:liste->suivant;
  29.     liste->suivant=animal;
  30.     //liste->precedent = animal;
  31.     return liste;
  32. }
  33.  
  34. void ajouter_animal(int x, int y, Animal **liste_animal) {
  35.     if( x<0 || y<0 || x>= SIZE_X || y>= SIZE_Y){
  36.         printf("Erreur de coordonnées.\n");
  37.         exit(1);
  38.     }else{
  39.         ajouter_en_tete_animal(*liste_animal,creer_animal(x,y,energie));
  40.     }
  41. }
  42.  
  43. int compare_animal(Animal *a, Animal *b){
  44.     if(a->x==b->x && a->y==b->y && a->dir[0]==b->dir[0] && a->dir[1]==b->dir[1] && a->energie==b->energie)
  45.         return 1;
  46.     return 0;
  47. }
  48.  
  49. void enlever_animal(Animal **liste, Animal *animal) {
  50.     Animal *indice=(*liste)->suivant;
  51.     while(indice!=NULL){
  52.         if(compare_animal(indice,animal)){
  53.             if(indice->suivant!=NULL){
  54.                 indice->precedent->suivant=indice->suivant;
  55.                 if(indice->precedent!=NULL)
  56.                     indice->suivant->precedent=indice->precedent;
  57.             }
  58.         if(indice!=NULL)
  59.             free(indice);
  60.         return; // on a trouve lanimal on a donc fini
  61.         }
  62.         if(indice->suivant!=NULL){
  63.             indice=indice->suivant;
  64.         }
  65.     }
  66. }
  67.   /*if(animal->precedent != NULL){ // perte de memoire
  68.       animal->precedent->suivant = animal->suivant;
  69.   }else if (animal->suivant != NULL){
  70.       animal->suivant->precedent = animal->precedent;
  71.   }else if(animal->precedent == NULL){
  72.       animal->suivant->precedent = NULL;
  73.   }else if(animal->suivant == NULL){
  74.       animal->precedent->suivant = NULL;
  75.   }
  76.   free(animal->precedent);
  77.   free(animal->suivant);*/
  78. unsigned int compte_animal_rec(Animal *la) {
  79.     if(la->suivant == NULL){
  80.         return 0;
  81.     }else{
  82.         return 1+compte_animal_rec(la->suivant);
  83.     }
  84.     return 0;
  85. }
  86.  
  87. unsigned int compte_animal_it(Animal *la) {//erreur dans le comptage??
  88.     unsigned int cpt = 0;
  89.     while(la->suivant!=NULL){
  90.         cpt++;
  91.         la=la->suivant;
  92.     }
  93.     return cpt-1;
  94. }
  95.  
  96. void bouger_animaux(Animal *la) {
  97.   if((float)rand()/((float)RAND_MAX)<p_ch_dir){
  98.     la->dir[0]=1 - (rand()%3);
  99.   }
  100.   else{
  101.     la->x=(la->x+la->dir[0]+SIZE_X)%SIZE_X;
  102.     }
  103.   if((float)rand()/(float)RAND_MAX<p_ch_dir){
  104.     la->dir[1]=1 - (rand()%3);
  105.   }
  106.   else{
  107.     la->y=(la->y+la->dir[1]+SIZE_Y)%SIZE_Y;
  108.   }
  109. }
  110.  
  111. void reproduce(Animal **liste_animal) {
  112.   Animal *sereproduit=(*liste_animal)->suivant;
  113.   while(sereproduit!=NULL){
  114.     if((float)rand()/(float)RAND_MAX<p_reproduce){
  115.         ajouter_animal(sereproduit->x,sereproduit->y,liste_animal);
  116.     }
  117.     sereproduit=sereproduit->suivant;
  118.   }
  119. }
  120. /*
  121. void rafraichir_proies(Animal **liste_proie) {
  122.   //ici cesty une copie donc faux
  123.   Animal *onterafraichit=*liste_proie;
  124.   while(onterafraichit->suivant!=NULL){
  125.     printf("o");
  126.     bouger_animaux(onterafraichit);
  127.     onterafraichit->energie+=-d_proie;
  128.     if(onterafraichit->energie<0){
  129.       enlever_animal(liste_proie,onterafraichit);
  130.     }
  131.     onterafraichit=onterafraichit->suivant;
  132.   }
  133.   reproduce(liste_proie);
  134.   return ;
  135. }*/
  136.  
  137. void rafraichir_proies(Animal **liste_proie) {
  138.     if(compte_animal_it(*liste_proie)>1){ // pourquoi si cette condition c'est bon, sinon on a un free qd mm? a explorer?
  139.         Animal *onterafraichit=(*liste_proie)->suivant;
  140.         while(onterafraichit!=NULL){
  141.             //printf("o");
  142.             bouger_animaux(onterafraichit);
  143.             onterafraichit->energie+=-d_proie;
  144.             if(onterafraichit->energie<=0)
  145.                 enlever_animal(liste_proie,onterafraichit);
  146.             if(onterafraichit->suivant==NULL || onterafraichit==NULL)
  147.                 break;
  148.             onterafraichit=onterafraichit->suivant;
  149.         }
  150.     }
  151.     reproduce(liste_proie);// qui fait bug;
  152. }
  153.  
  154.  
  155. Animal *animal_en_XY(Animal *l, int x, int y) {
  156.   /* a completer */
  157.   return NULL;
  158. }
  159.  
  160. void rafraichir_predateurs(Animal **liste_predateur, Animal **liste_proie) {
  161.   /* a completer */
  162.  
  163. }
  164.  
  165. int trouve_animal(Animal *liste,int x, int y){
  166.     Animal *ontecherche=liste;
  167.     while(ontecherche->suivant != NULL){
  168.         ontecherche=ontecherche->suivant;
  169.         if(ontecherche->x==x && ontecherche->y==y){
  170.             return 1;
  171.         }
  172.     }
  173.     return 0;
  174. }
  175.  
  176. void afficher_ecosys(Animal *liste_proie,Animal *liste_predateur) {
  177.     int i, j;
  178.     //Animal *proies=liste_proie->suivant,*predateurs=liste_predateur->suivant;
  179.     //int len = max(liste_proie, liste_predateur);
  180.     for(i = 0; i<SIZE_Y; i++){
  181.         for(j = 0; j<SIZE_X; j++){
  182.             if(trouve_animal(liste_proie,i,j)){
  183.                 if(trouve_animal(liste_predateur,i,j)){
  184.                     printf("@");
  185.                 }
  186.                 printf("*");
  187.             }
  188.             else if(trouve_animal(liste_predateur,i,j))
  189.                 printf("O");
  190.             else
  191.                 printf(" ");
  192.         }
  193.         printf("\n");
  194.     }
  195.     // le soucis ici c'est que si on trouve le 3e animal en bas a droite par exemple, on a perdu la reference du 4 et 5 car les boucles over
  196.     // lidee serait plutot de parcourir a chaque fois les deux structures
  197. }
  198.  
  199. void liberer_liste_animaux(Animal *liste) {
  200.     Animal *np = liste;
  201.     if (!liste) return;
  202.     //assert(!liste->precedent); /* debut de la liste */
  203.     do {
  204.         np = liste->suivant;
  205.         free(liste);
  206.         liste = np;
  207.     }while (liste);
  208. }
  209.  
  210. void clear_screen() {
  211.   printf("\x1b[2J\x1b[1;1H");  /* code ANSI X3.4 pour effacer l'ecran */
  212. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement