From 907a33d715c319a7831ed03ad7e41ddc0db8df13 Mon Sep 17 00:00:00 2001 From: JackCarterSmith Date: Sun, 24 Jun 2018 01:39:34 +0200 Subject: [PATCH] Release alpha1 --- makefile | 9 +- src/IAEngine.c | 1046 +++++++++++++++++++---------------------- src/IAEngine.h | 62 ++- src/arenaEngine.c | 244 +++++++++- src/arenaEngine.h | 10 +- src/arenaGUI.c | 161 ++++++- src/arenaGUI.h | 10 +- src/fileHandler.c | 26 +- src/fileHandler.h | 9 +- src/main.c | 232 +-------- src/menuGUI.h~HEAD | 6 - src/menuGUI.h~arena | 6 - src/playerInterface.c | 626 ------------------------ src/playerInterface.h | 49 -- 14 files changed, 936 insertions(+), 1560 deletions(-) delete mode 100644 src/menuGUI.h~HEAD delete mode 100644 src/menuGUI.h~arena delete mode 100644 src/playerInterface.c delete mode 100644 src/playerInterface.h diff --git a/makefile b/makefile index 5a68d29..d6dd660 100644 --- a/makefile +++ b/makefile @@ -21,8 +21,7 @@ src/arenaGUI.c \ src/fileHandler.c \ src/logHelper.c \ src/main.c \ -src/menuGUI.c \ -src/playerInterface.c +src/menuGUI.c OBJS += \ build/IAEngine.o \ @@ -31,8 +30,7 @@ build/arenaGUI.o \ build/fileHandler.o \ build/logHelper.o \ build/main.o \ -build/menuGUI.o \ -build/playerInterface.o +build/menuGUI.o C_DEPS += \ build/IAEngine.d \ @@ -41,8 +39,7 @@ build/arenaGUI.d \ build/fileHandler.d \ build/logHelper.d \ build/main.d \ -build/menuGUI.d \ -build/playerInterface.d +build/menuGUI.d build/%.o: src/%.c diff --git a/src/IAEngine.c b/src/IAEngine.c index 77fb6e2..e31e74e 100644 --- a/src/IAEngine.c +++ b/src/IAEngine.c @@ -1,568 +1,478 @@ -/* - * IAEngine.c - * - * Created on: 17 juin 2018 - * Author: isen - * - * Fonction qui va définir le comportement joueur(s) "ordinateur" - */ - -#include "playerInterface.h" -#include "arenaEngine.h" -#include "IAEngine.h" - -#include "SDL2/SDL.h" -#include -#include -#include - -enum {HAUT, DROITE, BAS, GAUCHE}; -#define NB_BLOCS_LARGEUR 20 -#define NB_BLOCS_HAUTEUR 20 - - -struct point -{ - int x,y; -}POINT; - - - - - - - -int IAEngine(ARENA_H_TILE* arena,PLAYER * player1, PLAYER * player2) -{ - //Fonction avec seulement 2 joueurs, voir la gestion quand il y a 2 IA supplémentaire - //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 action; - - if(((player2->PositionX == player1->PositionX ) && (player2->PositionY +1 == player1->PositionY ))||((player2->PositionX == player1->PositionX ) && (player2->PositionY -1 == player1->PositionY ))||((player2->PositionX + 1 == player1->PositionX ) && (player2->PositionY == player1->PositionY ))||((player2->PositionX - 1 == player1->PositionX ) && (player2->PositionY == player1->PositionY ))) - { - action=5; - } - - //action = FindShortestPath(player1->PositionX,player1->PositionY,player2->PositionX,player2->PositionY); - action = FindPath(arena,player1,player2); - printf("ACTION = %i",action); - printf("Tour de l'IA\n"); - if(action == 5) - { - AttackPlayer(player1,player2); - } - else if ((action >= 1) && (action <= 4)) - { - ActionPlayer(arena,player2,action); - } - //On vérifie si les 2 joueurs sont à côté pour attaquer - printf("Vérification position\n"); - /*action = FindShortestPath(player1->PositionX,player1->PositionY,player2->PositionX,player2->PositionY); - if(action == 5) - { - AttackPlayer(player2,player1); - }*/ - } - return 0; -} - - -int FindPath(ARENA_H_TILE* arena,PLAYER * player1, PLAYER * player2) -{ - int action; - - int compteur = 0; - int minH=1000,minB=1000,minG=1000,minD=1000; - int posX=0; - int posY=0; - - - - - //1 vers la gauche - NOEUD * n1 =NULL; - n1=(NOEUD*)malloc(sizeof(NOEUD)); - - //posX = player2->PositionX -1; - //posY = player2->PositionY ; - - n1->actualX = player2->PositionX -1; - n1->actualY = player2->PositionY; - - n1->min=3000; - n1->compteur=0; - - n1->ParentX = player2->PositionX; - n1->ParentY = player2->PositionY; - - if(((n1->actualX >= 0) && (n1->actualX < NB_BLOCS_LARGEUR ))&& ((n1->actualY >= 0) && (n1->actualY < NB_BLOCS_HAUTEUR)) && (abs(player1->PositionX - n1->actualX) >= abs(player1->PositionY - n1->actualY))) - { - if((player2->PositionX -1 == player1->PositionX ) && (player2->PositionY == player1->PositionY )) - { - return action=5; - } - else if(getTileTypeID(arena,n1->actualX,n1->actualY) == 0) - { - n1->compteur = n1->compteur+1; - //direction = GAUCHE; - n1=CalculatePath(arena,n1,player1,player2,compteur,0,minG); - minG=n1->min; - printf(" FINAL minG = %i\n",minG); - } - printf("AAAAAAAA\n"); - } - - - else if(n1->compteur != (abs(player1->PositionX - player2->PositionX) + abs(player1->PositionY - player2->PositionY))) - { - - - //1 vers le haut - n1->actualX = player2->PositionX; - n1->actualY = player2->PositionY - 1; - - if(((n1->actualX >=0) && (n1->actualX actualY >= 0) && (n1->actualY < NB_BLOCS_HAUTEUR))&& (abs(player1->PositionX - n1->actualX) <= abs(player1->PositionY - n1->actualY))) - { - - if((player2->PositionX +1 == player1->PositionX ) && (player2->PositionY == player1->PositionY )) - { - return action=5; - } - else if(getTileTypeID(arena,n1->actualX,n1->actualY) == 0) - { - //direction = HAUT; - n1->compteur = n1->compteur + 1; - n1=CalculatePath(arena,n1,player1,player2,compteur,0,minH); - minH=n1->min; - } - } - } - - else if(n1->compteur != (abs(player1->PositionX - player2->PositionX) + abs(player1->PositionY - player2->PositionY))) - { - //1 vers le bas - n1->actualX = player2->PositionX; - n1->actualY = player2->PositionY + 1; - - if(((n1->actualX >= 0) && (n1->actualX < NB_BLOCS_LARGEUR ))&& ((n1->actualY >=0) && (n1->actualY < NB_BLOCS_HAUTEUR))&& (abs(player1->PositionX - n1->actualX) >= abs(player1->PositionY - n1->actualY))) - { - if((player2->PositionX == player1->PositionX ) && (player2->PositionY +1 == player1->PositionY )) - { - return action=5; - } - else if(getTileTypeID(arena,n1->actualX,n1->actualY) == 0) - { - n1->compteur = n1->compteur + 1; - //direction = BAS; - n1=CalculatePath(arena,n1,player1,player2,compteur,0,minB); - minB=n1->min; - } - } - } - else if(n1->compteur != (abs(player1->PositionX - player2->PositionX) + abs(player1->PositionY - player2->PositionY))) - { - - //1 vers la droite - n1->actualX = player2->PositionX +1; - n1->actualY = player2->PositionY ; - - if(((n1->actualX >= 0) && (n1->actualX < NB_BLOCS_LARGEUR ))&& ((n1->actualY >= 0) && (n1->actualY < NB_BLOCS_HAUTEUR))&& (abs(player1->PositionX - n1->actualX) <= abs(player1->PositionY - n1->actualY))) - { - if(getTileTypeID(arena,n1->actualX,n1->actualY) == 0) - - { - //direction = DROITE; - n1->compteur = n1->compteur + 1; - n1=CalculatePath(arena,n1,player1,player2,compteur,0,minD); - minD=n1->min; - - } - } - - } - - - printf("minG = %i\n",minG); - printf("minH = %i\n",minH); - printf("minB = %i\n",minB); - printf("minD = %i\n",minD); - - - if(minG < minD) - { - if(minG < minH) - { - if(minG <= minB) - { - printf("ACTION GAUCHE 1\n"); - action = 4; - } - else - { - printf("ACTION BAS 1\n"); - action = 3; - } - } - else - { - if(minH < minB) - { - printf("ACTION HAUT 1\n"); - action = 1; - } - else - { - printf("ACTION BAS 2\n"); - action = 3; - } - - } - - } - - else - { - if(minD < minH) - { - if(minD < minB) - { - printf("ACTION DROITE 1\n"); - action = 2; - } - else - { - printf("ACTION BAS 3\n"); - action = 3; - } - } - else - { - if(minH < minB) - { - printf("ACTION HAUT 2\n"); - action = 1; - } - else - { - printf("ACTION BAS 4\n"); - action = 3; - } - - } - - } - - - free(n1); - return action; - - -} - - - -int distance(int x1, int y1, int x2, int y2) -{ - /* distance euclidienne */ - int distX = abs(x2-x1); - int distY = abs(y2-y1); - return distX + distY; - - /* carré de la distance euclidienne */ - /* return (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2); */ -} - - -NOEUD * CalculatePath(ARENA_H_TILE* arena,NOEUD * n1,PLAYER * player1,PLAYER * player2, int compteur, int dist,int min) -{ - int ID; - - int differenceX ; - int differenceY ; - - //Si la position désirée est dans l'arène - if(((n1->actualX -1 >= 0) && (n1->actualX -1 < NB_BLOCS_LARGEUR ))&& ((n1->actualY >= 0) && (n1->actualY < NB_BLOCS_HAUTEUR)) && (n1->actualX -1 != n1->ParentX)) - { - ID=getTileTypeID(arena,n1->actualX -1 ,n1->actualY); - differenceX = abs(n1->actualX - player1->PositionX); - differenceY = abs(n1->actualY - player1->PositionY); - - if(( ID== 0) && (n1->actualX != player1->PositionX) ) - { - //Vers la gauche - n1->ParentX = n1->actualX; - n1->ParentY = n1->actualY; - - n1->actualX = n1->actualX -1; - - n1->compteur = n1->compteur + 1; - - printf("*****111*****\n"); - - printf("Position Player1 X: %i et Y: %i\n",player1->PositionX,player1->PositionY); - printf("Position n1 player2 X: %i et Y: %i\n",n1->ParentX,n1->ParentY); - printf("Position Player2 posX: %i et posY: %i\n",n1->actualX,n1->actualY); - printf("ID de posx - 1 et posY : %i\n",ID); - - //while((posX - 1 != player1->PositionX) && (posY != player1->PositionY)) - while(((n1->actualX != player1->PositionX) || (n1->actualY != player1->PositionY)) && (abs(n1->actualX - player1->PositionX) <= differenceX) && (abs(n1->actualY - player1->PositionY) <= differenceY)) - { - - n1=CalculatePath(arena,n1,player1,player2,compteur,dist,min); - - //Post-Traitement - //Calcul du "poids" du chemin (nb de coups) - - - dist = distance(player1->PositionX,player1->PositionY,n1->actualX,n1->actualY) + n1->compteur; - - //printf("DIFFERENCE : %i\n",dist); - if(dist < n1->min) - { - printf("On rentre dans le min\n"); - n1->min=dist; - } - return n1; - } - } - - - printf("player2->PositionX : %i \n",player2->PositionX ); - printf("n1->compteur : %i \n",n1->compteur ); - printf("abs(player2->PositionX - player1->PositionY) : %i \n",abs(player2->PositionX - player1->PositionX) ); - if(n1->compteur == (abs(player2->PositionX - player1->PositionX) + abs(player2->PositionY - player1->PositionY))) - { - printf("Chemin plus court trouvé\n"); - //n1->min=n1->compteur; - printf("n1->compteur : %i \n",n1->compteur ); - printf("n1->min : %i \n",n1->min ); - return n1; - } - } - - if(((n1->actualX +1 >= 0) && (n1->actualX + 1 < NB_BLOCS_LARGEUR ))&& ((n1->actualY >= 0) && (n1->actualY < NB_BLOCS_HAUTEUR))&& (n1->actualX +1 != n1->ParentX)) - { - if((n1->actualX == player1->PositionX ) && ( n1->actualY == player1->PositionY)) - { - printf("n1->ActualX = %i et n1->actualY =%i\n",n1->actualX,n1->actualY); - printf("RETURN N1\n"); - return n1; - } - - - if((getTileTypeID(arena,n1->actualX + 1 ,n1->actualY) == 0) && (n1->actualY + 1 != n1->ParentX)) - { - n1->ParentX = n1->actualX; - n1->ParentY = n1->actualY; - n1->actualX = n1->actualX +1; - //Vers la droite - n1->compteur = n1->compteur + 1; - //compteur = compteur + 1; - - //while((posX != player1->PositionX) && (posY != player1->PositionY)) - while(((n1->actualX != player1->PositionX) || (n1->actualY != player1->PositionY)) && (abs(n1->actualX - player1->PositionX) <= differenceX) && (abs(n1->actualY - player1->PositionY) <= differenceY)) - { - - n1=CalculatePath(arena,n1,player1,player2,compteur,dist,min); - - //Post-Traitement - //Calcul du "poids" du chemin (nb de coups) - dist = distance(player1->PositionX,player1->PositionY,n1->actualX,n1->actualY) + n1->compteur; - - printf("DIST = %i\n",dist); - if(dist < n1->min) - { - n1->min=dist; - } - return n1; - } - } - - - printf("n1->compteur : %i \n",n1->compteur ); - printf("abs(player2->PositionX - player1->PositionY)-1 : %i \n",abs(player2->PositionX - player1->PositionY) ); - if(n1->compteur == (abs(player2->PositionX - player1->PositionX)+abs(player2->PositionY - player1->PositionY))) - { - printf("Chemin plus court trouvé\n"); - //n1->min=n1->compteur; - return n1; - } - } - - - if((((n1->actualX >= 0) && (n1->actualX < NB_BLOCS_LARGEUR ))&& ((n1->actualY + 1 >=0) && (n1->actualY + 1actualY +1 != n1->ParentY)) - { - //VERS LE BAS - if((n1->ParentX == player1->PositionX ) && ( n1->ParentY == player1->PositionY)) - { - printf("n1->ParentX = %i et n1->ParentY +1 =%i\n",n1->ParentX ,n1->ParentY+1); - printf("RETURN N1\n"); - return n1; - } - - - - if((getTileTypeID(arena,n1->actualX,n1->actualY + 1) == 0) && (n1->actualY + 1!= n1->ParentY) ) - { - n1->ParentX = n1->actualX; - n1->ParentY = n1->actualY; - - n1->actualY = n1->actualY +1; - - n1->compteur = n1->compteur + 1; - - //Vers la bas - n1->compteur = n1->compteur + 1; - //compteur = compteur + 1; - - //while((posX != player1->PositionX) && (posY != player1->PositionY)) - while(((n1->actualX != player1->PositionX) || (n1->actualY != player1->PositionY)) && (abs(n1->actualX - player1->PositionX) <= differenceX) && (abs(n1->actualY - player1->PositionY) <= differenceY)) - { - n1=CalculatePath(arena,n1,player1,player2,compteur,dist,min); - - //Post-Traitement - //Calcul du "poids" du chemin (nb de coups) - dist = distance(player1->PositionX,player1->PositionY,n1->actualX,n1->actualY ) + n1->compteur; - - if(dist < n1->min) - { - n1->min=dist; - } - return n1; - } - } - - printf("n1->compteur : %i \n",n1->compteur ); - printf("abs(player2->PositionX - player1->PositionY)-1 : %i \n",abs(player2->PositionX - player1->PositionY)-1 ); - if(n1->compteur == (abs(player2->PositionY - player1->PositionY)+abs(player2->PositionX - player1->PositionX))) - { - printf("Chemin plus court trouvé\n"); - //n1->min=n1->compteur; - return n1; - } - } - - - if((((n1->actualX >= 0) && (n1->actualX < NB_BLOCS_LARGEUR ))&& ((n1->actualY - 1 >= 0) && (n1->actualY - 1 < NB_BLOCS_HAUTEUR))&& (n1->actualY -1 != n1->ParentY))) - { - if((n1->ParentX == player1->PositionX ) && ( n1->ParentY == player1->PositionY)) - { - printf("n1->ParentX = %i et n1->ParentY -1 =%i\n",n1->ParentX ,n1->ParentY - 1); - printf("RETURN N1\n"); - return n1; - } - - if((getTileTypeID(arena,n1->actualX,n1->actualY -1) == 0) && (n1->actualY - 1 != n1->ParentY)) - { - n1->ParentX = n1->actualX ; - n1->ParentY = n1->actualY ; - n1->actualY = n1->actualY - 1; - //Vers la haut - n1->compteur = n1->compteur + 1; - //compteur = compteur + 1; - - //while((posX != player1->PositionX) && (posY != player1->PositionY)) - while(((n1->actualX != player1->PositionX) || (n1->actualY != player1->PositionY))&& (abs(n1->actualX - player1->PositionX) <= differenceX) && (abs(n1->actualY - player1->PositionY) <= differenceY)) - { - n1=CalculatePath(arena,n1,player1,player2,compteur,dist,min); - - //Post-Traitement - //Calcul du "poids" du chemin (nb de coups) - dist = distance(player1->PositionX,player1->PositionY,n1->actualX,n1->actualY) + n1->compteur; - - if(dist < n1->min) - { - n1->min=dist; - } - return n1; - } - } - - printf("n1->compteur : %i \n",n1->compteur ); - //printf("abs(player2->PositionX - player1->PositionY)-1 : %i \n",abs(player2->PositionX - player1->PositionY)-1 ); - - if(n1->compteur ==( abs(player2->PositionX - player1->PositionX) + abs(player2->PositionY - player1->PositionY))) - { - printf("Chemin plus court trouvé\n"); - //n1->min=n1->compteur; - return n1; - } - } - - printf("return n1\n"); - return n1; - -} - - - - - - -//Fonction de reflexion IA fonctionne mais les pierres et arbres sont bloquants -/* -int FindShortestPath(int Player1PositionX, int Player1PositionY, int Player2PositionX, int Player2PositionY) -{ - printf("Player1PositionX : %i et Player1PositionY : %i \n",Player1PositionX,Player1PositionY); - printf("Player2PositionX : %i et Player2PositionY : %i \n",Player2PositionX,Player2PositionY); - int differenceX = abs(Player1PositionX - Player2PositionX); - int differenceY = abs(Player1PositionY - Player2PositionY); - - printf("DifferenceX : %i et DifferenceY : %i \n",differenceX,differenceY); - - int action=0; - - if(((differenceX == 1) && (differenceY == 0)) || ((differenceX == 0) && (differenceY == 1))) - { - printf("Les 2 joueur sont à coté\n"); - printf("Le joueur 2 va combattre\n"); - action = 5; - return action; - } - if(((differenceX == 1) && (differenceY == 0)) || ((differenceX == 0) && (differenceY == 1))) - { - printf("Attack en cours\n"); - return action = 5; - } - - else if(differenceX > abs(Player1PositionX - (Player2PositionX - 1))) - //if(differenceX > abs(Player1PositionX - (Player2PositionX - 1))) - { - printf("Chemin plus court sur X gauche\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 droite\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; -}*/ - - +#include +#include +#include +#include "IAEngine.h" + +#define NB_BLOCS_LARGEUR 20 +#define NB_BLOCS_HAUTEUR 20 + +struct point +{ + int x,y; +}POINT; + + + +int FindPath(ARENA_H_TILE *arena,PLAYER *player1, PLAYER *player2) +{ + + int action; + + int compteur = 0; + int minH=1000,minB=1000,minG=1000,minD=1000; + int posX=0; + int posY=0; + + + + + //1 vers la gauche + NOEUD * n1 =NULL; + n1=(NOEUD*)malloc(sizeof(NOEUD)); + + posX = player2->PositionX -1; + posY = player2->PositionY ; + + n1->min=3000; + n1->compteur=0; + n1->ParentX = player2->PositionX; + n1->ParentY = player2->PositionY; + + if(((posX >= 0) && (posX < NB_BLOCS_LARGEUR ))&& ((posY >= 0) && (posY < NB_BLOCS_HAUTEUR))) + { + if(getTileTypeID(arena,posX,posY) == 0) + { + n1->compteur = n1->compteur+1; + //direction = GAUCHE; + n1=CalculatePath(arena,posX,posY,n1,player1,player2,compteur,0,minG); + minG=n1->min; + printf("minG = %i\n",minG); + } + } + + + + //1 vers le haut + posX = player2->PositionX; + posY = player2->PositionY - 1; + + if(((posX >=0) && (posX = 0) && (posY < NB_BLOCS_HAUTEUR))) + { + + if(getTileTypeID(arena,posX,posY) == 0) + { + //direction = HAUT; + + n1=CalculatePath(arena,posX,posY,n1,player1,player2,compteur,0,minH); + minH=n1->min; + + } + } + //1 vers le bas + posX = player2->PositionX; + posY = player2->PositionY + 1; + + if(((posX >= 0) && (posX < NB_BLOCS_LARGEUR ))&& ((posY >=0) && (posY < NB_BLOCS_HAUTEUR))) + { + if(getTileTypeID(arena,posX,posY) == 0) + { + //direction = BAS; + n1=CalculatePath(arena,posX,posY,n1,player1,player2,compteur,0,minB); + minB=n1->min; + + } + } + + //1 vers la droite + posX = player2->PositionX +1; + posY = player2->PositionY ; + + if(((posX >= 0) && (posX < NB_BLOCS_LARGEUR ))&& ((posY >= 0) && (posY < NB_BLOCS_HAUTEUR))) + { + if(getTileTypeID(arena,posX,posY) == 0) + + { + //direction = DROITE; + + n1=CalculatePath(arena,posX,posY,n1,player1,player2,compteur,0,minD); + minD=n1->min; + + } + } + + printf("minG = %i\n",minG); + printf("minH = %i\n",minH); + printf("minB = %i\n",minB); + printf("minD = %i\n",minD); + + + if(minG < minD) + { + if(minG < minH) + { + if(minG <= minB) + { + printf("ACTION GAUCHE 1\n"); + action = 4; + } + else + { + printf("ACTION BAS 1\n"); + action = 3; + } + } + else + { + if(minH < minB) + { + printf("ACTION HAUT 1\n"); + action = 1; + } + else + { + printf("ACTION BAS 2\n"); + action = 3; + } + + } + } + else + { + if(minD < minH) + { + if(minD < minB) + { + printf("ACTION DROITE 1\n"); + action = 2; + } + else + { + printf("ACTION BAS 3\n"); + action = 3; + } + } + else + { + if(minH < minB) + { + printf("ACTION HAUT 2\n"); + action = 1; + } + else + { + printf("ACTION BAS 4\n"); + action = 3; + } + + } + } + + free(n1); + return action; + +} + +int IAEngine(ARENA_H_TILE *arena,TILE *t_list,PLAYER *player1,PLAYER *player2) +{ + //Fonction avec seulement 2 joueurs, voir la gestion quand il y a 2 IA supplémentaire + //Player 1 est le joueur, player 2 le bot + int action; + + + + if((player1 != NULL) & (player2 !=NULL)) + { + //On récupère les positions des 2 joueurs . L'IA sait où est le joueur + + + //action = FindShortestPath(player1->PositionX,player1->PositionY,player2->PositionX,player2->PositionY); + action = FindPath(arena,player1,player2); + + //On vérifie si les 2 joueurs sont à côté pour attaquer + printf("Vérification position\n"); + /*action = FindShortestPath(player1->PositionX,player1->PositionY,player2->PositionX,player2->PositionY); + if(action == 5) + { + AttackPlayer(player2,player1); + }*/ + } + return action; +} + + +int distance(int x1, int y1, int x2, int y2) +{ + /* distance euclidienne */ + int distX = abs(x2-x1); + int distY = abs(y2-y1); + return distX + distY; + + /* carré de la distance euclidienne */ + /* return (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2); */ +} + + +NOEUD *CalculatePath(ARENA_H_TILE *arena,int posX, int posY,NOEUD *n1,PLAYER *player1,PLAYER *player2, int compteur, int dist,int min) +{ + + int ID; + + if(((posX - 1 >= 0) && (posX - 1 < NB_BLOCS_LARGEUR ))&& ((posY >= 0) && (posY < NB_BLOCS_HAUTEUR))) + { + if((n1->ParentX == player1->PositionX ) && ( n1->ParentY == player1->PositionY)) + { + printf("n1->ParentX - 1 = %i et n1->ParentY =%i\n",n1->ParentX - 1 ,n1->ParentY); + printf("RETURN N1\n"); + return n1; + } + + ID=getTileTypeID(arena,posX - 1,posY); + + if(( ID== 0) && (posX-1 != n1->ParentX)) + { + n1->ParentX = posX - 1; + //Vers la gauche + n1->compteur = n1->compteur + 1; + //compteur = compteur + 1; + printf("*****111*****\n"); + + printf("Position Player1 X: %i et Y: %i\n",player1->PositionX,player1->PositionY); + printf("Position n1 player2 X: %i et Y: %i\n",n1->ParentX,n1->ParentY); + printf("Position Player2 posX: %i et posY: %i\n",posX,posY); + printf("ID de posx - 1 et posY : %i\n",ID); + + //while((posX - 1 != player1->PositionX) && (posY != player1->PositionY)) + while((posX - 1 != player1->PositionX) || (posY != player1->PositionY)) + { + + /*printf("*****222*****\n"); + printf("Position Player1 X: %i et Y: %i\n",player1->PositionX,player1->PositionY); + printf("Position n1 player2 X: %i et Y: %i\n",n1->ParentX,n1->ParentY); + printf("Position Player2 posX: %i et posY: %i\n",posX,posY); + printf("ID de posx - 1 et posY : %i\n",ID);*/ + + n1=CalculatePath(arena,posX - 1,posY,n1,player1,player2,compteur,dist,min); + + //Post-Traitement + //Calcul du "poids" du chemin (nb de coups) + + dist = distance(player1->PositionX,player1->PositionY,posX - 1,posY) + n1->compteur; + + if(dist < n1->min) + { + printf("On rentre dans le min\n"); + n1->min=dist; + } + return n1; + } + } + } + + printf("n1->compteur : %i \n",n1->compteur ); + printf("abs(player2->PositionX - player1->PositionY)-1 : %i \n",abs(player2->PositionX - player1->PositionY)-1 ); + if(n1->compteur == abs(player2->PositionX - player1->PositionY)-1) + { + printf("Chemin plus court trouvé\n"); + n1->min=n1->compteur; + printf("n1->min : %i \n",n1->min ); + return n1; + } + + if(((posX +1 >= 0) && (posX + 1 < NB_BLOCS_LARGEUR ))&& ((posY >= 0) && (posY < NB_BLOCS_HAUTEUR))) + { + if((n1->ParentX == player1->PositionX ) && ( n1->ParentY == player1->PositionY)) + { + printf("n1->ParentX + 1 = %i et n1->ParentY =%i\n",n1->ParentX + 1 ,n1->ParentY); + printf("RETURN N1\n"); + return n1; + } + + + if((getTileTypeID(arena,posX + 1 ,posY) == 0) && (posX + 1 != n1->ParentX)) + { + n1->ParentX = posX + 1; + //Vers la droite + n1->compteur = n1->compteur + 1; + //compteur = compteur + 1; + + //while((posX != player1->PositionX) && (posY != player1->PositionY)) + while((posX != player1->PositionX) || (posY != player1->PositionY)) + { + + n1=CalculatePath(arena,posX + 1,posY,n1,player1,player2,compteur,dist,min); + + //Post-Traitement + //Calcul du "poids" du chemin (nb de coups) + dist = distance(player1->PositionX,player1->PositionY,posX + 1,posY) + n1->compteur; + + printf("DIST = %i\n",dist); + if(dist < n1->min) + { + n1->min=dist; + } + } + } + } + + printf("n1->compteur : %i \n",n1->compteur ); + printf("abs(player2->PositionX - player1->PositionY)-1 : %i \n",abs(player2->PositionX - player1->PositionY)-1 ); + if(n1->compteur == abs(player2->PositionX - player1->PositionY)-1) + { + printf("Chemin plus court trouvé\n"); + n1->min=n1->compteur; + return n1; + } + + + if(((posX >= 0) && (posX < NB_BLOCS_LARGEUR ))&& ((posY + 1 >=0) && (posY + 1ParentX == player1->PositionX ) && ( n1->ParentY == player1->PositionY)) + { + printf("n1->ParentX = %i et n1->ParentY +1 =%i\n",n1->ParentX ,n1->ParentY+1); + printf("RETURN N1\n"); + return n1; + } + + if((getTileTypeID(arena,posX,posY + 1) == 0) && (posY + 1 != n1->ParentY)) + { + n1->ParentY = posY + 1; + + //Vers la bas + n1->compteur = n1->compteur + 1; + //compteur = compteur + 1; + + //while((posX != player1->PositionX) && (posY != player1->PositionY)) + while((posX != player1->PositionX) || (posY != player1->PositionY)) + { + n1=CalculatePath(arena,posX,posY + 1,n1,player1,player2,compteur,dist,min); + + //Post-Traitement + //Calcul du "poids" du chemin (nb de coups) + dist = distance(player1->PositionX,player1->PositionY,posX,posY + 1) + n1->compteur; + + if(dist < n1->min) + { + n1->min=dist; + } + } + } + } + printf("n1->compteur : %i \n",n1->compteur ); + printf("abs(player2->PositionX - player1->PositionY)-1 : %i \n",abs(player2->PositionX - player1->PositionY)-1 ); + if(n1->compteur == abs(player2->PositionX - player1->PositionY)-1) + { + printf("Chemin plus court trouvé\n"); + n1->min=n1->compteur; + return n1; + } + + + if(((posX >= 0) && (posX < NB_BLOCS_LARGEUR ))&& ((posY - 1 >= 0) && (posY - 1 < NB_BLOCS_HAUTEUR))) + { + if((n1->ParentX == player1->PositionX ) && ( n1->ParentY == player1->PositionY)) + { + printf("n1->ParentX = %i et n1->ParentY -1 =%i\n",n1->ParentX ,n1->ParentY - 1); + printf("RETURN N1\n"); + return n1; + } + + if((getTileTypeID(arena,posX,posY-1) == 0) && (posY - 1 != n1->ParentY)) + { + n1->ParentY = posY - 1; + //Vers la haut + n1->compteur = n1->compteur + 1; + //compteur = compteur + 1; + + //while((posX != player1->PositionX) && (posY != player1->PositionY)) + while((posX != player1->PositionX) || (posY != player1->PositionY)) + { + n1=CalculatePath(arena,posX,posY - 1,n1,player1,player2,compteur,dist,min); + + //Post-Traitement + //Calcul du "poids" du chemin (nb de coups) + dist = distance(player1->PositionX,player1->PositionY,posX,posY - 1) + n1->compteur; + + if(dist < n1->min) + { + n1->min=dist; + } + } + } + } + printf("n1->compteur : %i \n",n1->compteur ); + printf("abs(player2->PositionX - player1->PositionY)-1 : %i \n",abs(player2->PositionX - player1->PositionY)-1 ); + + if(n1->compteur == abs(player2->PositionX - player1->PositionY)-1) + { + printf("Chemin plus court trouvé\n"); + n1->min=n1->compteur; + return n1; + } + + printf("return n1\n"); + return n1; +} + + + + +//Fonction de reflexion IA fonctionne mais les pierres et arbres sont bloquants + +int FindShortestPath(int Player1PositionX, int Player1PositionY, int Player2PositionX, int Player2PositionY) +{ + printf("Player1PositionX : %i et Player1PositionY : %i \n",Player1PositionX,Player1PositionY); + printf("Player2PositionX : %i et Player2PositionY : %i \n",Player2PositionX,Player2PositionY); + int differenceX = abs(Player1PositionX - Player2PositionX); + int differenceY = abs(Player1PositionY - Player2PositionY); + + printf("DifferenceX : %i et DifferenceY : %i \n",differenceX,differenceY); + + int action=0; + + /*if(((differenceX == 1) && (differenceY == 0)) || ((differenceX == 0) && (differenceY == 1))) + { + printf("Les 2 joueur sont à coté\n"); + printf("Le joueur 2 va combattre\n"); + action = 5; + return action; + }*/ + if(((differenceX == 1) && (differenceY == 0)) || ((differenceX == 0) && (differenceY == 1))) + { + printf("Attack en cours\n"); + return action = 5; + } + + else if(differenceX > abs(Player1PositionX - (Player2PositionX - 1))) + //if(differenceX > abs(Player1PositionX - (Player2PositionX - 1))) + { + printf("Chemin plus court sur X gauche\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 droite\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/src/IAEngine.h b/src/IAEngine.h index 2ce2462..7604f05 100644 --- a/src/IAEngine.h +++ b/src/IAEngine.h @@ -1,35 +1,27 @@ -/* - * IAEngine.h - * - * Created on: 17 juin 2018 - * Author: isen - */ - -#ifndef IAENGINE_H_ -#define IAENGINE_H_ - -typedef struct noeud -{ - int compteur, min, cout_f; // - - int ParentX; - int ParentY; - - int actualX; - int actualY; - // 'adresse' du parent (qui sera toujours dans la map fermée) -}NOEUD; - - -int FindShortestPath(int Player1PositionX, int Player1PositionY, int Player2PositionX, int Player2PositionY); -//int IAEngine(PLAYER * player1, PLAYER * player2); -int IAEngine(ARENA_H_TILE* arena,PLAYER * player1, PLAYER * player2); -int distance(int x1, int y1, int x2, int y2); -//int CalculatePath(ARENA_H_TILE* arena,int PositionX, int PositionY,PLAYER * player1, int compteur, int distance,int min); -//int CalculatePath(ARENA_H_TILE* arena,int posX, int posY,NOEUD * n1,PLAYER * player1, int compteur, int dist,int min); - -NOEUD * CalculatePath(ARENA_H_TILE* arena,NOEUD * n1,PLAYER * player1,PLAYER * player2, int compteur, int dist,int min); - -//NOEUD * CalculatePath(ARENA_H_TILE* arena,int posX, int posY,NOEUD * n1,PLAYER * player1,PLAYER * player2, int compteur, int dist,int min); -//NOEUD * CalculatePath(ARENA_H_TILE* arena,int posX, int posY,NOEUD * n1,PLAYER * player1, int compteur, int dist,int min); -#endif /* IAENGINE_H_ */ +#include "main.h" +#include "arenaEngine.h" +#include + +#ifndef IAENGINE_H_ +#define IAENGINE_H_ + +typedef struct noeud +{ + int compteur, min, cout_f; // + + int ParentX; + int ParentY; + // 'adresse' du parent (qui sera toujours dans la map fermée) +}NOEUD; + + +int FindShortestPath(int Player1PositionX, int Player1PositionY, int Player2PositionX, int Player2PositionY); +//int IAEngine(PLAYER * player1, PLAYER * player2); +int IAEngine(ARENA_H_TILE *arena,TILE *t_list,PLAYER *player1, PLAYER *player2); +int distance(int x1, int y1, int x2, int y2); +//int CalculatePath(ARENA_H_TILE* arena,int PositionX, int PositionY,PLAYER * player1, int compteur, int distance,int min); +//int CalculatePath(ARENA_H_TILE* arena,int posX, int posY,NOEUD * n1,PLAYER * player1, int compteur, int dist,int min); + +NOEUD *CalculatePath(ARENA_H_TILE *arena,int posX, int posY,NOEUD *n1,PLAYER *player1,PLAYER *player2, int compteur, int dist,int min); +//NOEUD * CalculatePath(ARENA_H_TILE* arena,int posX, int posY,NOEUD * n1,PLAYER * player1, int compteur, int dist,int min); +#endif /* IAENGINE_H_ */ diff --git a/src/arenaEngine.c b/src/arenaEngine.c index 951a61c..98bb892 100644 --- a/src/arenaEngine.c +++ b/src/arenaEngine.c @@ -1,7 +1,5 @@ #include #include -#include "fileHandler.h" -#include "logHelper.h" #include "arenaEngine.h" @@ -59,6 +57,7 @@ TILE *createTileList(void) { PLAYER *createPlayerList(void) { PLAYER *p0 = NULL, *p1 = NULL, *p2 = NULL, *p3 = NULL; + int race; p0 = calloc(1,sizeof(PLAYER)); p1 = calloc(1,sizeof(PLAYER)); @@ -73,15 +72,71 @@ PLAYER *createPlayerList(void) { p0->texture[LEFT] = IMG_Load("data/sprite_player_2.png"); p0->texture[RIGHT] = IMG_Load("data/sprite_player_3.png"); p0->suiv = p1; + printf("Entrer le nom du joueur\n"); + scanf("%s",p0->Name); + + do + { + printf("Race? 1:Orc 2: Elf 3:Humain \n"); + scanf("%d",&race); + } while((race < 1) || (race > 3)); + + p0->Race = race; + + switch(race) + { + //Race ORC + case 1: p0->HealthPoints = 100; + p0->AttacksPoints = 10; + break; + + //Race Elfe + case 2: p0->HealthPoints = 80; + p0->AttacksPoints = 9; + break; + + //Race Humaine + case 3: p0->HealthPoints = 90; + p0->AttacksPoints = 9; + break; + } p1->Id = 1; - p1->PositionX = A_WIDTH; - p1->PositionY = A_HEIGHT; + p1->PositionX = A_WIDTH-1; + p1->PositionY = A_HEIGHT-1; p1->texture[DOWN] = IMG_Load("data/sprite_ia_0.png"); p1->texture[UP] = IMG_Load("data/sprite_ia_1.png"); p1->texture[LEFT] = IMG_Load("data/sprite_ia_2.png"); p1->texture[RIGHT] = IMG_Load("data/sprite_ia_3.png"); p1->suiv = p2; + printf("Entrer le nom du joueur\n"); + scanf("%s",p1->Name); + + do + { + printf("Race? 1:Orc 2: Elf 3:Humain \n"); + scanf("%d",&race); + } while((race < 1) || (race > 3)); + + p1->Race = race; + + switch(race) + { + //Race ORC + case 1: p1->HealthPoints = 100; + p1->AttacksPoints = 10; + break; + + //Race Elfe + case 2: p1->HealthPoints = 80; + p1->AttacksPoints = 9; + break; + + //Race Humaine + case 3: p1->HealthPoints = 90; + p1->AttacksPoints = 9; + break; + } p2->Id = 0; p2->PositionX = 0; @@ -101,7 +156,7 @@ PLAYER *createPlayerList(void) { //p3->texture[RIGHT] = IMG_Load("data/sprite_player_3.png"); p3->suiv = NULL; - return p1; + return p0; } void clearRessourcesCache(TILE *t, PLAYER *p) { @@ -468,8 +523,14 @@ int isPlayerAdjacent(PLAYER* p1, PLAYER* p2) { } int isMoveCorrect(ARENA_H_TILE* arena, TILE *t_list, int coord_x, int coord_y, int direction) { - if (!((coord_x <= 0 && direction == LEFT) || (coord_y <= 0 && direction == UP) || (coord_x >= A_HEIGHT && direction == RIGHT) || (coord_y >= A_WIDTH && direction == DOWN))) { - if (isGroundTile(t_list,getTileTypeID(arena,coord_x,coord_y))) { + if (!((coord_x <= 0 && direction == LEFT) || (coord_y <= 0 && direction == UP) || (coord_x >= A_HEIGHT-1 && direction == RIGHT) || (coord_y >= A_WIDTH-1 && direction == DOWN))) { + if (direction==UP && isGroundTile(t_list,getTileTypeID(arena,coord_x,coord_y-1))) { + return 1; + } else if (direction==DOWN && isGroundTile(t_list,getTileTypeID(arena,coord_x,coord_y+1))) { + return 1; + } else if (direction==LEFT && isGroundTile(t_list,getTileTypeID(arena,coord_x-1,coord_y))) { + return 1; + } else if (direction==RIGHT && isGroundTile(t_list,getTileTypeID(arena,coord_x+1,coord_y))) { return 1; } } @@ -477,21 +538,176 @@ int isMoveCorrect(ARENA_H_TILE* arena, TILE *t_list, int coord_x, int coord_y, i return 0; } -int getRelativeDirection(SDL_Rect pos1, SDL_Rect pos2) { +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++; + } + Head=Head->suiv; + } while(Head != NULL); + } + + return numberAlive; +} + +int getRelativeDirection(int pos1_x, int pos1_y, int pos2_x, int pos2_y) { int _x,_y; - _x = pos2.x - pos1.x; - _y = pos2.y - pos1.y; + _x = pos2_x - pos1_x; + _y = pos2_y - pos1_y; - if (_x>1) { + if (_x>0) { return DOWN; - } else if (_x<1) { + } else if (_x<0) { return UP; - } else if (_y>1) { + } else if (_y>0) { return RIGHT; - } else if (_y<1) { + } else if (_y<0) { return LEFT; } else { return -1; } } + +void AttackPlayer(PLAYER *player1, PLAYER *player2) +{ + printf("Fonction Attaque\n"); + + + if((player1 != NULL) && (player2 != NULL)) + { + + if((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); + }*/ + } + + } +} + +void ActionPlayer(ARENA_H_TILE* arena,TILE *t_list,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 + * + * */ + SDL_Point current_pos; + + + 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 + current_pos.x = player->PositionX; + current_pos.y = player->PositionY; + + + + printf("\n**** Player %s ****\n",player->Name); + + if(action == 1) + { + printf("On veut aller vers le haut\n"); + printf("ID case[%i][%i] : %i \n",current_pos.x,current_pos.y-1,getTileTypeID(arena, current_pos.x, current_pos.y-1)); + + + + if(isMoveCorrect(arena,t_list,current_pos.x,current_pos.y,UP)) + { + player->PositionY = (current_pos.y)-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"); + printf("ID case[%i][%i] : %i \n",current_pos.x+1,current_pos.y,getTileTypeID(arena, current_pos.x+1, current_pos.y)); + + if(isMoveCorrect(arena,t_list,current_pos.x,current_pos.y,RIGHT)) + { + player->PositionX = (current_pos.x)+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"); + printf("ID case[%i][%i] : %i \n",current_pos.x,current_pos.y+1,getTileTypeID(arena, current_pos.x, current_pos.y+1)); + + if(isMoveCorrect(arena,t_list,current_pos.x,current_pos.y,DOWN)) + { + player->PositionY = (current_pos.y)+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"); + printf("ID case[%i][%i] : %i \n",current_pos.x-1,current_pos.y,getTileTypeID(arena, current_pos.x-1, current_pos.y)); + + if(isMoveCorrect(arena,t_list,current_pos.x,current_pos.y,LEFT)) + { + player->PositionX = (current_pos.x)-1; + printf("Déplacement de 1 vers la gauche\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"); + printf("ID case[%i][%i] : %i \n",current_pos.x,current_pos.y-1,getTileTypeID(arena, current_pos.x, current_pos.y-1)); + + printf("ID case[%i][%i] : %i \n",current_pos.x+1,current_pos.y,getTileTypeID(arena, current_pos.x+1, current_pos.y)); + + printf("ID case[%i][%i] : %i \n",current_pos.x,current_pos.y+1,getTileTypeID(arena, current_pos.x, current_pos.y+1)); + + printf("ID case[%i][%i] : %i \n",current_pos.x-1,current_pos.y,getTileTypeID(arena, current_pos.x-1, current_pos.y)); + + + } + } + else + { + printf("Echec, le joueur est NULL\n"); + } +} diff --git a/src/arenaEngine.h b/src/arenaEngine.h index 0b0ee2c..fa8be5f 100644 --- a/src/arenaEngine.h +++ b/src/arenaEngine.h @@ -1,6 +1,8 @@ #include "main.h" #include #include +#include "fileHandler.h" +#include "logHelper.h" #ifndef ARENAENGINE_H_ #define ARENAENGINE_H_ @@ -19,7 +21,7 @@ typedef struct Player { int Id; char Name[35]; - //char Race[20]; + int Race; SDL_Surface *texture[4]; @@ -65,6 +67,10 @@ int isGroundTile(TILE *t_list, int id); SDL_Surface *getTileSurfaceFromID(TILE *t_list, int id); int isPlayerAdjacent(PLAYER* p1, PLAYER* p2); int isMoveCorrect(ARENA_H_TILE* arena, TILE *t_list, int coord_x, int coord_y, int direction); -int getRelativeDirection(SDL_Rect pos1, SDL_Rect pos2); +int getRelativeDirection(int pos1_x, int pos1_y, int pos2_x, int pos2_y); + +int NumberPlayerAlive(PLAYER *Head); +void AttackPlayer(PLAYER *player1, PLAYER *player2); +void ActionPlayer(ARENA_H_TILE* arena,TILE *t_list,PLAYER * player, int action); #endif diff --git a/src/arenaGUI.c b/src/arenaGUI.c index db34036..ee6d60d 100644 --- a/src/arenaGUI.c +++ b/src/arenaGUI.c @@ -1,9 +1,5 @@ #include #include -#include "logHelper.h" -#include -#include -#include #include "arenaGUI.h" void displayArena(ARENA_H_TILE* arena, SDL_Window* window, TILE *tiles, int size_h, int size_w, int tile_size) { @@ -21,6 +17,162 @@ void displayArena(ARENA_H_TILE* arena, SDL_Window* window, TILE *tiles, int size } } +int updateArena(SDL_Window* window, ARENA_H_TILE* arena, TILE *tiles, PLAYER *player) { + //Ajouté + SDL_Rect position; + SDL_Rect oldposition; + SDL_Rect IAposition; + SDL_Rect oldIAposition; + + PLAYER *p1=NULL,*p2=NULL; + + p1=player; + p2=player->suiv; + + printf("Nom player 1 : %s\n",p1->Name); + printf("Nom player 2 : %s\n",p2->Name); + + printf("Nombre de joueur en vie : %i\n",NumberPlayerAlive(player)); + + int action=0,actionIA=0; + + + do { + oldposition.x = p1->PositionX * TILE_SIZE; + oldposition.y = p1->PositionY * TILE_SIZE; + oldIAposition.x = p2->PositionX * TILE_SIZE; + oldIAposition.y = p2->PositionY * TILE_SIZE; + + + //Affichage des joueurs au début de la partie + SDL_BlitSurface(p1->texture[DOWN], NULL, SDL_GetWindowSurface(window), &position); + SDL_BlitSurface(p2->texture[DOWN], NULL, SDL_GetWindowSurface(window), &IAposition); + + SDL_UpdateWindowSurface(window); + + while(action == 0) + { + action=getKeyEvent(); + } + + if(action == -1) + { + return -1; + } + else if(action == 1) + { + ActionPlayer(arena,tiles,p1,1); //Déplacement vers le haut + } + else if(action == 2) + { + ActionPlayer(arena,tiles,p1,2); //Déplacement vers la droite + } + else if(action == 3) + { + ActionPlayer(arena,tiles,p1,3); //Déplacement vers le bas + } + else if(action == 4) + { + ActionPlayer(arena,tiles,p1,4); //Déplacement vers la gauche + } + else if(action == 5) + { + //Regarder le perso en face, le plus près + AttackPlayer(p1,p2); //Voir quel player on choisit d'attaquer + } + + + //Partie ajoutée + // On place le joueur à la bonne position + position.x = p1->PositionX * TILE_SIZE; + position.y = p1->PositionY * TILE_SIZE; + //SDL_BlitSurface(actualPlayer, NULL, SDL_GetWindowSurface(window), &position); + + // Effacement de l'écran + //SDL_FillRect(SDL_GetWindowSurface(window), NULL, SDL_MapRGB(SDL_GetWindowSurface(window)->format, 255, 255, 255)); + + //SDL_BlitSurface(p1->texture[getRelativeDirection(oldposition, position)], NULL, SDL_GetWindowSurface(window), &position); + SDL_BlitSurface(p1->texture[DOWN], NULL, SDL_GetWindowSurface(window), &position); + SDL_BlitSurface(getTileSurfaceFromID(tiles,getTileTypeID(arena,oldposition.x,oldposition.y)), NULL, SDL_GetWindowSurface(window), &oldposition); + + + + //Tour de l'IA + actionIA = IAEngine(arena,tiles,p1,p2); + printf("Tour de l'IA\n"); + if(actionIA == 5) + { + AttackPlayer(p1,p2); + } + else if ((actionIA >= 1) && (actionIA <= 4)) + { + ActionPlayer(arena,tiles,p2,actionIA); + } + + IAposition.x = p2->PositionX * TILE_SIZE; + IAposition.y = p2->PositionY * TILE_SIZE; + + //SDL_BlitSurface(p2->texture[getRelativeDirection(oldIAposition, IAposition)], NULL, SDL_GetWindowSurface(window), &IAposition); + SDL_BlitSurface(p2->texture[DOWN], NULL, SDL_GetWindowSurface(window), &IAposition); + SDL_BlitSurface(getTileSurfaceFromID(tiles,getTileTypeID(arena,oldIAposition.x,oldIAposition.y)), NULL, SDL_GetWindowSurface(window), &oldIAposition); + + SDL_UpdateWindowSurface(window); + + action=0;actionIA=0; + + } while((p1->HealthPoints >0) && (NumberPlayerAlive(player) > 1)); + + printf("La partie est terminée\n"); + + if(p1->HealthPoints > 0) + { + printf("Vous avez gagné\n"); + } + else + { + printf("Vous avez perdu\n"); + } + + //Si une des IA meurt, voir comment on le gère + return -1; +} + +int getKeyEvent() +{ + 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"); + return -1; + case SDL_KEYUP: + switch(event.key.keysym.sym) //La valeur de touche + { + case SDLK_UP: + printf("FLECHE DU HAUT\n"); + return 1; + case SDLK_DOWN: + printf("FLECHE DU BAS\n"); + return 3; + case SDLK_RIGHT: + printf("FLECHE DE DROITE\n"); + return 2; + case SDLK_LEFT: + printf("FLECHE DE GAUCHE\n"); + return 4; + case SDLK_SPACE: + printf("BARRE D'ESPACE\n"); + return 5; + } + } + + return 0; +} + +/* void updatePlayerPos(ARENA_H_TILE* arena, SDL_Window* window, PLAYER *player, TILE *tiles, SDL_Rect new_coord) { SDL_Rect old_coord; @@ -32,3 +184,4 @@ void updatePlayerPos(ARENA_H_TILE* arena, SDL_Window* window, PLAYER *player, TI SDL_UpdateWindowSurface(window); } +*/ diff --git a/src/arenaGUI.h b/src/arenaGUI.h index 18603ef..8f53145 100644 --- a/src/arenaGUI.h +++ b/src/arenaGUI.h @@ -1,10 +1,18 @@ #include "main.h" #include "arenaEngine.h" +#include "logHelper.h" +#include "IAEngine.h" +#include +#include +//#include #ifndef ARENAGUI_H_ #define ARENAGUI_H_ void displayArena(ARENA_H_TILE* arena, SDL_Window* windows, TILE *tiles, int size_h, int size_w, int tile_size); -void updatePlayerPos(ARENA_H_TILE* arena, SDL_Window* window, PLAYER *player, TILE *tiles, SDL_Rect new_coord); +int updateArena(SDL_Window* window, ARENA_H_TILE* arena, TILE *tiles, PLAYER *player); +int getKeyEvent(); + +//void updatePlayerPos(ARENA_H_TILE* arena, SDL_Window* window, PLAYER *player, TILE *tiles, SDL_Rect new_coord); #endif diff --git a/src/fileHandler.c b/src/fileHandler.c index 2d71a03..55cbc25 100644 --- a/src/fileHandler.c +++ b/src/fileHandler.c @@ -18,7 +18,7 @@ PLAYER * LoadLevel(ARENA_H_TILE *Head) else { FILE* fichier = NULL; - char ligneFichier[NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1] = {0}; + char ligneFichier[A_WIDTH * A_HEIGHT + 1] = {0}; int i = 0, j = 0; //Ouverture du fichier @@ -26,13 +26,13 @@ PLAYER * LoadLevel(ARENA_H_TILE *Head) if (fichier == NULL) return 0; //Lecture du fichier - fgets(ligneFichier, NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1, fichier); + fgets(ligneFichier, A_WIDTH * A_HEIGHT + 1, fichier); - for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++) + for (i = 0 ; i < A_WIDTH ; i++) { - for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++) + for (j = 0 ; j < A_HEIGHT ; j++) { - switch (ligneFichier[(i * NB_BLOCS_LARGEUR) + j]) + switch (ligneFichier[(i * A_WIDTH) + j]) { case '0': //Herbe @@ -60,10 +60,11 @@ PLAYER * LoadLevel(ARENA_H_TILE *Head) */ //Fonction a réadapter avec la liste chainée Arene -int chargerNiveau(int niveau[][NB_BLOCS_HAUTEUR]) +/* +int chargerNiveau(int niveau[][]) { FILE* fichier = NULL; - char ligneFichier[NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1] = {0}; + char ligneFichier[A_WIDTH * A_HEIGHT + 1] = {0}; int i = 0, j = 0; printf("Chargement du fichier\n"); @@ -71,14 +72,14 @@ int chargerNiveau(int niveau[][NB_BLOCS_HAUTEUR]) if (fichier == NULL) return 0; - fgets(ligneFichier, NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1, fichier); + fgets(ligneFichier, A_WIDTH * A_HEIGHT + 1, fichier); - for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++) + for (i = 0 ; i < A_WIDTH ; i++) { - for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++) + for (j = 0 ; j < A_HEIGHT ; j++) { //printf("j= %i \n",j); - switch (ligneFichier[(i * NB_BLOCS_LARGEUR) + j]) + switch (ligneFichier[(i * A_WIDTH) + j]) { case '0': niveau[j][i] = 0; @@ -99,4 +100,5 @@ int chargerNiveau(int niveau[][NB_BLOCS_HAUTEUR]) fclose(fichier); return 1; -} \ No newline at end of file +} +*/ diff --git a/src/fileHandler.h b/src/fileHandler.h index 6d790be..2eb23d5 100644 --- a/src/fileHandler.h +++ b/src/fileHandler.h @@ -1,13 +1,8 @@ -/* - * fileHandler.h - * - * Created on: 20 juin 2018 - * Author: isen - */ +#include "main.h" #ifndef FILEHANDLER_H_ #define FILEHANDLER_H_ -int chargerNiveau(int niveau[][NB_BLOCS_HAUTEUR]); +//int chargerNiveau(int niveau[][]); #endif /* FILEHANDLER_H_ */ diff --git a/src/main.c b/src/main.c index f86cb32..9e26d47 100644 --- a/src/main.c +++ b/src/main.c @@ -11,7 +11,6 @@ #include "arenaEngine.h" #include "arenaGUI.h" #include "IAEngine.h" -#include "playerInterface.h" void initDisplayLib() { @@ -55,8 +54,15 @@ int main(int argc, char *argv[]) { addLogInfo("Display arena GUI..."); displayArena(arena, gameWindows, tile_ressources, A_HEIGHT, A_WIDTH, TILE_SIZE); + int continuer = 1; + int action; - SDL_Delay(3000); + while (continuer) { + action = updateArena(gameWindows,arena,tile_ressources,player_ressources); + + if (action == -1) continuer = 0; + } + SDL_DestroyWindow(gameWindows); deleteArena(arena); addLogInfo("Cleared arena."); @@ -69,225 +75,3 @@ int main(int argc, char *argv[]) { SDL_Quit(); return EXIT_SUCCESS; } - - -/* - * main.c - * - * Created on: 17 juin 2018 - * Author: isen - */ - -//#include "IAEngine.h" -#include "playerInterface.h" -#include "fileHandler.h" -#include "arenaEngine.h" - -#include "SDL2/SDL.h" -#include "SDL2/SDL_image.h" -#include -#include - -#define BLOC_SIZE 32 // Taille d'un bloc (carré) en pixels -#define NB_BLOCS_LARGEUR 20 -#define NB_BLOCS_HAUTEUR 20 -#define LARGEUR_FENETRE BLOC_SIZE * NB_BLOCS_LARGEUR -#define HAUTEUR_FENETRE BLOC_SIZE * NB_BLOCS_HAUTEUR - -enum {HAUT, BAS, GAUCHE, DROITE}; -enum {GRASS, ROCK, TREE,FIRSTPLAYER, IA1}; //Définit quel type de case il s'agit - -int main(void) -{ - - SDL_Init(SDL_INIT_VIDEO); - - if (SDL_Init(SDL_INIT_VIDEO) != 0 ) - { - fprintf(stdout,"Échec de l'initialisation de la SDL (%s)\n",SDL_GetError()); - return -1; - } - else - { - int continuer = 1; - int action; - - ARENA_H_TILE* arena = NULL; //Déclaration de l'arène - - SDL_Surface *player[4] = {NULL}; // 4 surfaces pour 4 directions de mario - SDL_Surface *IA1[4] = {NULL}; // 4 surfaces pour 4 directions de mario - SDL_Surface *grass = NULL; - SDL_Surface *rock = NULL, *tree = NULL, *river = NULL,*actualPlayer = NULL, *actualIA1 = NULL; - SDL_Rect position, positionJoueur; - - - - - int i = 0, j = 0; - int carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0}; - - //SDL_WM_SetIcon(IMG_Load("adventurer_resize.png"),NULL); //Définit l'icone de la fenêtre - - // Création de la fenêtre - SDL_Window* pWindow = NULL; - pWindow = SDL_CreateWindow("Arena Survival Tournament",SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,LARGEUR_FENETRE,HAUTEUR_FENETRE,SDL_WINDOW_SHOWN); - - //Génération de la nouvelle arène à partir du fichier - arena = genNewArena(NB_BLOCS_HAUTEUR, NB_BLOCS_LARGEUR); - - if (arena == NULL) - { - printf("Erreur de la génération de l'arène\n"); - } - // Chargement des sprites (décors, personnage...) - grass = IMG_Load("Landscape/grass_green_32x32.png"); - rock = IMG_Load("Landscape/stone_green_32x32.png"); - tree = IMG_Load("Landscape/tree_green_32x32.png"); - river = IMG_Load("Landscape/river_green_32x32.png"); - - player[BAS] = IMG_Load("Adventurer/adventurer1_32x32.png"); - player[HAUT] = IMG_Load("Adventurer/adventurer_back_32x32.png"); - player[DROITE] = IMG_Load("Adventurer/adventurer1_right_32x32.png"); - player[GAUCHE] = IMG_Load("Adventurer/adventurer1_left_32x32.png"); - - IA1[BAS] = IMG_Load("IA1/adventurer2_32x32.png"); - IA1[HAUT] = IMG_Load("IA1/adventurer2_back_32x32.png"); - IA1[DROITE] = IMG_Load("IA1/adventurer2_right_32x32.png"); - IA1[GAUCHE] = IMG_Load("IA1/adventurer2_left_32x32.png"); - - actualPlayer = player[BAS]; - actualIA1 = IA1[BAS]; - - SDL_Surface* Sprites[5]= {grass,rock,tree,actualPlayer,actualIA1}; - - // Chargement du niveau pour le tableau (Phase de test) - /*if (!chargerNiveau(carte)) - { - printf("Niveau non chargé\n");// On arrête le jeu si on n'a pas pu charger le niveau - }*/ - - /* - //Cette fonction peut être utile pour rechercher un joueur ( Pour la detection) - // Recherche de la position de Mario au départ - for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++) - { - for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++) - { - if (carte[i][j] == MARIO) // Si Mario se trouve à cette position - { - positionJoueur.x = i; - positionJoueur.y = j; - carte[i][j] = VIDE; - } - } - } - */ - - // Placement des objets à l'écran à la création de l'arène - drawArena(pWindow,arena,Sprites); - - - SDL_Event event; // Cette variable servira plus tard à gérer les événements - - if( pWindow ) - { - SDL_UpdateWindowSurface(pWindow); //Rafaichis la fenetre - - //SDL_Delay(3000); /* Attendre trois secondes, que l'utilisateur voie la fenêtre */ - while (continuer) - { - - - action = PlayerInterface(pWindow,arena,Sprites); - - if (action == -1) - { - continuer = 0; - } - else - { - - } - - - } - //SDL_DestroyWindow(pWindow); - } - else - { - fprintf(stderr,"Erreur de création de la fenêtre: %s\n",SDL_GetError()); - } - } - - //IAEngine(); - - SDL_Quit(); - //PlayerInterface(); - - return 0; -} - - -int drawArena(SDL_Window* pWindow,ARENA_H_TILE* arena,SDL_Surface **Sprites) -{ - SDL_Rect position; - int ID; - for (int i = 0 ; i < NB_BLOCS_LARGEUR ; i++) - { - for (int j = 0 ; j < NB_BLOCS_HAUTEUR ; j++) - { - position.x = i * BLOC_SIZE; - position.y = j * BLOC_SIZE; - - ID = getTileTypeID( arena, i, j); - switch(ID) - { - case GRASS: - SDL_BlitSurface(Sprites[GRASS], NULL, SDL_GetWindowSurface(pWindow), &position); - - break; - case ROCK: - SDL_BlitSurface(Sprites[ROCK], NULL, SDL_GetWindowSurface(pWindow), &position); - break; - case TREE: - SDL_BlitSurface(Sprites[TREE], NULL, SDL_GetWindowSurface(pWindow), &position); - break; - - } - } - } -} - - -/*//Fonction draw avec un tableau. A servi de test pour le graphique -int drawArena(SDL_Window* pWindow,int carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR],SDL_Surface **Sprites) -{ - SDL_Rect position; - for (int i = 0 ; i < NB_BLOCS_LARGEUR ; i++) - { - for (int j = 0 ; j < NB_BLOCS_HAUTEUR ; j++) - { - position.x = i * BLOC_SIZE; - position.y = j * BLOC_SIZE; - - - switch(carte[i][j]) - { - case GRASS: - SDL_BlitSurface(Sprites[GRASS], NULL, SDL_GetWindowSurface(pWindow), &position); - - break; - case ROCK: - SDL_BlitSurface(Sprites[ROCK], NULL, SDL_GetWindowSurface(pWindow), &position); - break; - case TREE: - SDL_BlitSurface(Sprites[TREE], NULL, SDL_GetWindowSurface(pWindow), &position); - break; - - } - } - } -} -*/ - - diff --git a/src/menuGUI.h~HEAD b/src/menuGUI.h~HEAD deleted file mode 100644 index cf4bccb..0000000 --- a/src/menuGUI.h~HEAD +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef MENUGUI_H_ -#define MENUGUI_H_ - - - -#endif diff --git a/src/menuGUI.h~arena b/src/menuGUI.h~arena deleted file mode 100644 index 2ac4eaa..0000000 --- a/src/menuGUI.h~arena +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef MENUGUI_H_ -#define MENUGUI_H_ - - - -#endif diff --git a/src/playerInterface.c b/src/playerInterface.c deleted file mode 100644 index 9b666c7..0000000 --- a/src/playerInterface.c +++ /dev/null @@ -1,626 +0,0 @@ -#include "playerInterface.h" -//#include "arenaEngine.h" - -#include "SDL2/SDL.h" -#include -#include - - -enum {GRASS, ROCK, TREE,FIRSTPLAYER, IA1}; -#define BLOC_SIZE 32 // Taille d'un bloc (carré) en pixels -#define NB_BLOCS_LARGEUR 20 -#define NB_BLOCS_HAUTEUR 20 -#define LARGEUR_FENETRE BLOC_SIZE * NB_BLOCS_LARGEUR -#define HAUTEUR_FENETRE BLOC_SIZE * NB_BLOCS_HAUTEUR - - -int PlayerInterface(SDL_Window* pWindow,ARENA_H_TILE* arena,SDL_Surface **Sprites) -{ - - //Ajouté - SDL_Rect position; - SDL_Rect oldposition; - SDL_Rect IAposition; - SDL_Rect oldIAposition; - - - 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\n",numberAlive); - - int action=0; - - - do - { - - oldposition.x = player1->PositionX * BLOC_SIZE; - oldposition.y = player1->PositionY * BLOC_SIZE; - oldIAposition.x = player2->PositionX * BLOC_SIZE; - oldIAposition.y = player2->PositionY * BLOC_SIZE; - - //Affichage des joueurs au début de la partie - SDL_BlitSurface(Sprites[FIRSTPLAYER], NULL, SDL_GetWindowSurface(pWindow), &oldposition); - SDL_BlitSurface(Sprites[IA1], NULL, SDL_GetWindowSurface(pWindow), &oldIAposition); - - SDL_UpdateWindowSurface(pWindow); - - while(action == 0) - { - action=getEvent(); - } - - if(action == -1) - { - return -1; - } - else if(action == 1) - { - ActionPlayer(arena,player1,1); //Déplacement vers le haut - } - else if(action == 2) - { - ActionPlayer(arena,player1,2); //Déplacement vers la droite - } - else if(action == 3) - { - ActionPlayer(arena,player1,3); //Déplacement vers le bas - } - else if(action == 4) - { - ActionPlayer(arena,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 - } - - - //Partie ajoutée - // On place le joueur à la bonne position - position.x = player1->PositionX * BLOC_SIZE; - position.y = player1->PositionY * BLOC_SIZE; - //SDL_BlitSurface(actualPlayer, NULL, SDL_GetWindowSurface(pWindow), &position); - - // Effacement de l'écran - //SDL_FillRect(SDL_GetWindowSurface(pWindow), NULL, SDL_MapRGB(SDL_GetWindowSurface(pWindow)->format, 255, 255, 255)); - - SDL_BlitSurface(Sprites[FIRSTPLAYER], NULL, SDL_GetWindowSurface(pWindow), &position); - SDL_BlitSurface(Sprites[GRASS], NULL, SDL_GetWindowSurface(pWindow), &oldposition); - - - - //Tour de l'IA - IAEngine(arena,player1,player2); - - IAposition.x = player2->PositionX * BLOC_SIZE; - IAposition.y = player2->PositionY * BLOC_SIZE; - - SDL_BlitSurface(Sprites[IA1], NULL, SDL_GetWindowSurface(pWindow), &IAposition); - SDL_BlitSurface(Sprites[GRASS], NULL, SDL_GetWindowSurface(pWindow), &oldIAposition); - - SDL_UpdateWindowSurface(pWindow); - - action=0; - - } - - while((player1->HealthPoints >0) && (NumberPlayerAlive(List) > 1)); - - printf("La partie est terminée\n"); - - if(player1->HealthPoints > 0) - { - printf("Vous avez gagné\n"); - } - else - { - printf("Vous avez perdu\n"); - } - - //Si une des IA meurt, voir comment on le gère - return -1; -} - - -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; - return -1; - case SDL_KEYUP: - switch(event.key.keysym.sym) //La valeur de touche - { - case SDLK_UP: printf("FLECHE DU HAUT\n"); - return 1; - - case SDLK_DOWN: printf("FLECHE DU BAS\n"); - return 3; - - case SDLK_RIGHT:printf("FLECHE DE DROITE\n"); - return 2; - - case SDLK_LEFT: printf("FLECHE DE GAUCHE\n"); - return 4; - - case SDLK_SPACE:printf("BARRE D'ESPACE\n"); - return 5; - } - break; - } - - - - return 0; -} - - -/**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 - - int race; - player=(PLAYER*)malloc(sizeof(PLAYER)); - if(player==NULL) - { - printf("ERREUR Allocation joueur "); - } - - printf("Entrer le nom du joueur\n"); - scanf("%s",player->Name); - - do - { - printf("Race? 1:Orc 2: Elf 3:Humain \n"); - scanf("%d",&race); - } - while((race < 1) || (race > 3)); - - player->Race = race; - - switch(race) - { - //Race ORC - case 1: player->HealthPoints = 100; - player->AttacksPoints = 10; - break; - - //Race Elfe - case 2: player->HealthPoints = 80; - player->AttacksPoints = 9; - break; - - //Race Humaine - case 3: player->HealthPoints = 90; - player->AttacksPoints = 9; - break; - } - - player->Id = Id; - //player->AttacksPoints = 10; - - if(Id == 1) - { - player->PositionX=0; - player->PositionY=0; - } - else if(Id ==2) - { - player->PositionX=ARENAMAX - 1; - //player->PositionX=5; - player->PositionY=0; - } - else if(Id ==3) - { - player->PositionX=0; - player->PositionY=ARENAMAX - 1; - } - else - { - player->PositionX=ARENAMAX - 1; - player->PositionY=ARENAMAX - 1; - } - - 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)) - { - - if((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); - }*/ - } - - } -} - - -void ActionPlayer(ARENA_H_TILE* arena,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 - * - * */ - int ID; - - - 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 ****\n",player->Name); - - if(action == 1) - { - printf("On veut aller vers le haut\n"); - ID = getTileTypeID(arena, positionX, positionY -1); - printf("ID case[%i][%i] : %i \n",positionX,positionY-1,ID); - - if((positionY-1 >= 0) && (ID == 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"); - ID = getTileTypeID(arena, positionX + 1, positionY); - printf("ID case[%i][%i] : %i \n",positionX+1,positionY,ID); - - if((positionX + 1 < ARENAMAX) && (ID == 0)) - { - 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"); - ID = getTileTypeID(arena, positionX, positionY + 1); - printf("ID case[%i][%i] : %i \n",positionX,positionY+1,ID); - - if((positionY + 1 < ARENAMAX) && (ID == 0)) - { - 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"); - ID = getTileTypeID(arena, positionX - 1, positionY); - printf("ID case[%i][%i] : %i \n",positionX-1,positionY,ID); - - if((positionX - 1 >= 0) && (ID == 0)) - { - player->PositionX = positionX - 1; - printf("Déplacement de 1 vers la gauche\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"); - ID = getTileTypeID(arena, positionX, positionY -1); - printf("ID case[%i][%i] : %i \n",positionX,positionY-1,ID); - - ID = getTileTypeID(arena, positionX + 1, positionY); - printf("ID case[%i][%i] : %i \n",positionX+1,positionY,ID); - - ID = getTileTypeID(arena, positionX, positionY + 1); - printf("ID case[%i][%i] : %i \n",positionX+1,positionY,ID); - - ID = getTileTypeID(arena, positionX - 1, positionY); - printf("ID case[%i][%i] : %i \n",positionX-1,positionY,ID); - - - } - } - else - { - printf("Echec, le joueur est NULL\n"); - } -} - - -/* -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 ****\n",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 la gauche\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/src/playerInterface.h b/src/playerInterface.h deleted file mode 100644 index 61476d6..0000000 --- a/src/playerInterface.h +++ /dev/null @@ -1,49 +0,0 @@ -#include -#include "arenaEngine.h" -#include "IAEngine.h" - -#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 Race; - - 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); -void ActionPlayer(ARENA_H_TILE* arena,PLAYER * player, int action); - -int NumberPlayerAlive(PLAYER *Head); -int getEvent(void); - -#endif /* PLAYERINTERFACE_H_ */