Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <time.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include "ecosys.h"
- /* Pour utiliser la correction automatique:
- cavecorrector 6-7 repertoire
- */
- Animal *creer_animal(int x, int y, float energie) {
- //srand(time(NULL));
- Animal *animal = (Animal*)malloc(sizeof(Animal));
- if(animal == NULL) return NULL;
- animal->x = x;
- animal->y = y;
- animal->dir[0] = 1 - (rand()%3);
- animal->dir[1] = 1 - (rand()%3);
- animal->energie = energie;
- animal->precedent=NULL;
- animal->suivant=NULL;
- return animal;
- }
- Animal *ajouter_en_tete_animal(Animal *liste, Animal *animal) {
- animal->precedent = liste;
- animal->suivant =(liste->suivant==NULL)?NULL:liste->suivant;
- liste->suivant=animal;
- //liste->precedent = animal;
- return liste;
- }
- void ajouter_animal(int x, int y, Animal **liste_animal) {
- if( x<0 || y<0 || x>= SIZE_X || y>= SIZE_Y){
- printf("Erreur de coordonnées.\n");
- exit(1);
- }else{
- ajouter_en_tete_animal(*liste_animal,creer_animal(x,y,energie));
- }
- }
- int compare_animal(Animal *a, Animal *b){
- 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)
- return 1;
- return 0;
- }
- void enlever_animal(Animal **liste, Animal *animal) {
- Animal *indice=(*liste)->suivant;
- while(indice!=NULL){
- if(compare_animal(indice,animal)){
- if(indice->suivant!=NULL){
- indice->precedent->suivant=indice->suivant;
- if(indice->precedent!=NULL)
- indice->suivant->precedent=indice->precedent;
- }
- if(indice!=NULL)
- free(indice);
- return; // on a trouve lanimal on a donc fini
- }
- if(indice->suivant!=NULL){
- indice=indice->suivant;
- }
- }
- }
- /*if(animal->precedent != NULL){ // perte de memoire
- animal->precedent->suivant = animal->suivant;
- }else if (animal->suivant != NULL){
- animal->suivant->precedent = animal->precedent;
- }else if(animal->precedent == NULL){
- animal->suivant->precedent = NULL;
- }else if(animal->suivant == NULL){
- animal->precedent->suivant = NULL;
- }
- free(animal->precedent);
- free(animal->suivant);*/
- unsigned int compte_animal_rec(Animal *la) {
- if(la->suivant == NULL){
- return 0;
- }else{
- return 1+compte_animal_rec(la->suivant);
- }
- return 0;
- }
- unsigned int compte_animal_it(Animal *la) {//erreur dans le comptage??
- unsigned int cpt = 0;
- while(la->suivant!=NULL){
- cpt++;
- la=la->suivant;
- }
- return cpt-1;
- }
- void bouger_animaux(Animal *la) {
- if((float)rand()/((float)RAND_MAX)<p_ch_dir){
- la->dir[0]=1 - (rand()%3);
- }
- else{
- la->x=(la->x+la->dir[0]+SIZE_X)%SIZE_X;
- }
- if((float)rand()/(float)RAND_MAX<p_ch_dir){
- la->dir[1]=1 - (rand()%3);
- }
- else{
- la->y=(la->y+la->dir[1]+SIZE_Y)%SIZE_Y;
- }
- }
- void reproduce(Animal **liste_animal) {
- Animal *sereproduit=(*liste_animal)->suivant;
- while(sereproduit!=NULL){
- if((float)rand()/(float)RAND_MAX<p_reproduce){
- ajouter_animal(sereproduit->x,sereproduit->y,liste_animal);
- }
- sereproduit=sereproduit->suivant;
- }
- }
- /*
- void rafraichir_proies(Animal **liste_proie) {
- //ici cesty une copie donc faux
- Animal *onterafraichit=*liste_proie;
- while(onterafraichit->suivant!=NULL){
- printf("o");
- bouger_animaux(onterafraichit);
- onterafraichit->energie+=-d_proie;
- if(onterafraichit->energie<0){
- enlever_animal(liste_proie,onterafraichit);
- }
- onterafraichit=onterafraichit->suivant;
- }
- reproduce(liste_proie);
- return ;
- }*/
- void rafraichir_proies(Animal **liste_proie) {
- if(compte_animal_it(*liste_proie)>1){ // pourquoi si cette condition c'est bon, sinon on a un free qd mm? a explorer?
- Animal *onterafraichit=(*liste_proie)->suivant;
- while(onterafraichit!=NULL){
- //printf("o");
- bouger_animaux(onterafraichit);
- onterafraichit->energie+=-d_proie;
- if(onterafraichit->energie<=0)
- enlever_animal(liste_proie,onterafraichit);
- if(onterafraichit->suivant==NULL || onterafraichit==NULL)
- break;
- onterafraichit=onterafraichit->suivant;
- }
- }
- reproduce(liste_proie);// qui fait bug;
- }
- Animal *animal_en_XY(Animal *l, int x, int y) {
- /* a completer */
- return NULL;
- }
- void rafraichir_predateurs(Animal **liste_predateur, Animal **liste_proie) {
- /* a completer */
- }
- int trouve_animal(Animal *liste,int x, int y){
- Animal *ontecherche=liste;
- while(ontecherche->suivant != NULL){
- ontecherche=ontecherche->suivant;
- if(ontecherche->x==x && ontecherche->y==y){
- return 1;
- }
- }
- return 0;
- }
- void afficher_ecosys(Animal *liste_proie,Animal *liste_predateur) {
- int i, j;
- //Animal *proies=liste_proie->suivant,*predateurs=liste_predateur->suivant;
- //int len = max(liste_proie, liste_predateur);
- for(i = 0; i<SIZE_Y; i++){
- for(j = 0; j<SIZE_X; j++){
- if(trouve_animal(liste_proie,i,j)){
- if(trouve_animal(liste_predateur,i,j)){
- printf("@");
- }
- printf("*");
- }
- else if(trouve_animal(liste_predateur,i,j))
- printf("O");
- else
- printf(" ");
- }
- printf("\n");
- }
- // 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
- // lidee serait plutot de parcourir a chaque fois les deux structures
- }
- void liberer_liste_animaux(Animal *liste) {
- Animal *np = liste;
- if (!liste) return;
- //assert(!liste->precedent); /* debut de la liste */
- do {
- np = liste->suivant;
- free(liste);
- liste = np;
- }while (liste);
- }
- void clear_screen() {
- printf("\x1b[2J\x1b[1;1H"); /* code ANSI X3.4 pour effacer l'ecran */
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement