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;
}