From b3a0b6619e612da514886af312b733d69dac142d Mon Sep 17 00:00:00 2001 From: JackCarterSmith Date: Thu, 21 Jun 2018 16:00:37 +0200 Subject: [PATCH] Added tiles and sprites, creating arenaGUI --- IAEngine.c | 198 ++++----- IAEngine.h | 28 +- arenaEngine.c | 317 ++++++------- arenaEngine.h | 95 ++-- arenaGUI.c | 26 +- arenaGUI.h | 15 +- data/icon_ia.png | Bin 0 -> 1100 bytes data/sprite_ia_1.png | Bin 0 -> 3252 bytes data/sprite_player_1.png | Bin 0 -> 3260 bytes data/tile_gold.png | Bin 0 -> 3192 bytes data/tile_grass.png | Bin 0 -> 3088 bytes data/tile_rock.png | Bin 0 -> 3001 bytes data/tile_tree.png | Bin 0 -> 3090 bytes data/tile_water.png | Bin 0 -> 2943 bytes fileHandler.c | 30 +- fileHandler.h | 12 +- logHelper.c | 152 +++---- logHelper.h | 22 +- main.c | 136 +++--- main.h | 14 + menuGUI.c | 38 +- menuGUI.h | 12 +- playerInterface.c | 936 +++++++++++++++++++-------------------- playerInterface.h | 98 ++-- 24 files changed, 1101 insertions(+), 1028 deletions(-) create mode 100644 data/icon_ia.png create mode 100644 data/sprite_ia_1.png create mode 100644 data/sprite_player_1.png create mode 100644 data/tile_gold.png create mode 100644 data/tile_grass.png create mode 100644 data/tile_rock.png create mode 100644 data/tile_tree.png create mode 100644 data/tile_water.png create mode 100644 main.h diff --git a/IAEngine.c b/IAEngine.c index 4be2cea..45e9772 100644 --- a/IAEngine.c +++ b/IAEngine.c @@ -1,99 +1,99 @@ -/* - * IAEngine.c - * - * Created on: 17 juin 2018 - * Author: isen - * - * Fonction qui va définir le comportement joueur(s) "ordinateur" - */ - -#include "playerInterface.h" -#include "SDL2/SDL.h" -#include -#include -#include - - - -int IAEngine(PLAYER * player1, PLAYER * player2) -{ - char Race[20]; - - //Player 1 est le joueur, player 2 le bot - if((player1 != NULL) & (player2 !=NULL)) - { - //On récupère les positions des 2 joueurs . L'IA sait où est le joueur - int Player1PositionX = player1->PositionX; - int Player1PositionY = player1->PositionY; - - int Player2PositionX = player2->PositionX; - int Player2PositionY = player2->PositionY; - int action; - - action = FindShortestPath(Player1PositionX,Player1PositionY,Player2PositionX,Player2PositionY); - - printf("Tour de l'IA\n"); - if(action == 5) - { - AttackPlayer(player1,player2); - } - else if ((action >= 1) && (action <= 4)) - { - ActionPlayer(player2,action); - } - } - return 0; -} - -int FindShortestPath(int Player1PositionX, int Player1PositionY, int Player2PositionX, int Player2PositionY) -{ - int differenceX = abs(Player1PositionX - Player2PositionX); - int differenceY = abs(Player1PositionY - Player2PositionY); - - int action; - - - //Revoir cette partie il faut que les 2 joueurs soit sur la même ligne ou colone avec une différence de ligne ou colonne de 1 - if((abs(Player1PositionX - (Player2PositionX - 1)) == 1) || - (abs(Player1PositionX - (Player2PositionX + 1)) == 1) || - (abs(Player1PositionX - (Player2PositionY - 1)) == 1) || - (abs(Player1PositionX - (Player2PositionY + 1)) == 1)) - { - printf("Les 2 joueur sont à coté\n"); - printf("Le joueur 2 va combattre\n"); - action = 5; - } - - if(differenceX > abs(Player1PositionX - (Player2PositionX - 1))) - { - printf("Chemin plus court sur X\n"); - printf("Le joueur 2 va vers la gauche\n"); - action = 4; - } - else if(differenceX > abs(Player1PositionX - (Player2PositionX + 1))) - { - printf("Chemin plus court sur X\n"); - printf("Le joueur 2 va vers la droite\n"); - action = 2; - } - else if(differenceY > abs(Player1PositionY - (Player2PositionY + 1))) - { - printf("Chemin plus court sur Y\n"); - printf("Le joueur 2 va vers le bas\n"); - action = 3; - } - else if(differenceY > abs(Player1PositionY - (Player2PositionY - 1))) - { - printf("Chemin plus court sur Y\n"); - printf("Le joueur 2 va vers le haut\n"); - action = 1; - } - else - { - printf("Chemin plus long\n"); - action = 0; - } - return action; - -} - +/* + * IAEngine.c + * + * Created on: 17 juin 2018 + * Author: isen + * + * Fonction qui va définir le comportement joueur(s) "ordinateur" + */ + +#include "playerInterface.h" +#include "SDL2/SDL.h" +#include +#include +#include + + + +int IAEngine(PLAYER * player1, PLAYER * player2) +{ + char Race[20]; + + //Player 1 est le joueur, player 2 le bot + if((player1 != NULL) & (player2 !=NULL)) + { + //On récupère les positions des 2 joueurs . L'IA sait où est le joueur + int Player1PositionX = player1->PositionX; + int Player1PositionY = player1->PositionY; + + int Player2PositionX = player2->PositionX; + int Player2PositionY = player2->PositionY; + int action; + + action = FindShortestPath(Player1PositionX,Player1PositionY,Player2PositionX,Player2PositionY); + + printf("Tour de l'IA\n"); + if(action == 5) + { + AttackPlayer(player1,player2); + } + else if ((action >= 1) && (action <= 4)) + { + ActionPlayer(player2,action); + } + } + return 0; +} + +int FindShortestPath(int Player1PositionX, int Player1PositionY, int Player2PositionX, int Player2PositionY) +{ + int differenceX = abs(Player1PositionX - Player2PositionX); + int differenceY = abs(Player1PositionY - Player2PositionY); + + int action; + + + //Revoir cette partie il faut que les 2 joueurs soit sur la même ligne ou colone avec une différence de ligne ou colonne de 1 + if((abs(Player1PositionX - (Player2PositionX - 1)) == 1) || + (abs(Player1PositionX - (Player2PositionX + 1)) == 1) || + (abs(Player1PositionX - (Player2PositionY - 1)) == 1) || + (abs(Player1PositionX - (Player2PositionY + 1)) == 1)) + { + printf("Les 2 joueur sont à coté\n"); + printf("Le joueur 2 va combattre\n"); + action = 5; + } + + if(differenceX > abs(Player1PositionX - (Player2PositionX - 1))) + { + printf("Chemin plus court sur X\n"); + printf("Le joueur 2 va vers la gauche\n"); + action = 4; + } + else if(differenceX > abs(Player1PositionX - (Player2PositionX + 1))) + { + printf("Chemin plus court sur X\n"); + printf("Le joueur 2 va vers la droite\n"); + action = 2; + } + else if(differenceY > abs(Player1PositionY - (Player2PositionY + 1))) + { + printf("Chemin plus court sur Y\n"); + printf("Le joueur 2 va vers le bas\n"); + action = 3; + } + else if(differenceY > abs(Player1PositionY - (Player2PositionY - 1))) + { + printf("Chemin plus court sur Y\n"); + printf("Le joueur 2 va vers le haut\n"); + action = 1; + } + else + { + printf("Chemin plus long\n"); + action = 0; + } + return action; + +} + diff --git a/IAEngine.h b/IAEngine.h index 67ec141..f8ba607 100644 --- a/IAEngine.h +++ b/IAEngine.h @@ -1,14 +1,14 @@ -/* - * IAEngine.h - * - * Created on: 17 juin 2018 - * Author: isen - */ - -#ifndef IAENGINE_H_ -#define IAENGINE_H_ - -int FindShortestPath(int Player1PositionX, int Player1PositionY, int Player2PositionX, int Player2PositionY); -int IAEngine(PLAYER * player1, PLAYER * player2); - -#endif /* IAENGINE_H_ */ +/* + * IAEngine.h + * + * Created on: 17 juin 2018 + * Author: isen + */ + +#ifndef IAENGINE_H_ +#define IAENGINE_H_ + +int FindShortestPath(int Player1PositionX, int Player1PositionY, int Player2PositionX, int Player2PositionY); +int IAEngine(PLAYER * player1, PLAYER * player2); + +#endif /* IAENGINE_H_ */ diff --git a/arenaEngine.c b/arenaEngine.c index 04163af..756ed83 100644 --- a/arenaEngine.c +++ b/arenaEngine.c @@ -1,150 +1,167 @@ -#include "arenaEngine.h" -#include -#include -#include "fileHandler.h" -#include "logHelper.h" - - -/* - * Arena generate functions - */ -ARENA_H_TILE* createHTile(ARENA_H_TILE* prevHTile) { - ARENA_H_TILE* tile_h = NULL; - - if (prevHTile == NULL) { - tile_h = calloc(1,sizeof(ARENA_H_TILE)); //Using calloc because of resetting all memory allocated to 0 - tile_h->type_id = 0; - tile_h->playerOnTile = NULL; - tile_h->nextRow = NULL; - tile_h->nextColumn = NULL; - } else if (prevHTile != NULL) { - tile_h = calloc(1,sizeof(ARENA_H_TILE)); - prevHTile->nextRow = tile_h; - tile_h->type_id = 0; - tile_h->playerOnTile = NULL; - tile_h->nextRow = NULL; - tile_h->nextColumn = NULL; - } - - return tile_h; -} - -ARENA_W_TILE* createWTile(ARENA_H_TILE* prevHTile, ARENA_W_TILE* prevWTile) { - ARENA_W_TILE* tile_w = NULL; - - if (prevHTile != NULL && prevWTile == NULL) { - tile_w = calloc(1,sizeof(ARENA_W_TILE)); - prevHTile->nextColumn = tile_w; - tile_w->type_id = 0; - tile_w->playerOnTile = NULL; - tile_w->nextColumn = NULL; - - return tile_w; - } else if (prevHTile == NULL && prevWTile != NULL) { - tile_w = calloc(1,sizeof(ARENA_W_TILE)); - prevWTile->nextColumn = tile_w; - tile_w->type_id = 0; - tile_w->playerOnTile = NULL; - tile_w->nextColumn = NULL; - } - - return NULL; -} - -ARENA_H_TILE* genNewArena(int size_h, int size_w) { - ARENA_H_TILE* arenaOrigin = NULL; - ARENA_H_TILE* TmpCursor_h = NULL; - ARENA_W_TILE* TmpCursor_w = NULL; - int i,j; - - for(i=0;inextColumn; - } - } - - return arenaOrigin; -} - - - -/* - * Arena delete functions - */ -void deleteWTile(ARENA_W_TILE* WTile) { - if (WTile->nextColumn != NULL) { - deleteWTile(WTile->nextColumn); - } - - free(WTile); -} - -void deleteHTile(ARENA_H_TILE* HTile) { - if (HTile->nextRow != NULL) { - deleteHTile(HTile->nextRow); - } - - deleteWTile(HTile->nextColumn); - free(HTile); -} - -void deleteArena(ARENA_H_TILE* arena) { - deleteHTile(arena); -} - - - -/* - * Arena status functions - */ -int getTileTypeID(ARENA_H_TILE* arena, int coord_x, int coord_y) { - int type_id = -1; - int i; - - if (coord_y == 0) { - ARENA_H_TILE* tile_h = NULL; - - tile_h = arena; - if (coord_x != 0) { - for (i=0;inextRow; - } - } - - type_id = tile_h->type_id; - } else { - ARENA_W_TILE* tile_w = NULL; - ARENA_H_TILE* tile_h = NULL; - - tile_h = arena; - if (coord_x != 0) { - for (i=0;inextRow; - } - } - - tile_w = tile_h->nextColumn; - if (coord_y != 0) { - for (i=0;inextColumn; - } - } - - type_id = tile_w->type_id; - } - - return type_id; -} +#include +#include +#include "fileHandler.h" +#include "logHelper.h" +#include "main.h" +#include "arenaEngine.h" + + +/* + * Arena generate functions + */ +TILE* createTileList(void) { + TILE* origin = NULL; + + return origin; +} + +ARENA_H_TILE* createHTile(ARENA_H_TILE* prevHTile) { + ARENA_H_TILE* tile_h = NULL; + + if (prevHTile == NULL) { + tile_h = calloc(1,sizeof(ARENA_H_TILE)); //Using calloc because of resetting all memory allocated to 0 + tile_h->type_id = 0; + //tile_h->playerOnTile = NULL; + tile_h->nextRow = NULL; + tile_h->nextColumn = NULL; + } else if (prevHTile != NULL) { + tile_h = calloc(1,sizeof(ARENA_H_TILE)); + prevHTile->nextRow = tile_h; + tile_h->type_id = 0; + //tile_h->playerOnTile = NULL; + tile_h->nextRow = NULL; + tile_h->nextColumn = NULL; + } + + return tile_h; +} + +ARENA_W_TILE* createWTile(ARENA_H_TILE* prevHTile, ARENA_W_TILE* prevWTile) { + ARENA_W_TILE* tile_w = NULL; + + if (prevHTile != NULL && prevWTile == NULL) { + tile_w = calloc(1,sizeof(ARENA_W_TILE)); + prevHTile->nextColumn = tile_w; + tile_w->type_id = 0; + //tile_w->playerOnTile = NULL; + tile_w->nextColumn = NULL; + + return tile_w; + } else if (prevHTile == NULL && prevWTile != NULL) { + tile_w = calloc(1,sizeof(ARENA_W_TILE)); + prevWTile->nextColumn = tile_w; + tile_w->type_id = 0; + //tile_w->playerOnTile = NULL; + tile_w->nextColumn = NULL; + } + + return NULL; +} + +ARENA_H_TILE* genNewArena(int size_h, int size_w) { + ARENA_H_TILE* arenaOrigin = NULL; + ARENA_H_TILE* TmpCursor_h = NULL; + ARENA_W_TILE* TmpCursor_w = NULL; + int i,j; + + for(i=0;inextColumn; + } + } + + return arenaOrigin; +} + + + +/* + * Arena delete functions + */ +void deleteWTile(ARENA_W_TILE* WTile) { + if (WTile->nextColumn != NULL) { + deleteWTile(WTile->nextColumn); + } + + free(WTile); +} + +void deleteHTile(ARENA_H_TILE* HTile) { + if (HTile->nextRow != NULL) { + deleteHTile(HTile->nextRow); + } + + deleteWTile(HTile->nextColumn); + free(HTile); +} + +void deleteArena(ARENA_H_TILE* arena) { + deleteHTile(arena); +} + + + +/* + * Arena status functions + */ +int getTileTypeID(ARENA_H_TILE* arena, int coord_x, int coord_y) { + int type_id = -1; + int i; + + if (coord_x > A_WIDTH || coord_y > A_HEIGHT) return -1; + + if (coord_y == 0) { + ARENA_H_TILE* tile_h = NULL; + + tile_h = arena; + if (coord_x != 0) { + for (i=0;inextRow; + } + } + + type_id = tile_h->type_id; + } else { + ARENA_W_TILE* tile_w = NULL; + ARENA_H_TILE* tile_h = NULL; + + tile_h = arena; + if (coord_x != 0) { + for (i=0;inextRow; + } + } + + tile_w = tile_h->nextColumn; + if (coord_y != 0) { + for (i=0;inextColumn; + } + } + + type_id = tile_w->type_id; + } + + return type_id; +} + +int isPlayerAdjacent(PLAYER* p1, PLAYER* p2) { + int adjPlayer = -1; + + if ((p1->PositionX-1 || p1->PositionX+1) == p2->PositionX && (p1->PositionY-1 || p1->PositionY+1) == p2->PositionY) adjPlayer = 1; + + return adjPlayer; +} diff --git a/arenaEngine.h b/arenaEngine.h index 972bcaf..aa569af 100644 --- a/arenaEngine.h +++ b/arenaEngine.h @@ -1,46 +1,49 @@ -#include "playerInterface.h" - -#ifndef ARENAENGINE_H_ -#define ARENAENGINE_H_ - - - -/* -typedef struct items{ - int type_id; - //texture? - int isFlat; - int minedId; - struct items *nextItem; -}ITEMS; -*/ - -typedef struct tileType{ - int type_id; - //texture? - int isGround; - int canBeMined; -}TILE; - -typedef struct arena_h_tile{ //Rows chained list - int type_id; - PLAYER* playerOnTile; - struct arena_h_tile *nextRow; - struct arena_w_tile *nextColumn; -}ARENA_H_TILE; - -typedef struct arena_w_tile{ //Columns chained list - int type_id; - PLAYER* playerOnTile; - struct arena_w_tile *nextColumn; -}ARENA_W_TILE; - - -//Generation functions -ARENA_H_TILE* genNewArena(int size_h, int size_w); -void deleteArena(ARENA_H_TILE* arena); - -//Status functions -int getTileTypeID(ARENA_H_TILE* arena, int coord_x, int coord_y); - -#endif +#include "playerInterface.h" +#include + +#ifndef ARENAENGINE_H_ +#define ARENAENGINE_H_ + + + +/* +typedef struct items{ + int type_id; + //texture? + int isFlat; + int minedId; + struct items *nextItem; +}ITEMS; +*/ + +typedef struct tileType{ + int type_id; + SDL_Surface texture; + int isGround; + int canBeMined; + struct tileType *nextTile; +}TILE; + +typedef struct arena_h_tile{ //Rows chained list + int type_id; + //PLAYER* playerOnTile; + struct arena_h_tile *nextRow; + struct arena_w_tile *nextColumn; +}ARENA_H_TILE; + +typedef struct arena_w_tile{ //Columns chained list + int type_id; + //PLAYER* playerOnTile; + struct arena_w_tile *nextColumn; +}ARENA_W_TILE; + + +//Generation functions +TILE* createTileList(void); +ARENA_H_TILE* genNewArena(int size_h, int size_w); +void deleteArena(ARENA_H_TILE* arena); + +//Status functions +int getTileTypeID(ARENA_H_TILE* arena, int coord_x, int coord_y); + +#endif diff --git a/arenaGUI.c b/arenaGUI.c index 7382c56..d8f35df 100644 --- a/arenaGUI.c +++ b/arenaGUI.c @@ -1,3 +1,23 @@ -#include -#include -#include "SDL2/SDL.h" +#include +#include +#include "logHelper.h" +#include +#include +#include +#include "arenaGUI.h" + +void displayArena(ARENA_H_TILE* arena, SDL_Window* window, SDL_Surface *res, int size_h, int size_w, int tile_size) { + SDL_Rect tmp_tile_coord; + int i,j; + + for (i=0; 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 literal 0 HcmV?d00001 diff --git a/data/tile_tree.png b/data/tile_tree.png new file mode 100644 index 0000000000000000000000000000000000000000..eab6e466ccd17c323dca4d756b5bc4aac2237864 GIT binary patch literal 3090 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 gxp&2c@AP)!{@U|!Mz-q4 za!H0o1q&{*6BS$ikOLLFFl{C)u>}Q_){)K4uRFU_=jU=?M7A6dKK1}pjvL*Mj!6O2 z4nr-;&r5N%G&RXJa~0Jy44a}12Q+Rj;1HhkH3BYa->+6 zIWP$xS48N!zrKC&`nfihH+ zZwUfc1X>FSEg`{UuW-rF{m%B_^yJq56QLWI1*4{F_0ijx_s)+ER7$)a0Ifk|zC5wB zd+VtC&B^iQ&CP-Orm5D@W(#~vfVbctq>E$C_Vt}7P$=5F>g8yYIiUlSB2o4>xj!ax z;=DQU+Ar@d|9Y=t(X=7G%Wj?>8Ll?eeiB^r4&+M4Y*~cGAtZLAwKr66OYnrqPwI1J zz!K>BeqG|h$6MQf-ak}FQv-C4BSJ{-ysLNC0XRa?Is$pnp;Br2(+5K~D{vqeC)d8b zx6(7?5Mv1qkJvLdN+QXdck!ld{gD*t!oEE}zTG{L zk_pb$deabNwBZD}9t2n5`=`fuyGJIbFw&@LGC6gW<}LfUt3J?AXqoIluFTQ^T40es z0@{McQbFd%`lhXr2LtWs#mUu6->piK$e*^_cTSIPA06IoHaT~molG3;&whCQ-HWqp zTiavpoeSSPdZz4hJSia((nyl$3v-t}VwmWU(h8UmE_onpKusnUXv|cqK$bw?qjf1l z$}x&Ny?*iG%5c6g`}1r5ieC|mFZ}YJ(>G%WR$wtofBWX;`{UV_dYeD*(vkG_ z&Vd-E?sQL8F5=R?)sbTL+Wx)>jVdT+ti5&j$7k9^M(D%@)}Savag;DAG6%TRcJ7kz ztBsZtp#+wI(1~d1%(a7URf7KFp`~};GrH5(C3Azd#*Ndi#E*jx|CNocvBs7mSGdyN z;;*@72yyeQdu{6psXrX&Nbrcj72?i0d5_%}epv6P^NSzfFa7*ZLB=o4*rlurk;uf+(cNcVHIR=K)E_leD#|2d%obR0KYDdO-hQG?WUg=Tjc@O9v`j|q#RQ8U z-kcLyg@-n3hC=D9RtxlC>`S?8UJ;o9$@p--YAjcTE?ng&g|?8`Pw4Yy864qF*?BWI zfeSI#s^i@!gRT1XyVuj_=Nc+CRI1Frf5rJ~yDbey1SfjFmBMDJ*GR1;xD3(MalD`ToS?i_p5-+MCsKI1zBvWKB6-yGmb{4u~D;yXi<2(2O+ zbu4wYz1g3xT$pkLW|U_SOVPLvr?p5*=A}eFYOu07)Yuu_?C2^Rx@t|0B_(Sik%v%b zi;yqEoAnyAwSj8=;*`r!C=a(=95#x13*Np(PtRkw3`-)jg`;A#>$L{~~ip@b) zx*%rbS{KWRtfo-B@U-m*)sb-Z$2oP@eibHW4pUDoEBOzu_q=$l29NW43AnUSUCXe)J5fMVOxR~te&CXX;eGXkt3Dm*<@ zY3Z4&a1{j>L(qIk1t&!)ZD=+|pLZ2Z{=)rLXw^S{vZqaEZ=W4M{OOG>Mvp$(y?S(b zaV5kN(K#WJ8E);3cJ@J-GHz^YnJVO>pk-9}`3nsf>OxOcpWEn<^I@Zz+$XW9!cAou_Ja&V&o`6(IuCO2WqRF?kx+vGn!3WM?9IX`=o2v6L7_x9`O zPqnoT!`6;rXGf7P3hX%OB#fCF$JA_3937ACc4VwZ6M5Fm;xH|6g#j1Yw-N-+*y!!fZxCM6l}tP5B{^o0h;xX~PLH1GcH&FJ1P8*nlt z&RUOeMp(i8`NjFovy;m^JNgPM>Y}dEmL&>`1Y13S^Zc0-O>tL(5|RbE$DD-Yx4IG)Z-;gjRzBMeN@^@anHWW9dR9+NFu+XV8MblJ%22!g=(oRsZd8rM pS -#include -#include - -int resOpen(char* filename, FILE* f) { - char fLoc[128]; - - strcpy(fLoc, "resources/"); - strcat(fLoc, filename); - f = fopen(fLoc, "rb"); - - if (f != NULL) return 0; - - return -1; -} +#include +#include +#include + +int resOpen(char* filename, FILE* f) { + char fLoc[128]; + + strcpy(fLoc, "resources/"); + strcat(fLoc, filename); + f = fopen(fLoc, "rb"); + + if (f != NULL) return 0; + + return -1; +} diff --git a/fileHandler.h b/fileHandler.h index 7dfc698..5c307a7 100644 --- a/fileHandler.h +++ b/fileHandler.h @@ -1,6 +1,6 @@ -#ifndef FILEHANDLER_H_ -#define FILEHANDLER_H_ - -int resOpen(char* filename); - -#endif +#ifndef FILEHANDLER_H_ +#define FILEHANDLER_H_ + +int resOpen(char* filename); + +#endif diff --git a/logHelper.c b/logHelper.c index be3a773..06d1008 100644 --- a/logHelper.c +++ b/logHelper.c @@ -1,76 +1,76 @@ -#include -#include -#include -#include -#include "logHelper.h" - -FILE *log_file=NULL; - -int initialise_logger(){ - time_t raw_time; - struct tm *pdh; - time(&raw_time); - pdh = localtime(&raw_time); - char name[32]; - sprintf(name, "%04d-%02d-%02d.log", pdh->tm_year+1900, pdh->tm_mon+1, pdh->tm_mday); - log_file=fopen(name, "a"); - - if(log_file==NULL) //fichier innexistant - { - log_file=fopen(name,"w+"); - - if(log_file==NULL) { //Le prog n'a pas les droits en écriture - printf("\n****************************************************************\nATTENTION ! Le fichier de log ne peut être écris, aucune info ne sera enregistré !\n****************************************************************\n"); - return -1; - } - } - - return 0; -} - -void stop_logger() {fclose(log_file);} - -void addLogInfo(char *mess){ - time_t now; - struct tm* tm_info; - char buffer[12]; - - initialise_logger(); - - time(&now); - tm_info = localtime(&now); - strftime(buffer, 12, "%H:%M:%S", tm_info); - fprintf(log_file,"[INFO][%s] %s\n", buffer, mess); - - stop_logger(); -} - -void addLogWarn(char *mess){ - time_t now; - struct tm* tm_info; - char buffer[12]; - - initialise_logger(); - - time(&now); - tm_info = localtime(&now); - strftime(buffer, 12, "%H:%M:%S", tm_info); - fprintf(log_file,"[WARN][%s] %s\n", buffer, mess); - - stop_logger(); -} - -void addLogCritical(char *mess){ - time_t now; - struct tm* tm_info; - char buffer[12]; - - initialise_logger(); - - time(&now); - tm_info = localtime(&now); - strftime(buffer, 12, "%H:%M:%S", tm_info); - fprintf(log_file,"[CRITICAL][%s] %s\n", buffer, mess); - - stop_logger(); -} +#include +#include +#include +#include +#include "logHelper.h" + +FILE *log_file=NULL; + +int initialise_logger(){ + time_t raw_time; + struct tm *pdh; + time(&raw_time); + pdh = localtime(&raw_time); + char name[32]; + sprintf(name, "%04d-%02d-%02d.log", pdh->tm_year+1900, pdh->tm_mon+1, pdh->tm_mday); + log_file=fopen(name, "a"); + + if(log_file==NULL) //fichier innexistant + { + log_file=fopen(name,"w+"); + + if(log_file==NULL) { //Le prog n'a pas les droits en écriture + printf("\n****************************************************************\nATTENTION ! Le fichier de log ne peut être écris, aucune info ne sera enregistré !\n****************************************************************\n"); + return -1; + } + } + + return 0; +} + +void stop_logger() {fclose(log_file);} + +void addLogInfo(char *mess){ + time_t now; + struct tm* tm_info; + char buffer[12]; + + initialise_logger(); + + time(&now); + tm_info = localtime(&now); + strftime(buffer, 12, "%H:%M:%S", tm_info); + fprintf(log_file,"[INFO][%s] %s\n", buffer, mess); + + stop_logger(); +} + +void addLogWarn(char *mess){ + time_t now; + struct tm* tm_info; + char buffer[12]; + + initialise_logger(); + + time(&now); + tm_info = localtime(&now); + strftime(buffer, 12, "%H:%M:%S", tm_info); + fprintf(log_file,"[WARN][%s] %s\n", buffer, mess); + + stop_logger(); +} + +void addLogCritical(char *mess){ + time_t now; + struct tm* tm_info; + char buffer[12]; + + initialise_logger(); + + time(&now); + tm_info = localtime(&now); + strftime(buffer, 12, "%H:%M:%S", tm_info); + fprintf(log_file,"[CRITICAL][%s] %s\n", buffer, mess); + + stop_logger(); +} diff --git a/logHelper.h b/logHelper.h index 7b574b8..5da67ec 100644 --- a/logHelper.h +++ b/logHelper.h @@ -1,11 +1,11 @@ -#ifndef LOGGER_H_ -#define LOGGER_H_ - -int initialise_logger(); //Prépare le logger à écrire dans les fichiers de logs -void stop_logger(); - -void addLogInfo(char *mess); //Ajoute une entrée dans le fichier de log de type INFO -void addLogWarn(char *mess); -void addLogCritical(char *mess); //Ajoute une entrée dans le fichier de log de type CRITICAL - -#endif +#ifndef LOGGER_H_ +#define LOGGER_H_ + +int initialise_logger(); //Prépare le logger à écrire dans les fichiers de logs +void stop_logger(); + +void addLogInfo(char *mess); //Ajoute une entrée dans le fichier de log de type INFO +void addLogWarn(char *mess); +void addLogCritical(char *mess); //Ajoute une entrée dans le fichier de log de type CRITICAL + +#endif diff --git a/main.c b/main.c index 24ccd94..1d2a9cf 100644 --- a/main.c +++ b/main.c @@ -1,60 +1,76 @@ -/* - * main.c - * - * Created on: 17 juin 2018 - * Author: isen - */ - -//#include "IAEngine.h" -#include "playerInterface.h" -#include "SDL2/SDL.h" -#include -#include -#include "logHelper.h" -#include -#include -#include -#include "arenaEngine.h" - -#define A_HEIGHT 100 -#define A_WIDTH 100 - -void initDisplayLib() { - if (SDL_Init(SDL_INIT_VIDEO) != 0) { - addLogCritical("Init SDL libs failed !"); - - exit(EXIT_FAILURE); - } -} - -void initResources() { - //resOpen(); -} - -int main(int argc, char *argv[]) { - ARENA_H_TILE* arena = NULL; - - // Création de la fenêtre - SDL_Window* pWindow = NULL; - pWindow = SDL_CreateWindow("Arena Survival Tournament",SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,640,480,SDL_WINDOW_SHOWN); - - addLogInfo("Starting game..."); - initDisplayLib(); - initResources(); - - addLogInfo("Creating new arena..."); - arena = genNewArena(A_HEIGHT, A_WIDTH); - if (arena == NULL) { - addLogCritical("Error with arena generator !"); - exit(EXIT_FAILURE); - } - addLogInfo("Successfully created arena."); - - deleteArena(arena); - addLogInfo("Cleared arena."); - - - - return EXIT_SUCCESS; -} - +#include "main.h" +#include +#include +#include "logHelper.h" +#include +#include +#include +//#include +//#include +#include "arenaEngine.h" +#include "arenaGUI.h" +//#include "IAEngine.h" +#include "playerInterface.h" + + +void initDisplayLib() { + if (SDL_Init(SDL_INIT_VIDEO) != 0) { + addLogCritical("Init SDL libs failed !"); + + exit(EXIT_FAILURE); + } +} + +int main(int argc, char *argv[]) { + addLogInfo("Starting game..."); + addLogInfo("Try init SDL libs..."); + initDisplayLib(); + + addLogInfo("Load ressources in memory..."); + SDL_Surface *tile_grass = NULL, *tile_rock = NULL, *tile_tree = NULL, *tile_water = NULL, *sprite_player_act = NULL, *sprite_ia_act = NULL; + SDL_Surface *ressource[6] = {tile_grass, tile_rock, tile_tree, tile_water, sprite_player_act, sprite_ia_act}; + SDL_Surface *sprite_player[4] = {NULL}, *sprite_ia[4] = {NULL}; + tile_grass = IMG_Load("data/tile_grass.png"); + tile_rock = IMG_Load("data/tile_rock.png"); + tile_tree = IMG_Load("data/tile_tree.png"); + tile_water = IMG_Load("data/tile_water.png"); + + sprite_player[DOWN] = IMG_Load("data/sprite_player_1.png"); + //sprite_player[UP] = IMG_Load("data/sprite_player_2.png"); + //sprite_player[LEFT] = IMG_Load("data/sprite_player_3.png"); + //sprite_player[RIGHT] = IMG_Load("data/sprite_player_4.png"); + + sprite_ia[DOWN] = IMG_Load("data/sprite_ia_1.png"); + //sprite_ia[UP] = IMG_Load("data/sprite_ia_2.png"); + //sprite_ia[LEFT] = IMG_Load("data/sprite_ia_3.png"); + //sprite_ia[RIGHT] = IMG_Load("data/sprite_ia_4.png"); + + addLogInfo("Create SDL windows instance..."); + SDL_Window* gameWindows = SDL_CreateWindow("Arena Survival Tournament - alpha 0.2", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WINDOWS_WIDTH, WINDOWS_HEIGHT, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN); + + addLogInfo("Creating new arena..."); + ARENA_H_TILE* arena = NULL; + arena = genNewArena(A_HEIGHT, A_WIDTH); + if (arena == NULL) { + addLogCritical("Error with arena generator !"); + exit(EXIT_FAILURE); + } + addLogInfo("Successfully created arena."); + + addLogInfo("Display arena GUI..."); + sprite_player_act = sprite_player[DOWN]; + sprite_ia_act = sprite_ia[DOWN]; + displayArena(arena, gameWindows, tile_grass, A_HEIGHT, A_WIDTH, TILE_SIZE); + + + + + deleteArena(arena); + addLogInfo("Cleared arena."); + + SDL_Delay(5000); + addLogInfo("Unload SDL libs..."); + SDL_Quit(); + return EXIT_SUCCESS; +} + diff --git a/main.h b/main.h new file mode 100644 index 0000000..4fbb585 --- /dev/null +++ b/main.h @@ -0,0 +1,14 @@ +#ifndef MAIN_H_ +#define MAIN_H_ + +#define A_WIDTH 20 +#define A_HEIGHT 20 + +#define TILE_SIZE 32 +#define WINDOWS_WIDTH TILE_SIZE * A_WIDTH +#define WINDOWS_HEIGHT TILE_SIZE * A_HEIGHT + +enum {DOWN, UP, LEFT, RIGHT}; +enum {GRASS_T, ROCK_T, TREE_T, WATER_T, PLAYER_S, IA_S}; + +#endif diff --git a/menuGUI.c b/menuGUI.c index 52beb08..f40249e 100644 --- a/menuGUI.c +++ b/menuGUI.c @@ -1,19 +1,19 @@ -#include -#include -#include - -int createGameMenuWindows() { - if (SDL_Init(SDL_INIT_VIDEO) != 0) { - printf("Erreur chargement librairie SDL ! %s\n",SDL_GetError()); - exit(EXIT_FAILURE); - } - - SDL_Window *main_test; - main_test = SDL_CreateWindow("My test windows", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 320, 140, SDL_WINDOW_OPENGL | SDL_WINDOW_BORDERLESS); - SDL_Delay(5000); - SDL_DestroyWindow(main_test); - - SDL_Quit(); - return EXIT_SUCCESS; -} - +#include +#include +#include + +int createGameMenuWindows() { + if (SDL_Init(SDL_INIT_VIDEO) != 0) { + printf("Erreur chargement librairie SDL ! %s\n",SDL_GetError()); + exit(EXIT_FAILURE); + } + + SDL_Window *main_test; + main_test = SDL_CreateWindow("My test windows", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 320, 140, SDL_WINDOW_OPENGL | SDL_WINDOW_BORDERLESS); + SDL_Delay(5000); + SDL_DestroyWindow(main_test); + + SDL_Quit(); + return EXIT_SUCCESS; +} + diff --git a/menuGUI.h b/menuGUI.h index cf4bccb..2ac4eaa 100644 --- a/menuGUI.h +++ b/menuGUI.h @@ -1,6 +1,6 @@ -#ifndef MENUGUI_H_ -#define MENUGUI_H_ - - - -#endif +#ifndef MENUGUI_H_ +#define MENUGUI_H_ + + + +#endif diff --git a/playerInterface.c b/playerInterface.c index 690b5ab..4914a15 100644 --- a/playerInterface.c +++ b/playerInterface.c @@ -1,468 +1,468 @@ -/* - * playerInterface.c - * - * Created on: 17 juin 2018 - * Author: isen - */ - -#include "playerInterface.h" - -#include "SDL2/SDL.h" -#include -#include - - -#define ArenaMAX 100 - -int PlayerInterface(void) -{ - - PLAYER* List=NULL; - PLAYER* Element=NULL; - int id=0; - int numberAlive; - - PLAYER* player1=NULL; - PLAYER* player2=NULL; - - while(id<2) - { - id = id + 1; - Element = createPlayer(id); - List = insertRightPlaceRecursive(List,Element); - } - - displayList(List); - - player1 = SearchPlayer(List, 1); - player2 = SearchPlayer(List, 2); - - printf("Nom player 1 : %s\n",player1->Name); - printf("Nom player 2 : %s\n",player2->Name); - - numberAlive = NumberPlayerAlive(List); - printf("Nombre de joueur en vie : %i",numberAlive); - - - int action; - - - do - { - action=getEvent(); - - if(action == 1) - { - ActionPlayer(player1,1); //Déplacement vers le haut - } - else if(action == 2) - { - ActionPlayer(player1,2); //Déplacement vers la droite - } - else if(action == 3) - { - ActionPlayer(player1,3); //Déplacement vers le bas - } - else if(action == 4) - { - ActionPlayer(player1,4); //Déplacement vers la gauche - } - else if(action == 5) - { - //Regarder le perso en face, le plus près - AttackPlayer(player1,player2); //Voir quel player on choisit d'attaquer - } - - - //Tour de l'IA - IAEngine(player1,player2); - - } - - while(action != -1); - - return -1; - - //return 0; -} - - -int getEvent() -{ - int action; - SDL_Event event; - SDL_WaitEvent(&event); /* Récupération de l'événement dans event */ - - switch(event.type) /* Test du type d'événement */ - { - /* Si c'est un événement de type "Quitter" */ - case SDL_QUIT : printf("QUITTER\n"); - action = -1; - break; - case SDL_KEYUP: - switch(event.key.keysym.sym) //La valeur de touche - { - case SDLK_UP: printf("FLECHE DU HAUT\n"); - action = 1; - break; - case SDLK_DOWN: printf("FLECHE DU BAS\n"); - action = 3; - break; - case SDLK_RIGHT: printf("FLECHE DE DROITE\n"); - action = 2; - break; - case SDLK_LEFT: printf("FLECHE DE GAUCHE\n"); - action = 4; - break; - case SDLK_SPACE:printf("BARRE D'ESPACE\n"); - action = 5; - } - break; - } - return action; -} - - - - - - - -/* - - - ActionPlayer(player2,1); //Déplacement vers le haut - ActionPlayer(player2,2); //Déplacement vers la droite - ActionPlayer(player2,3); //Déplacement vers le bas - ActionPlayer(player2,4); //Déplacement vers la gauche - -*/ - - - //freeElement(List, 2); // Fonctionne - //freeList(List); // Fonctionne - - //displayList(List); - - /** Pour la simulation d'un combat, on rentre la lettre A au clavier - * Le joueur 1 va attaqué le joueur 2 et inversement - * On affiche le score des joueurs - * - * */ - //List = AttackPlayer(List, 1, 2); - -// SDL_Quit(); - - -/**Fonction qui crée un joueur - * - * */ -PLAYER* createPlayer(int Id) -{ - PLAYER* player=NULL; - //Utilisé la fonction de récupération de la taille de l'arène - - player=(PLAYER*)malloc(sizeof(PLAYER)); - if(player==NULL) - { - printf("ERREUR Allocation joueur "); - } - - printf("Entrer le nom du joueur\n"); - scanf("%s",player->Name); - printf("Nb PV?\n"); - scanf("%d",&player->HealthPoints); - player->Id = Id; - player->AttacksPoints = 10; - - if(Id == 1) - { - player->PositionX=0; - player->PositionY=0; - } - else if(Id ==2) - { - player->PositionX=ArenaMAX; - player->PositionY=0; - } - else if(Id ==3) - { - player->PositionX=0; - player->PositionY=ArenaMAX; - } - else - { - player->PositionX=ArenaMAX; - player->PositionY=ArenaMAX; - } - - player->suiv=NULL; - - return player; -} - -/**Fonction qui ajoute un joueur à la liste - * - * */ - -PLAYER* insertRightPlaceRecursive(PLAYER* Head, PLAYER* Element) -{ - if(Head == NULL) - { - return Element; - } - - if(Element->Id < Head->Id) - { - Element->suiv = Head; - return Element; - } - else - { - if(Element->Id == Head->Id) - { - printf("Le joueur à l'id %d exite déja dans la liste\n",Element->Id); - free(Element); - return Head; - } - else - { - Head->suiv = insertRightPlaceRecursive(Head->suiv,Element); - return Head; - } - } -} - -void displayList(PLAYER * Head) -{ - if(Head == NULL) - { - printf("La liste est vide\n"); - } - while(Head != NULL) - { - printf("****Player %d****\n",Head->Id); - printf("Nom : %s\n",Head->Name); - Head = Head->suiv; - } -} - - -PLAYER * freeElement(PLAYER *Head, int Id) -{ - PLAYER * Element; - - if(Head == NULL) - { - printf("La liste est vide\n"); - } - - if(Id == Head->Id) - { - Element = Head; - Head = Head->suiv; - printf("Le joueur %d a été supprimé de la liste\n",Element->Id); - free(Element); - return Head; - } - else - { - Head->suiv = freeElement(Head->suiv,Id); - return Head; - } -} - - -PLAYER * freeList(PLAYER *Head) -{ - if(Head != NULL) - { - freeList(Head->suiv); - - } - free(Head); - Head=NULL; - - return Head; -} - -int NumberPlayerAlive(PLAYER *Head) -{ - int numberAlive=0; - if(Head == NULL) - { - printf("La liste est vide\n"); - return -1; - } - else - { - do - { - if(Head->HealthPoints > 0) - { - numberAlive = numberAlive + 1; - } - Head=Head->suiv; - } - while(Head != NULL); - return numberAlive; - } -} - -PLAYER * SearchPlayer(PLAYER *Head, int idPlayer) -{ - printf("Fonction Recherche\n"); - - if(Head == NULL) - { - printf("La liste est vide\n"); - } - - if(Head->Id == idPlayer) - { - printf("Trouvé\n"); - - printf(" Joueur %s\n",Head->Name); - return Head; - } - else - { - Head->suiv = SearchPlayer(Head->suiv,idPlayer); - - return Head->suiv; - } -} - - -void AttackPlayer( PLAYER *player1, PLAYER *player2) -{ - printf("Fonction Attaque\n"); - - - if((player1 != NULL) && (player2 != NULL)) - { - - while((player1->HealthPoints > 0) && (player2->HealthPoints > 0)) - { - printf("\n\n** Tour **\n"); - - printf("Attaque Joueur %d sur joueur %d \n",player1->Id,player2->Id); - - player2->HealthPoints = player2->HealthPoints - player1->AttacksPoints; - - printf("Joueur %d : %s PV = %d\n ",player1->Id,player1->Name,player1->HealthPoints); - printf("Joueur %d : %s PV = %d\n ",player2->Id,player2->Name,player2->HealthPoints); - - if((player1->HealthPoints > 0) && (player2->HealthPoints > 0)) - { - printf("\nAttaque Joueur %d sur joueur %d\n ",player2->Id,player1->Id); - player1->HealthPoints = player1->HealthPoints - player2->AttacksPoints; - - printf("Joueur %d : %s PV = %d\n ",player1->Id,player1->Name,player1->HealthPoints); - printf("Joueur %d : %s PV = %d \n",player2->Id,player2->Name,player2->HealthPoints); - } - } - - if(player1->HealthPoints > player2->HealthPoints) - { - printf("Combat finie \n Le joueur 1 a gagné le combat\n"); - } - else if(player1->HealthPoints < player2->HealthPoints) - { - printf("Combat finie \n Le joueur 2 a gagné le combat\n"); - } - else - { - printf("Combat finie \n Les 2 joueurs sont morts"); - } - } -} - - -void ActionPlayer(PLAYER * player, int action) -{ - /* action = 1 --> Déplacement d'1 carreau vers le haut - * action = 2 --> Déplacement d'1 carreau vers la droite - * action = 3 --> Déplacement d'1 carreau vers le bas - * action = 4 --> Déplacement d'1 carreau vers la gauche - * - * */ - - if(player != NULL) - { - // récupère la position du personnage. La position de l'instance sur l'arène est récupérer par une fonction - int positionX = player->PositionX; - int positionY = player->PositionY; - - - - printf("\n**** Player %s ****",player->Name); - - if(action == 1) - { - printf("On veut aller vers le haut\n"); - - if(positionY-1 >= 0) - { - player->PositionY = positionY-1; - printf("Déplacement de 1 vers le haut\n La nouvelle position est de X: %i et Y: %i \n",player->PositionX,player->PositionY); - } - else - { - printf("Impossible d'aller vers le haut\n"); - } - } - else if(action == 2) - { - printf("On veut aller vers la droite\n"); - - if(positionX + 1 <= ArenaMAX) - { - player->PositionX = positionX + 1; - printf("Déplacement de 1 vers la droite\n La nouvelle position est de X: %i et Y: %i \n",player->PositionX,player->PositionY); - } - else - { - printf("Impossible d'aller vers la droite\n"); - } - } - else if(action == 3) - { - printf("On veut aller vers le bas\n"); - - if(positionY + 1 <= ArenaMAX) - { - player->PositionY = positionY + 1; - printf("Déplacement de 1 vers le bas\n La nouvelle position est de X: %i et Y: %i \n",player->PositionX,player->PositionY); - } - else - { - printf("Impossible d'aller vers le bas\n"); - } - } - else if(action == 4) - { - printf("On veut aller vers la gauche\n"); - - if(positionX - 1 >= 0) - { - player->PositionX = positionX - 1; - printf("Déplacement de 1 vers le bas\n La nouvelle position est de X: %i et Y: %i \n",player->PositionX,player->PositionY); - } - else - { - printf("Impossible d'aller vers la gauche\n"); - } - } - else - { - printf("Autre action\n"); - } - } - else - { - printf("Echec, le joueur est NULL\n"); - } -} - - +/* + * playerInterface.c + * + * Created on: 17 juin 2018 + * Author: isen + */ + +#include "playerInterface.h" + +#include "SDL2/SDL.h" +#include +#include + + +#define ArenaMAX 100 + +int PlayerInterface(void) +{ + + PLAYER* List=NULL; + PLAYER* Element=NULL; + int id=0; + int numberAlive; + + PLAYER* player1=NULL; + PLAYER* player2=NULL; + + while(id<2) + { + id = id + 1; + Element = createPlayer(id); + List = insertRightPlaceRecursive(List,Element); + } + + displayList(List); + + player1 = SearchPlayer(List, 1); + player2 = SearchPlayer(List, 2); + + printf("Nom player 1 : %s\n",player1->Name); + printf("Nom player 2 : %s\n",player2->Name); + + numberAlive = NumberPlayerAlive(List); + printf("Nombre de joueur en vie : %i",numberAlive); + + + int action; + + + do + { + action=getEvent(); + + if(action == 1) + { + ActionPlayer(player1,1); //Déplacement vers le haut + } + else if(action == 2) + { + ActionPlayer(player1,2); //Déplacement vers la droite + } + else if(action == 3) + { + ActionPlayer(player1,3); //Déplacement vers le bas + } + else if(action == 4) + { + ActionPlayer(player1,4); //Déplacement vers la gauche + } + else if(action == 5) + { + //Regarder le perso en face, le plus près + AttackPlayer(player1,player2); //Voir quel player on choisit d'attaquer + } + + + //Tour de l'IA + IAEngine(player1,player2); + + } + + while(action != -1); + + return -1; + + //return 0; +} + + +int getEvent() +{ + int action; + SDL_Event event; + SDL_WaitEvent(&event); /* Récupération de l'événement dans event */ + + switch(event.type) /* Test du type d'événement */ + { + /* Si c'est un événement de type "Quitter" */ + case SDL_QUIT : printf("QUITTER\n"); + action = -1; + break; + case SDL_KEYUP: + switch(event.key.keysym.sym) //La valeur de touche + { + case SDLK_UP: printf("FLECHE DU HAUT\n"); + action = 1; + break; + case SDLK_DOWN: printf("FLECHE DU BAS\n"); + action = 3; + break; + case SDLK_RIGHT: printf("FLECHE DE DROITE\n"); + action = 2; + break; + case SDLK_LEFT: printf("FLECHE DE GAUCHE\n"); + action = 4; + break; + case SDLK_SPACE:printf("BARRE D'ESPACE\n"); + action = 5; + } + break; + } + return action; +} + + + + + + + +/* + + + ActionPlayer(player2,1); //Déplacement vers le haut + ActionPlayer(player2,2); //Déplacement vers la droite + ActionPlayer(player2,3); //Déplacement vers le bas + ActionPlayer(player2,4); //Déplacement vers la gauche + +*/ + + + //freeElement(List, 2); // Fonctionne + //freeList(List); // Fonctionne + + //displayList(List); + + /** Pour la simulation d'un combat, on rentre la lettre A au clavier + * Le joueur 1 va attaqué le joueur 2 et inversement + * On affiche le score des joueurs + * + * */ + //List = AttackPlayer(List, 1, 2); + +// SDL_Quit(); + + +/**Fonction qui crée un joueur + * + * */ +PLAYER* createPlayer(int Id) +{ + PLAYER* player=NULL; + //Utilisé la fonction de récupération de la taille de l'arène + + player=(PLAYER*)malloc(sizeof(PLAYER)); + if(player==NULL) + { + printf("ERREUR Allocation joueur "); + } + + printf("Entrer le nom du joueur\n"); + scanf("%s",player->Name); + printf("Nb PV?\n"); + scanf("%d",&player->HealthPoints); + player->Id = Id; + player->AttacksPoints = 10; + + if(Id == 1) + { + player->PositionX=0; + player->PositionY=0; + } + else if(Id ==2) + { + player->PositionX=ArenaMAX; + player->PositionY=0; + } + else if(Id ==3) + { + player->PositionX=0; + player->PositionY=ArenaMAX; + } + else + { + player->PositionX=ArenaMAX; + player->PositionY=ArenaMAX; + } + + player->suiv=NULL; + + return player; +} + +/**Fonction qui ajoute un joueur à la liste + * + * */ + +PLAYER* insertRightPlaceRecursive(PLAYER* Head, PLAYER* Element) +{ + if(Head == NULL) + { + return Element; + } + + if(Element->Id < Head->Id) + { + Element->suiv = Head; + return Element; + } + else + { + if(Element->Id == Head->Id) + { + printf("Le joueur à l'id %d exite déja dans la liste\n",Element->Id); + free(Element); + return Head; + } + else + { + Head->suiv = insertRightPlaceRecursive(Head->suiv,Element); + return Head; + } + } +} + +void displayList(PLAYER * Head) +{ + if(Head == NULL) + { + printf("La liste est vide\n"); + } + while(Head != NULL) + { + printf("****Player %d****\n",Head->Id); + printf("Nom : %s\n",Head->Name); + Head = Head->suiv; + } +} + + +PLAYER * freeElement(PLAYER *Head, int Id) +{ + PLAYER * Element; + + if(Head == NULL) + { + printf("La liste est vide\n"); + } + + if(Id == Head->Id) + { + Element = Head; + Head = Head->suiv; + printf("Le joueur %d a été supprimé de la liste\n",Element->Id); + free(Element); + return Head; + } + else + { + Head->suiv = freeElement(Head->suiv,Id); + return Head; + } +} + + +PLAYER * freeList(PLAYER *Head) +{ + if(Head != NULL) + { + freeList(Head->suiv); + + } + free(Head); + Head=NULL; + + return Head; +} + +int NumberPlayerAlive(PLAYER *Head) +{ + int numberAlive=0; + if(Head == NULL) + { + printf("La liste est vide\n"); + return -1; + } + else + { + do + { + if(Head->HealthPoints > 0) + { + numberAlive = numberAlive + 1; + } + Head=Head->suiv; + } + while(Head != NULL); + return numberAlive; + } +} + +PLAYER * SearchPlayer(PLAYER *Head, int idPlayer) +{ + printf("Fonction Recherche\n"); + + if(Head == NULL) + { + printf("La liste est vide\n"); + } + + if(Head->Id == idPlayer) + { + printf("Trouvé\n"); + + printf(" Joueur %s\n",Head->Name); + return Head; + } + else + { + Head->suiv = SearchPlayer(Head->suiv,idPlayer); + + return Head->suiv; + } +} + + +void AttackPlayer( PLAYER *player1, PLAYER *player2) +{ + printf("Fonction Attaque\n"); + + + if((player1 != NULL) && (player2 != NULL)) + { + + while((player1->HealthPoints > 0) && (player2->HealthPoints > 0)) + { + printf("\n\n** Tour **\n"); + + printf("Attaque Joueur %d sur joueur %d \n",player1->Id,player2->Id); + + player2->HealthPoints = player2->HealthPoints - player1->AttacksPoints; + + printf("Joueur %d : %s PV = %d\n ",player1->Id,player1->Name,player1->HealthPoints); + printf("Joueur %d : %s PV = %d\n ",player2->Id,player2->Name,player2->HealthPoints); + + if((player1->HealthPoints > 0) && (player2->HealthPoints > 0)) + { + printf("\nAttaque Joueur %d sur joueur %d\n ",player2->Id,player1->Id); + player1->HealthPoints = player1->HealthPoints - player2->AttacksPoints; + + printf("Joueur %d : %s PV = %d\n ",player1->Id,player1->Name,player1->HealthPoints); + printf("Joueur %d : %s PV = %d \n",player2->Id,player2->Name,player2->HealthPoints); + } + } + + if(player1->HealthPoints > player2->HealthPoints) + { + printf("Combat finie \n Le joueur 1 a gagné le combat\n"); + } + else if(player1->HealthPoints < player2->HealthPoints) + { + printf("Combat finie \n Le joueur 2 a gagné le combat\n"); + } + else + { + printf("Combat finie \n Les 2 joueurs sont morts"); + } + } +} + + +void ActionPlayer(PLAYER * player, int action) +{ + /* action = 1 --> Déplacement d'1 carreau vers le haut + * action = 2 --> Déplacement d'1 carreau vers la droite + * action = 3 --> Déplacement d'1 carreau vers le bas + * action = 4 --> Déplacement d'1 carreau vers la gauche + * + * */ + + if(player != NULL) + { + // récupère la position du personnage. La position de l'instance sur l'arène est récupérer par une fonction + int positionX = player->PositionX; + int positionY = player->PositionY; + + + + printf("\n**** Player %s ****",player->Name); + + if(action == 1) + { + printf("On veut aller vers le haut\n"); + + if(positionY-1 >= 0) + { + player->PositionY = positionY-1; + printf("Déplacement de 1 vers le haut\n La nouvelle position est de X: %i et Y: %i \n",player->PositionX,player->PositionY); + } + else + { + printf("Impossible d'aller vers le haut\n"); + } + } + else if(action == 2) + { + printf("On veut aller vers la droite\n"); + + if(positionX + 1 <= ArenaMAX) + { + player->PositionX = positionX + 1; + printf("Déplacement de 1 vers la droite\n La nouvelle position est de X: %i et Y: %i \n",player->PositionX,player->PositionY); + } + else + { + printf("Impossible d'aller vers la droite\n"); + } + } + else if(action == 3) + { + printf("On veut aller vers le bas\n"); + + if(positionY + 1 <= ArenaMAX) + { + player->PositionY = positionY + 1; + printf("Déplacement de 1 vers le bas\n La nouvelle position est de X: %i et Y: %i \n",player->PositionX,player->PositionY); + } + else + { + printf("Impossible d'aller vers le bas\n"); + } + } + else if(action == 4) + { + printf("On veut aller vers la gauche\n"); + + if(positionX - 1 >= 0) + { + player->PositionX = positionX - 1; + printf("Déplacement de 1 vers le bas\n La nouvelle position est de X: %i et Y: %i \n",player->PositionX,player->PositionY); + } + else + { + printf("Impossible d'aller vers la gauche\n"); + } + } + else + { + printf("Autre action\n"); + } + } + else + { + printf("Echec, le joueur est NULL\n"); + } +} + + diff --git a/playerInterface.h b/playerInterface.h index 5003f1e..c2b8bb1 100644 --- a/playerInterface.h +++ b/playerInterface.h @@ -1,49 +1,49 @@ -/* - * playerInterface.h - * - * Created on: 17 juin 2018 - * Author: isen - */ - -#ifndef PLAYERINTERFACE_H_ -#define PLAYERINTERFACE_H_ - -/** Structure d'un joueur (IA ou utilisateur) - * - * */ -typedef struct Player -{ - int Id; - char Name[35]; - char Race[20]; - - int HealthPoints; - int AttacksPoints; - int DefensePoints; - - int PositionX; - int PositionY; - //char Weapons[Max_Weapons]; - - //int Coins; - - struct Player * suiv; - -}PLAYER; - -//Prototypes - -PLAYER* createPlayer(int Id); -PLAYER* insertRightPlaceRecursive(PLAYER* Head, PLAYER* Element); -void displayList(PLAYER * Head); -PLAYER * freeElement(PLAYER *Head, int Id); -PLAYER * freeList(PLAYER *Head); - -PLAYER * SearchPlayer(PLAYER *Head, int idPlayer); -void AttackPlayer( PLAYER *player1, PLAYER *player2); -void ActionPlayer(PLAYER * player, int action); - -int NumberPlayerAlive(PLAYER *Head); -int getEvent(void); - -#endif /* PLAYERINTERFACE_H_ */ +/* + * playerInterface.h + * + * Created on: 17 juin 2018 + * Author: isen + */ + +#ifndef PLAYERINTERFACE_H_ +#define PLAYERINTERFACE_H_ + +/** Structure d'un joueur (IA ou utilisateur) + * + * */ +typedef struct Player +{ + int Id; + char Name[35]; + char Race[20]; + + int HealthPoints; + int AttacksPoints; + int DefensePoints; + + int PositionX; + int PositionY; + //char Weapons[Max_Weapons]; + + //int Coins; + + struct Player * suiv; + +}PLAYER; + +//Prototypes + +PLAYER* createPlayer(int Id); +PLAYER* insertRightPlaceRecursive(PLAYER* Head, PLAYER* Element); +void displayList(PLAYER * Head); +PLAYER * freeElement(PLAYER *Head, int Id); +PLAYER * freeList(PLAYER *Head); + +PLAYER * SearchPlayer(PLAYER *Head, int idPlayer); +void AttackPlayer( PLAYER *player1, PLAYER *player2); +void ActionPlayer(PLAYER * player, int action); + +int NumberPlayerAlive(PLAYER *Head); +int getEvent(void); + +#endif /* PLAYERINTERFACE_H_ */