Advertisement
Eastkap

ecosys vb

Nov 16th, 2016
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.94 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 = NULL;
  28.     if(liste->suivant!=NULL){
  29.         animal->suivant=liste->suivant;
  30.         liste->suivant->precedent=animal;
  31.     }
  32.     else{
  33.         animal->suivant=NULL;
  34.     }
  35.     liste->suivant=animal;
  36.     return liste;
  37. }
  38.  
  39. void ajouter_animal(int x, int y, Animal **liste_animal) {
  40.     if( x<0 || y<0 || x>= SIZE_X || y>= SIZE_Y){
  41.         printf("Erreur de coordonnées.\n");
  42.         exit(1);
  43.     }else{
  44.         ajouter_en_tete_animal(*liste_animal,creer_animal(x,y,energie));
  45.     }
  46. }
  47.  
  48. /*int compare_animal(Animal *a, Animal *b){
  49.     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)
  50.         return 1;
  51.     return 0;
  52. }
  53.  
  54. void enlever_animal(Animal **liste, Animal *animal) {
  55.     Animal *indice=(*liste)->suivant;
  56.     while(indice!=NULL){
  57.         if(compare_animal(indice,animal)){
  58.             if(indice->suivant!=NULL){
  59.                 indice->precedent->suivant=indice->suivant;
  60.                 if(indice->precedent!=NULL)
  61.                     indice->suivant->precedent=indice->precedent;
  62.             }
  63.         if(indice!=NULL)
  64.             free(indice);
  65.         return; // on a trouve lanimal on a donc fini
  66.         }
  67.         if(indice->suivant!=NULL){
  68.             indice=indice->suivant;
  69.         }
  70.     }
  71. }*/
  72. void enlever_animal(Animal **liste, Animal *animal) {
  73.         if (animal == NULL)
  74.                 return;
  75.         if (liste == NULL)
  76.                 return;
  77.   if(animal->precedent)
  78.     animal->precedent->suivant = animal->suivant;
  79.  
  80.   if (animal->suivant)
  81.     animal->suivant->precedent = animal->precedent;
  82.  
  83.  
  84.   if (*liste == animal)
  85.     *liste=animal->suivant;
  86.  
  87.   free(animal);
  88. }
  89.   /*if(animal->precedent != NULL){ // perte de memoire
  90.       animal->precedent->suivant = animal->suivant;
  91.   }else if (animal->suivant != NULL){
  92.       animal->suivant->precedent = animal->precedent;
  93.   }else if(animal->precedent == NULL){
  94.       animal->suivant->precedent = NULL;
  95.   }else if(animal->suivant == NULL){
  96.       animal->precedent->suivant = NULL;
  97.   }
  98.   free(animal->precedent);
  99.   free(animal->suivant);*/
  100. unsigned int compte_animal_rec(Animal *la) {
  101.     if(la)
  102.         return 1 + compte_animal_rec(la->suivant);
  103.     return 0;
  104. }
  105.  
  106. /*unsigned int compte_animal_it(Animal *la) {//erreur dans le comptage??
  107.     unsigned int cpt = 0;
  108.     while(la->suivant!=NULL){
  109.         cpt++;
  110.         la=la->suivant;
  111.     }
  112.     return cpt-1;
  113. }*/
  114. /*unsigned int compte_animal_it(Animal *la) {
  115.     unsigned int cpt = 0;
  116.     if(la == NULL){
  117.         return cpt;
  118.     }else if(la->suivant == NULL){
  119.         return cpt + 1;
  120.     }else{
  121.         while(la->suivant != NULL){
  122.             //printf("cpt = %u\n", cpt);
  123.             cpt++;
  124.             la = la->suivant;
  125.         }
  126.     return cpt;
  127.     }
  128. }*/
  129. unsigned int compte_animal_it(Animal *la) {
  130.   unsigned int compteur = 0 ;
  131.   while(la){
  132.     la=la->suivant;
  133.     compteur++;
  134.   }
  135.  
  136.   return compteur;
  137. }
  138.  
  139. void bouger_animaux(Animal *la) {
  140.     while(la){
  141.       if((float)rand()/((float)RAND_MAX)<p_ch_dir){
  142.         la->dir[0]=1 - (rand()%3);
  143.       }
  144.       else{
  145.         la->x=(la->x+la->dir[0]+SIZE_X)%SIZE_X;
  146.         }
  147.       if((float)rand()/(float)RAND_MAX<p_ch_dir){
  148.         la->dir[1]=1 - (rand()%3);
  149.       }
  150.       else{
  151.         la->y=(la->y+la->dir[1]+SIZE_Y)%SIZE_Y;
  152.       }
  153.       la=la->suivant;
  154.     }
  155. }
  156.  
  157. void reproduce(Animal **liste_animal) {
  158.     if(*liste_animal == NULL){
  159.         exit(EXIT_FAILURE);
  160.     }
  161.   Animal *sereproduit=(*liste_animal)->suivant;
  162.   while(sereproduit!=NULL){
  163.     if((float)rand()/(float)RAND_MAX<p_reproduce){
  164.         ajouter_animal(sereproduit->x,sereproduit->y,liste_animal);
  165.     }
  166.     sereproduit=sereproduit->suivant;
  167.   }
  168. }
  169. /*
  170. void rafraichir_proies(Animal **liste_proie) {
  171.   //ici cesty une copie donc faux
  172.   Animal *onterafraichit=*liste_proie;
  173.   while(onterafraichit->suivant!=NULL){
  174.     printf("o");
  175.     bouger_animaux(onterafraichit);
  176.     onterafraichit->energie+=-d_proie;
  177.     if(onterafraichit->energie<0){
  178.       enlever_animal(liste_proie,onterafraichit);
  179.     }
  180.     onterafraichit=onterafraichit->suivant;
  181.   }
  182.   reproduce(liste_proie);
  183.   return ;
  184. }*/
  185.  
  186. void rafraichir_proies(Animal **liste_proie) {
  187.     if((*liste_proie)->suivant){ // pourquoi si cette condition c'est bon, sinon on a un free qd mm? a explorer?
  188.         Animal *onterafraichit=(*liste_proie)->suivant;
  189.         bouger_animaux(onterafraichit);
  190.         while(onterafraichit){
  191.             //printf("o");
  192.             onterafraichit->energie+=-d_proie;
  193.             if(onterafraichit->energie<=0)
  194.                 enlever_animal(liste_proie,onterafraichit);
  195.             onterafraichit=onterafraichit->suivant;
  196.         }
  197.         reproduce(liste_proie);
  198.     }
  199.     else{
  200.         exit(EXIT_FAILURE);
  201.     }
  202. }
  203.  
  204.  
  205. Animal *animal_en_XY(Animal *l, int x, int y) {
  206.     while(l){
  207.         if(l->x==x && l->y==y){
  208.             return l;
  209.         }
  210.         l=l->suivant;
  211.     }
  212.   return NULL;
  213. }
  214.  
  215. void rafraichir_predateurs(Animal **liste_predateur, Animal **liste_proie) {
  216.     Animal *fresh=(*liste_predateur)->suivant,*adresse;
  217.     bouger_animaux(fresh);
  218.     while(fresh){
  219.         fresh->energie=fresh->energie - d_predateur;
  220.         if(fresh->energie<=0){
  221.             enlever_animal(liste_predateur, fresh);
  222.         }
  223.         adresse = animal_en_XY(*liste_proie,fresh->x, fresh->y);
  224.         if(adresse){
  225.             if(rand()/(float)RAND_MAX<p_manger){
  226.                 enlever_animal(liste_proie, adresse);
  227.             }
  228.         }
  229.         fresh = fresh->suivant;
  230.     }
  231.     reproduce(liste_predateur);
  232.  
  233. }
  234. /*
  235. void afficher_ecosys(Animal *liste_proie,Animal *liste_predateur) {
  236.     int i, j;
  237.     //Animal *proies=liste_proie->suivant,*predateurs=liste_predateur->suivant;
  238.     //int len = max(liste_proie, liste_predateur);
  239.     for(i = 0; i<SIZE_Y; i++){
  240.         for(j = 0; j<SIZE_X; j++){
  241.             if(animal_en_XY(liste_proie,i,j)){
  242.                 if(animal_en_XY(liste_predateur,i,j)){
  243.                     printf("@");
  244.                 }
  245.                 printf("*");
  246.             }
  247.             else if(animal_en_XY(liste_predateur,i,j))
  248.                 printf("O");
  249.             else
  250.                 printf(" ");
  251.         }
  252.         printf("\n");
  253.     }
  254.     // 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
  255.     // lidee serait plutot de parcourir a chaque fois les deux structures
  256. }*/
  257.  
  258. void afficher_ecosys(Animal *liste_proie,Animal *liste_predateur) {
  259.     int i,j;
  260.     liste_predateur=liste_predateur->suivant;
  261.     liste_proie=liste_proie->suivant;
  262.     char tab[SIZE_X][SIZE_Y];
  263.     for(i=0;i<SIZE_X;i++){
  264.         for(j=0;j<SIZE_Y;j++){
  265.             tab[i][j] = ' ';
  266.         }
  267.     }
  268.     while(liste_proie){
  269.         tab[liste_proie->x][liste_proie->y] = '*';
  270.         liste_proie = liste_proie->suivant;
  271.     }
  272.     while(liste_predateur){
  273.         if(tab[liste_predateur->x][liste_predateur->y]=='*'){
  274.             tab[liste_predateur->x][liste_predateur->y] = '@';
  275.         }else{
  276.             tab[liste_predateur->x][liste_predateur->y] = 'O';
  277.         }
  278.         liste_predateur=liste_predateur->suivant;
  279.     }
  280.     printf(" ____________________\n");
  281.     for(i=0;i<SIZE_X;i++){
  282.         printf("|");
  283.         for(j=0;j<SIZE_Y;j++){
  284.             printf("%c", tab[i][j]);
  285.         }
  286.         printf("|\n");
  287.     }
  288. }
  289.  
  290. void liberer_liste_animaux(Animal *liste) {
  291.     Animal *np = liste;
  292.     if (!liste) return;
  293.     //assert(!liste->precedent); /* debut de la liste */
  294.     do {
  295.         np = liste->suivant;
  296.         free(liste);
  297.         liste = np;
  298.     }while (liste);
  299. }
  300.  
  301. void clear_screen() {
  302.   printf("\x1b[2J\x1b[1;1H");  /* code ANSI X3.4 pour effacer l'ecran */
  303. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement