From f3283b817e599ae31fd7c760a4b8b900f9907b42 Mon Sep 17 00:00:00 2001
From: Efe ERKEN <efe.erken@etu.unistra.fr>
Date: Tue, 8 Nov 2022 01:09:19 +0100
Subject: [PATCH] :sparkles: NEW: Completed init_level() function

Filled blanks in file grid.c to add function which parses level file.
---
 grid.c | 106 +++++++++++++++++++++++++++++++++++++++++----------------
 grid.h |  35 ++++++++++++-------
 2 files changed, 99 insertions(+), 42 deletions(-)

diff --git a/grid.c b/grid.c
index 4ed17b9..e1a4b5e 100644
--- a/grid.c
+++ b/grid.c
@@ -1,33 +1,81 @@
-#include "grid.h"
 #include <stdlib.h>
 #include <stdio.h>
+#include "grid.h"
+
+grid *creer_grid(int row, int column)
+{
+    grid *G = (grid *)malloc(sizeof(grid));
+    if (G == NULL)
+    {
+        fprintf(stderr, "Error G structure alloc failed");
+        exit(-1);
+    }
+    G->game_grid = (enum CaseType **)(malloc(row * (sizeof(enum CaseType *))));
+    if (G->game_grid == NULL)
+    {
+        fprintf(stderr, "Error game_grid row alloc failed");
+        exit(-1);
+    }
+    for (int i = 0; i < row; i++)
+    {
+        G->game_grid[i] = (enum CaseType *)(malloc(column * (sizeof(enum CaseType))));
+        if (G->game_grid[i] == NULL)
+        {
+            fprintf(stderr, "Error game_grid column alloc failed");
+            exit(-1);
+        }
+    }
+    G->row_number = row;
+    G->column_number = column;
+    return G;
+}
+
+void free_grid(grid *G)
+{
+    for (int i = 0; i < G->row_number; i++)
+    {
+        free(G->game_grid[i]);
+    }
+    free(G->game_grid);
+    free(G);
+}
+
+grid *init_level(const char *file_path)
+{
+    // ouverture du fichier en mode lecture
+    FILE *file = fopen(file_path, "r");
+    if (!file)
+    {
+        fprintf(stderr, "Error %s not found", file_path);
+        exit(-1);
+    }
+    char line[100] = {0};
+    int number_column = 0; // nombre de colonne
+    int number_row = 0;    /// nombre de ligne
+    int number_goals = 0;
+    // on lit la première ligne du fichier
+    fgets(line, 100, file);
+    sscanf(line, "%d %d %d", &number_column, &number_row, &number_goals);
+
+    grid *level = creer_grid(number_row, number_column);
+
+    int current_row = 0;
+    int current_goal = 0;
+    // On lit le fichier ligne par ligne jusqu'à la fin du fichier
+    while (fgets(line, 100, file) != NULL)
+    {
+        char *buffer = line;
+        int current_column = 0;
+        while (*buffer && *buffer != '\n')
+        {
+            level->game_grid[current_row][current_column] = *buffer;
 
-void init_level(const char* file_path){
-	// ouverture du fichier en mode lecture
-	FILE* file = fopen(file_path, "r");
-	if(!file){
-		fprintf(stderr, "Error %s not found", file_path);
-		exit(-1);
-	}
-	char line[100] = {0};
-	int number_column = 0; // nombre de colonne
-	int number_row = 0; /// nombre de ligne
-	int number_goals = 0;
-	// on lit la première ligne du fichier
-	fgets(line, 100, file);
-	sscanf(line, "%d %d %d", &number_column, &number_row, &number_goals);
-	int current_row = 0;
-	int current_goal = 0;
-	// On lit le fichier ligne par ligne jusqu'à la fin du fichier
-	while(fgets(line, 100, file) != NULL){
-		char* buffer = line;
-		int current_column = 0;
-		while(*buffer && *buffer != '\n'){
-			current_column += 1;
-			buffer += 1;
-		}		
-		current_row += 1;
-	}
-	// fermeture du fichier
-	fclose(file);
+            current_column += 1;
+            buffer += 1;
+        }
+        current_row += 1;
+    }
+    // fermeture du fichier
+    fclose(file);
+    return level;
 }
diff --git a/grid.h b/grid.h
index 649addd..86b14c4 100644
--- a/grid.h
+++ b/grid.h
@@ -1,22 +1,31 @@
 #ifndef GRID_HEADER
 #define GRID_HEADER
-enum CaseType{
-	WALL = '#',
-	BOX = '$',
-	PLAYER = '@',
-	GOAL = '.',
-	NONE = ' '
+
+enum CaseType
+{
+    WALL = '#',
+    BOX = '$',
+    PLAYER = '@',
+    GOAL = '.',
+    NONE = ' '
 };
+
 /**
  * @struct Grid grid.h
- * @brief Cette structure contient les informations 
+ * @brief Cette structure contient les informations
  * concernant la grille du jeu et son contenu
  */
-struct Grid{
-	enum CaseType** game_grid; ///< Tableau contenant les entités présents dans le jeu
-	int column_number; ///< Nombre de colonne de game_grid
-	int row_number; ///< Nomber de ligne de game_grid
-};
-void init_level(const char* file_path);
+typedef struct Grid
+{
+    enum CaseType **game_grid; ///< Tableau contenant les entités présents dans le jeu
+    int column_number;         ///< Nombre de colonne de game_grid
+    int row_number;            ///< Nomber de ligne de game_grid
+} grid;
+
+grid *init_level(const char *file_path);
+
+grid *creer_grid(int row, int column);
+
+void free_grid(grid *G);
 
 #endif
-- 
GitLab