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