diff --git a/travail_de_groupe/chef_oeuvre/chef_oeuvre.odt b/travail_de_groupe/chef_oeuvre/chef_oeuvre.odt index 77ef2ff06ae6d7eb9e0f79c95727dd094f699c95..be89ba4f6298e709c64f98ccc8d6db6f0d61adb1 100644 Binary files a/travail_de_groupe/chef_oeuvre/chef_oeuvre.odt and b/travail_de_groupe/chef_oeuvre/chef_oeuvre.odt differ diff --git a/travail_de_groupe/chef_oeuvre/markov.txt b/travail_de_groupe/chef_oeuvre/markov.txt index dd3380684e771c77605b4c1344704b94bb324981..c4cf89492020cbd533b14d1f8cc37d9b72969f25 100644 --- a/travail_de_groupe/chef_oeuvre/markov.txt +++ b/travail_de_groupe/chef_oeuvre/markov.txt @@ -1,4 +1,5 @@ -1 0 0 0 -0 1 0 0 -0 0 1 0 -0 0 0 1 \ No newline at end of file +1 0 0 0 0 +0 1 0 0 0 +0 0 1 0 0 +0 0 0 1 0 +0 0 0 0 1 \ No newline at end of file diff --git a/travail_de_groupe/chef_oeuvre/src/fire.c b/travail_de_groupe/chef_oeuvre/src/fire.c index b3d7e9797ac3f0418cdd5bb1a718b79b13df913b..9794417cd01364e2e3cf27352f725524c3fd27f3 100644 --- a/travail_de_groupe/chef_oeuvre/src/fire.c +++ b/travail_de_groupe/chef_oeuvre/src/fire.c @@ -74,11 +74,11 @@ booleen_t searchFire(listchainfire_t listFire, int x ,int y) while((listFire!=NULL)&&!(result)) { - if(((listFire->fire).x==x)&&((listFire->fire).y==y)) // si on trouve la semaine voulue + if(((listFire->fire).x==x)&&((listFire->fire).y==y)) { - result= true ;// on chercher si on trouve l'action ou non. + result= true ; } - listFire=listFire->next; // on passe au suivant. + listFire=listFire->next; } return result; } @@ -87,9 +87,9 @@ listchainfire_t deleteAheadFire(listchainfire_t listFire){ listchainfire_t listTemporary; - listTemporary = listFire; // recuperation de la semaine en tête de liste - listFire = listFire->next; // on avance la liste sur le maillon suivant - free(listTemporary); // on libere le maillon en tete + listTemporary = listFire; + listFire = listFire->next; + free(listTemporary); return listFire; } @@ -120,7 +120,7 @@ listchainfire_t offFire (listchainfire_t listFire, int x ,int y ){ return(listFire); } if(((listFire->fire).x==x)&&((listFire->fire).y==y)) { - (listFire->fire).state=0; // feu eteint + (listFire->fire).state=(listFire->fire).state-1; } else{ listFire->next=offFire(listFire->next,x,y); @@ -136,4 +136,58 @@ void travelFire(listchainfire_t listFire){ listTemporary=listTemporary->next; } //freeListFire(listTemporary); -} \ No newline at end of file +} + +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]*100; + pSparkle=(markov[state][SPARKLE]+markov[state][DEAD])*100; + + pMedium=(markov[state][SPARKLE]+markov[state][DEAD]+markov[state][MEDIUM])*100; + + pStrong=(markov[state][SPARKLE]+markov[state][DEAD]+ + markov[state][MEDIUM]+markov[state][STRONG])*100; + + + 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;} + + printf("%d %d\n", probability, state); + printf("%d %d %d %d\n", pDead, pSparkle, pMedium, pStrong); + + listTemporary=listTemporary->next; + } +} \ No newline at end of file diff --git a/travail_de_groupe/chef_oeuvre/src/fire.h b/travail_de_groupe/chef_oeuvre/src/fire.h index 600b839a375340df80a2d9eaed50df00fbf672ce..975fb32c8b02dcf758c617e56c8c41c763961fc3 100644 --- a/travail_de_groupe/chef_oeuvre/src/fire.h +++ b/travail_de_groupe/chef_oeuvre/src/fire.h @@ -6,13 +6,19 @@ #include <time.h> #include <stdio.h> -#define SIZEMARKOV 4 +#define SIZEMARKOV 5 +#define DEAD 0 +#define SPARKLE 1 +#define MEDIUM 2 +#define STRONG 3 +#define SPREAD 4 + typedef struct fire{ int x; int y; - int state; // { dead 0 ;sarkle 1 ; medium_fire 2 ; strong_fire 3} + int state; // { dead 0 ;sarkle 1 ; medium_fire 2 ; strong_fire 3; preading 4} }fire_t; @@ -39,5 +45,9 @@ listchainfire_t deleteFire (listchainfire_t, int ,int ); listchainfire_t freeListFire (listchainfire_t ); listchainfire_t offFire (listchainfire_t, int,int ); void travelFire(listchainfire_t listFire); +void readFapFromFile(char * filename); +void nextFire(listchainfire_t ); + + #endif \ No newline at end of file diff --git a/travail_de_groupe/chef_oeuvre/src/gest_event.c b/travail_de_groupe/chef_oeuvre/src/gest_event.c index 7ea08e5402d367b665fc24bd8125efb4c354196d..caad8317dca7bb341842856eba8c5e14dff9a70a 100644 --- a/travail_de_groupe/chef_oeuvre/src/gest_event.c +++ b/travail_de_groupe/chef_oeuvre/src/gest_event.c @@ -123,10 +123,14 @@ void manageGame(){ break; case SDL_MOUSEMOTION: - mousePosition.x = (event.motion.x - (screenDimension.w - (MAPSIZE * CELLSIZE)) / 2) / CELLSIZE; - mousePosition.y = (event.motion.y - 0) / CELLSIZE; + mousePosition.x = (event.motion.x - (screenDimension.w - (MAPSIZE * CELLSIZE)) / 2) / CELLSIZE; + mousePosition.y = (event.motion.y - 0) / CELLSIZE; continue; + case SDL_MOUSEBUTTONDOWN: + pourWater(mousePosition.x, mousePosition.y); + break; + default: continue; } diff --git a/travail_de_groupe/chef_oeuvre/src/main.c b/travail_de_groupe/chef_oeuvre/src/main.c index b6868c9fa9b7b35e119c484f7e75d7fbe5a582fb..2ce91a51061e2f16521276e0e43cc90a0bfd3a93 100644 --- a/travail_de_groupe/chef_oeuvre/src/main.c +++ b/travail_de_groupe/chef_oeuvre/src/main.c @@ -8,7 +8,11 @@ int main(){ running = 1; gameState = MENU; readMapFromFile("map.txt"); + readFapFromFile("markov.txt"); fireList = startFire(fireList,10,MAPSIZE); travelFire(fireList); + nextFire(fireList); + nextFire(fireList); + nextFire(fireList); mainLoop(); } \ No newline at end of file diff --git a/travail_de_groupe/chef_oeuvre/src/player.c b/travail_de_groupe/chef_oeuvre/src/player.c index 09106266f5eab936922d592ba96df555976809bd..cc5135b7b723da9287fb87cca4890714b0933639 100644 --- a/travail_de_groupe/chef_oeuvre/src/player.c +++ b/travail_de_groupe/chef_oeuvre/src/player.c @@ -4,11 +4,12 @@ player_t player; void initPlayer(){ - player.x = 18*32; - player.y = 0; + player.x = (MAPSIZE/2)*CELLSIZE; + player.y = (MAPSIZE/2)*CELLSIZE; player.w = CELLSIZE*0.8; player.h = CELLSIZE*0.8; - player.waterLevel = 0; + player.waterMax = 3; + player.currentWater = player.waterMax; player.speed = 1; player.isMoving = 0; } @@ -134,5 +135,15 @@ int selectStateHover(){ } +void pourWater(int x, int y){ + int onFire = searchFire(fireList, x, y); + if(player.currentWater>0){ + //downgrade the cliqued fire + if(onFire == 1 && selectStateHover() == 1){ + fireList = deleteFire (fireList, x, y); + } + player.currentWater = player.currentWater - 1; + } +} diff --git a/travail_de_groupe/chef_oeuvre/src/player.h b/travail_de_groupe/chef_oeuvre/src/player.h index 8dda417ec6b48cac57240a0dc79a26c8748e4575..a8bcffb7d67bb15d6dfa6feaa4b19ef23b0a90f1 100644 --- a/travail_de_groupe/chef_oeuvre/src/player.h +++ b/travail_de_groupe/chef_oeuvre/src/player.h @@ -14,7 +14,8 @@ typedef struct player{ int y; int w; int h; - int waterLevel; + int currentWater; + int waterMax; int speed; int isMoving; } player_t; @@ -24,5 +25,6 @@ extern player_t player; void initPlayer(); void manageMovement(); int selectStateHover(); +void pourWater(int, int); #endif \ No newline at end of file diff --git a/travail_de_groupe/chef_oeuvre/src/render.c b/travail_de_groupe/chef_oeuvre/src/render.c index 21152dc313053303890a8ac1a1006711708dc857..87092b058f1263dc0fbdb6361561e91f16cd86ad 100644 --- a/travail_de_groupe/chef_oeuvre/src/render.c +++ b/travail_de_groupe/chef_oeuvre/src/render.c @@ -167,8 +167,8 @@ void drawFire(){ srcRect.x = srcRect.w * (SDL_GetTicks()/200 % 8); srcRect.y= 0; while (cour != NULL){ - rect.h = CELLSIZE; - rect.w = CELLSIZE; + rect.h = CELLSIZE * (cour->fire).state; + rect.w = CELLSIZE * (cour->fire).state; rect.x = (cour->fire).x * CELLSIZE + (screenDimension.w - (MAPSIZE * CELLSIZE)) / 2; rect.y = (cour->fire).y * CELLSIZE; SDL_RenderCopy(renderer, fireTexture, &srcRect, &rect); @@ -179,12 +179,12 @@ void drawFire(){ void drawPlayerWaterLevel(){ int borderWidth = (screenDimension.w - (MAPSIZE * CELLSIZE)) / 2; SDL_Rect rect; - rect.h = borderWidth/4; - rect.w = borderWidth/4; - int count = player.waterLevel; - for (int i=0; i<3; i++){ + rect.h = borderWidth/player.waterMax; + rect.w = borderWidth/player.waterMax; + int count = player.currentWater; + for (int i=0; i<player.waterMax; i++){ rect.x = (i*rect.h); - rect.y = screenDimension.h/4; + rect.y = screenDimension.h/3; if (count){ count--; SDL_RenderCopy(renderer, filledBucketTexture, NULL, &rect); @@ -201,6 +201,7 @@ void drawGame(){ drawMap(); drawPlayer(); drawFire(); + drawPlayerWaterLevel(); SDL_RenderPresent(renderer); }