diff --git a/grid.c b/grid.c index 4ed17b998b0c49720bd652bb01f7d94f53845758..e1a4b5eaf00c166cf0b9cd2c0c030c5d5af9d599 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 649addda12948965abd5fe319fcd49b785919b66..86b14c4e7a645c55ccf3aec9812e9c98e4baa845 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