Skip to content
Snippets Groups Projects
fire.c 5.99 KiB
#include "fire.h"
#include "map.h"

listchainfire_t fireList;
int markov[SIZEMARKOV][SIZEMARKOV];

listchainfire_t initFire (void)
{
    return NULL;
}


booleen_t emptyListFire(listchainfire_t listFire)
{
    booleen_t result = false;

    if (listFire==NULL)
    {
        result=true;
    }
    return (result);
}

listchainfire_t insertAheadFire(fire_t fire,listchainfire_t listFire)
{
    chainfire_t *m;
    m=(chainfire_t*)malloc(sizeof(chainfire_t));
            
    if (m==NULL)
    {
        printf("problème d'allocation \n");
        exit(1);
    }
    if ((!searchFire(listFire,fire.x,fire.y))&&(map[fire.x][fire.y]!=2)){
            m->fire=fire;
            m->next= listFire;
            listFire=m;
    }
    return listFire;

}

listchainfire_t startFire(listchainfire_t listFire,int numberFire, int mapSize){

    int i; 
    int xFire=0;
    int yFire=0;
    srand(time(NULL));

    fire_t fire;

    if (emptyListFire(listFire)){
        for (i=0;i<numberFire;i++){
            
            xFire= rand()%mapSize;

            yFire= rand()%mapSize;
            fire.x= xFire;
            fire.y= yFire; 
            fire.state=1;

            listFire=insertAheadFire(fire, listFire); 
            
        }
    }
    return (listFire);
}


booleen_t searchFire(listchainfire_t listFire, int x ,int y)
{
    booleen_t       result = false;

    while((listFire!=NULL)&&!(result))
    {  
        if(((listFire->fire).x==x)&&((listFire->fire).y==y)) 
        {
            result= true ;
        }
        listFire=listFire->next; 
    }
    return result;
}

listchainfire_t deleteAheadFire(listchainfire_t listFire){

    listchainfire_t listTemporary; 
    
    listTemporary = listFire; 
    listFire = listFire->next; 
    free(listTemporary); 
    return listFire;
}

listchainfire_t deleteFire (listchainfire_t listFire, int x ,int y ){

    if (emptyListFire(listFire)){
        return(listFire);
    }
    if(((listFire->fire).x==x)&&((listFire->fire).y==y)) {
        listFire= deleteAheadFire( listFire);
    }
    else{
        listFire->next=deleteFire(listFire->next,x,y);
    }
    return listFire; 
}

listchainfire_t freeListFire (listchainfire_t listFire){
    while (emptyListFire(listFire)){
        listFire=deleteAheadFire(listFire);
    }
    return listFire;
}

listchainfire_t offFire (listchainfire_t listFire, int x ,int y ){

    if (emptyListFire(listFire)){
        return(listFire);
    }
    if(((listFire->fire).x==x)&&((listFire->fire).y==y)) {
        (listFire->fire).state=(listFire->fire).state-1;
    }
    else{
        listFire->next=offFire(listFire->next,x,y);
    }
    return listFire; 
}

void travelFire(listchainfire_t listFire){
    listchainfire_t listTemporary=listFire;

    while(listTemporary!=NULL){
        //printf("x:%d,y:%d\n",(listTemporary->fire).x,(listTemporary->fire).y);
        listTemporary=listTemporary->next;
    }
}

void readFapFromFile(char * filename){
    FILE * fp;
    int i, j;
    fp = fopen(filename, "r");
    if(fp == NULL){
        printf("Error opening file\n");
        exit(1);
    }
    for(i = 0; i < SIZEMARKOV; i++){
        for(j = 0; j < SIZEMARKOV; j++){
            fscanf(fp, "%d", &markov[i][j]);
        }
    }
    fclose(fp);
}

void nextFire(listchainfire_t listFire){
    int probability; 
    int state;
    int pDead;
    int pSparkle;
    int pMedium;
    int pStrong;
    listchainfire_t listTemporary; 

    listTemporary= listFire;
    srand(time(NULL));

    while (!emptyListFire(listTemporary)){
        state=(listTemporary->fire).state;
        probability= rand()%101;

        pDead=markov[state][DEAD];
        pSparkle=(markov[state][SPARKLE]+markov[state][DEAD]);

        pMedium=(markov[state][SPARKLE]+markov[state][DEAD]+markov[state][MEDIUM]);

        pStrong=(markov[state][SPARKLE]+markov[state][DEAD]+
                    markov[state][MEDIUM]+markov[state][STRONG]);


        if ((0<=probability)&&(probability<pDead)){(listTemporary->fire).state=DEAD;}
        else if ((pDead<=probability)&&(probability<pSparkle)){(listTemporary->fire).state=SPARKLE;}
        else if ((pSparkle<=probability)&&(probability<pMedium)){(listTemporary->fire).state=MEDIUM;}
        else if ((pMedium<=probability)&&(probability<pStrong)){(listTemporary->fire).state=STRONG;}
        else {(listTemporary->fire).state=SPREAD;}

        listTemporary=listTemporary->next;   
    }
} 

listchainfire_t probabilitySpreadFire( listchainfire_t listFire, listchainfire_t listTemporary){
    int probability;
    fire_t fire; 
 
    probability= rand()%4;

    if((probability==0)&&((listTemporary->fire).x+1<MAPSIZE)){fire.state=1;
        fire.x=(listTemporary->fire).x+1;
        fire.y=(listTemporary->fire).y;
        listFire=insertAheadFire(fire,listFire);
        }
    if ((probability==1)&&((listTemporary->fire).y+1<MAPSIZE)){fire.state=1;
        fire.x=(listTemporary->fire).x;
        fire.y=(listTemporary->fire).y+1;
        listFire=insertAheadFire(fire,listFire);
        }
    if ((probability==2)&&((listTemporary->fire).y-1>=0)){fire.state=1;
        fire.x=(listTemporary->fire).x;
        fire.y=(listTemporary->fire).y-1;
        listFire=insertAheadFire(fire,listFire);
        }
    if ((probability==3)&&((listTemporary->fire).x-1>=0)){fire.state=1;
        fire.x=(listTemporary->fire).x-1;
        fire.y=(listTemporary->fire).y;
        listFire=insertAheadFire(fire,listFire);
        }
    return listFire;
}

listchainfire_t spreadFire (listchainfire_t listFire){
    listchainfire_t listTemporary=fireList;
    srand(time(NULL));
    while (!emptyListFire(listTemporary)){
        if ((listTemporary->fire).state==4){
            
            listFire=probabilitySpreadFire(listFire, listTemporary); 
        }
        listTemporary=listTemporary->next; 
    }
    return listFire;
}

booleen_t winGame(listchainfire_t listFire){
    booleen_t win = true;
    listchainfire_t listTemporary= listFire; 
    
    while (!emptyListFire( listTemporary)){
        if ((listTemporary->fire).state!=0){
            win= false;
            break;
        }
    }
    return win;
}