From 0e08094bf9c5e84efb2fccba55699187fcae01df Mon Sep 17 00:00:00 2001 From: belkhiritaha <belkhiri.taha53@gmail.com> Date: Thu, 30 Jun 2022 11:55:55 +0200 Subject: [PATCH] integrated ennemy movement --- .../jeu_appren_par_renfo/src/ball.h | 6 ++- .../jeu_appren_par_renfo/src/ennemy.c | 44 ++++++++++++++++++- .../jeu_appren_par_renfo/src/ennemy.h | 1 + .../jeu_appren_par_renfo/src/main.c | 6 ++- .../jeu_appren_par_renfo/src/main.h | 1 + .../jeu_appren_par_renfo/src/player.c | 2 +- .../jeu_appren_par_renfo/src/qlearn.c | 17 +++++++ .../jeu_appren_par_renfo/src/qlearn.h | 3 +- .../jeu_appren_par_renfo/src/render.c | 2 + 9 files changed, 76 insertions(+), 6 deletions(-) diff --git a/travail_de_groupe/jeu_appren_par_renfo/src/ball.h b/travail_de_groupe/jeu_appren_par_renfo/src/ball.h index bf59edc..fb82d4c 100644 --- a/travail_de_groupe/jeu_appren_par_renfo/src/ball.h +++ b/travail_de_groupe/jeu_appren_par_renfo/src/ball.h @@ -13,6 +13,9 @@ #define NUMBERPOINT_TRAJEC 50 +#define PLAYER 0 +#define AI 1 + typedef enum { false, true @@ -29,6 +32,7 @@ typedef struct ball int isHit; float angle; int speed; + int isTravelingTo; } ball_t; extern ball_t ball; @@ -45,7 +49,7 @@ float defineAngle(int, int, int, int); void updateBall(); point_t initCanon (point_t canon); point_t initDropPoint (point_t dropPoint); -float defineAngleF(int, int, int, int); +float defineAngleF(int canonX, int canonY, int xDropPoint, int yDropPoint); float defineAngleH(int xCanon, int xDropPoint); float lagrangeInterpolation(float, int, int, int, int, int, int); diff --git a/travail_de_groupe/jeu_appren_par_renfo/src/ennemy.c b/travail_de_groupe/jeu_appren_par_renfo/src/ennemy.c index 512cbc0..a44030c 100644 --- a/travail_de_groupe/jeu_appren_par_renfo/src/ennemy.c +++ b/travail_de_groupe/jeu_appren_par_renfo/src/ennemy.c @@ -1,5 +1,11 @@ #include "player.h" +int angleF; +int angleH; +int ennemyZone; +int canonZone; +int action; + void initEnnemy() { ennemy.h = 2 * BLOCK_SIZE; @@ -7,9 +13,43 @@ void initEnnemy() ennemy.x = 25 * BLOCK_SIZE; ennemy.y = 5 * BLOCK_SIZE; ennemy.angle = -pi; + ennemy.speed = MOVEMENT_SPEED; } -void manageEnnemy() +void manageEnnemyMovement() { - + if (ball.isTravelingTo == AI){ + angleF = defineAngleF(lastHitPoint[0], lastHitPoint[1], landingPoint[0], landingPoint[1]); + angleF = converterIntoAngleF(angleF); + angleH = defineAngleH(lastHitPoint[0], landingPoint[0]); + angleH = converterIntoAngleH(angleH); + ennemyZone = convertIntoZone(ennemy.x, ennemy.y); + canonZone = convertIntoZone(lastHitPoint[0], lastHitPoint[1]); + action = takeAction(ennemy.x, ennemy.y, Q, canonZone, angleH, angleF, 0); + switch (action) + { + case BACK: + ennemy.x += MOVEMENT_SPEED; + break; + + case FOWARD: + ennemy.x -= MOVEMENT_SPEED; + break; + + case UP: + ennemy.y -= MOVEMENT_SPEED; + break; + + case DOWN: + ennemy.y += MOVEMENT_SPEED; + break; + + default: + break; + } + } +} + +void manageEnnemy(){ + manageEnnemyMovement(); } \ No newline at end of file diff --git a/travail_de_groupe/jeu_appren_par_renfo/src/ennemy.h b/travail_de_groupe/jeu_appren_par_renfo/src/ennemy.h index f97c460..660453b 100644 --- a/travail_de_groupe/jeu_appren_par_renfo/src/ennemy.h +++ b/travail_de_groupe/jeu_appren_par_renfo/src/ennemy.h @@ -5,6 +5,7 @@ #include "map.h" #include "render.h" #include "ball.h" +#include "qlearn.h" diff --git a/travail_de_groupe/jeu_appren_par_renfo/src/main.c b/travail_de_groupe/jeu_appren_par_renfo/src/main.c index 56b9328..9d3ea37 100644 --- a/travail_de_groupe/jeu_appren_par_renfo/src/main.c +++ b/travail_de_groupe/jeu_appren_par_renfo/src/main.c @@ -2,9 +2,11 @@ int running; int game_state; - +float ***** Q; int main() { + Q = allocateAndInitiateQ(); + readQFromFile(Q); running = 1; game_state = GAME; readMapFromFile("map.txt"); @@ -14,5 +16,7 @@ int main() initKeys(); initBall(); + + mainLoop(); } diff --git a/travail_de_groupe/jeu_appren_par_renfo/src/main.h b/travail_de_groupe/jeu_appren_par_renfo/src/main.h index 98ff609..3edf7a0 100644 --- a/travail_de_groupe/jeu_appren_par_renfo/src/main.h +++ b/travail_de_groupe/jeu_appren_par_renfo/src/main.h @@ -25,5 +25,6 @@ extern int running; extern int game_state; +extern float ***** Q; #endif \ No newline at end of file diff --git a/travail_de_groupe/jeu_appren_par_renfo/src/player.c b/travail_de_groupe/jeu_appren_par_renfo/src/player.c index ee06127..38c4aae 100644 --- a/travail_de_groupe/jeu_appren_par_renfo/src/player.c +++ b/travail_de_groupe/jeu_appren_par_renfo/src/player.c @@ -94,6 +94,7 @@ void hitBall() ball.speed = 2 * HIT_FORCE; ball.z = player.h; ball.isHit = 1; + ball.isTravelingTo = AI; } } } @@ -125,5 +126,4 @@ void managePlayer() { manageMovement(); hitBall(); - updateBall(); } \ No newline at end of file diff --git a/travail_de_groupe/jeu_appren_par_renfo/src/qlearn.c b/travail_de_groupe/jeu_appren_par_renfo/src/qlearn.c index 0830c3b..39eed25 100644 --- a/travail_de_groupe/jeu_appren_par_renfo/src/qlearn.c +++ b/travail_de_groupe/jeu_appren_par_renfo/src/qlearn.c @@ -110,6 +110,23 @@ void writeQ(float *****Q){ fclose(fp); } +void readQFromFile(float *****Q){ + int i, j, k, l, m ; + FILE * fp = fopen("q.txt", "r"); + for(i = 0; i < NUMBER_ZONE_RECEIVER; i++){ + for(j = 0; j < NUMBER_ZONE_SHOOTER; j++){ + for(k = 0; k < 3; k++){ + for(l= 0; l < 5; l++){ + for(m= 0; m <5; m++){ + fscanf(fp, "%f ", &Q[i][j][k][l][m]); + } + } + } + } + } + fclose(fp); +} + int argmax(float * arr){ int i; diff --git a/travail_de_groupe/jeu_appren_par_renfo/src/qlearn.h b/travail_de_groupe/jeu_appren_par_renfo/src/qlearn.h index 60fe308..0de0a45 100644 --- a/travail_de_groupe/jeu_appren_par_renfo/src/qlearn.h +++ b/travail_de_groupe/jeu_appren_par_renfo/src/qlearn.h @@ -63,7 +63,7 @@ int convertIntoZone(int ,int y); int convertIntoZoneCanon(int xCanon,int yCanon); int converterIntoAngleF(float); int converterIntoAngleH(float); -int takeAction(int ,int , float ***** , int , int, int, float ); +int takeAction(int xAgent, int yAgent, float ***** Q, int canonZone, int angleHZone, int angleFZone, float eps); int setReward(int , int , int ); stack_t* initStack (int nbelt); int emptyStack (stack_t *stack); @@ -72,4 +72,5 @@ void actionStack(stack_t *stack, line_t line); line_t unStack(stack_t *stack); void freeStack(stack_t *stack); void traningAgent( int numberRun, int numberStep, float *****Q); +void readQFromFile(float *****Q); #endif \ No newline at end of file diff --git a/travail_de_groupe/jeu_appren_par_renfo/src/render.c b/travail_de_groupe/jeu_appren_par_renfo/src/render.c index 82133de..02e079b 100644 --- a/travail_de_groupe/jeu_appren_par_renfo/src/render.c +++ b/travail_de_groupe/jeu_appren_par_renfo/src/render.c @@ -1064,6 +1064,8 @@ void mainLoop() case GAME: drawGame(); managePlayer(); + manageEnnemy(); + updateBall(); break; } } -- GitLab