From fa7d5ce51aee12c11ed05c6b027cff03d0834e49 Mon Sep 17 00:00:00 2001 From: Aubin DORIVAL Date: Sat, 14 Dec 2024 15:26:00 +0100 Subject: [PATCH] encore meilleur --- display.c | 162 +++++++-------- function.c | 592 +++++++++++++++++++++++++++-------------------------- function.h | 20 +- main.c | 50 ++--- read.c | 82 ++++---- 5 files changed, 456 insertions(+), 450 deletions(-) diff --git a/display.c b/display.c index 8b7bf54..c077ea5 100644 --- a/display.c +++ b/display.c @@ -10,108 +10,110 @@ void screenDisplay (unsigned short int **tab, int size) { - // puts("0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 "); - char element[7] = { ' ', '#', 'S', '.', '*', '@', '+' }; - for (int i = 0; i < size; ++i) - { - for (int j = 0; j < size; ++j) + // puts("0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 "); + char element[7] = { ' ', '#', 'S', '.', '*', '@', '+' }; + for (int i = 0; i < size; ++i) { - printf ("%c ", element[tab[i][j]]); + for (int j = 0; j < size; ++j) + { + printf ("%c ", element[tab[i][j]]); + } + puts (""); } - puts (""); - } } void screenDisplaySDL (unsigned short int **tab, dis *display_user) { - int size = display_user->size_window / display_user->size_box; - int i, j; + int size = display_user->size_window / display_user->size_box; + int i, j; - for (i = 0; i < display_user->size_box; ++i) - { - for (j = 0; j < display_user->size_box; ++j) + for (i = 0; i < display_user->size_box; ++i) { - SDL_Surface *img; - SDL_Texture *texture; - vect pos = { i * size, j * size }; - switch (tab[j][i]) - { - case EMPTY: - img = IMG_Load ("empty.png"); - break; - case WALL: - img = IMG_Load ("wall.png"); - break; - case PLAYER: - img = IMG_Load ("player.png"); - break; - case TARGET: - img = IMG_Load ("target.png"); - break; - case BOX: - img = IMG_Load ("box.png"); - break; - case BOX_ON_TARGET: - img = IMG_Load ("box_on_target.png"); - break; - case PLAYER_ON_TARGET: - img = IMG_Load ("player_on_target.png"); - break; - } - texture = SDL_CreateTextureFromSurface (display_user->renderer, img); - displayImage (display_user->renderer, texture, pos, size); - SDL_FreeSurface (img); - SDL_DestroyTexture (texture); + for (j = 0; j < display_user->size_box; ++j) + { + SDL_Surface *img; + SDL_Texture *texture; + vect pos = { i * size, j * size }; + switch (tab[j][i]) + { + case EMPTY: + img = IMG_Load ("empty.png"); + break; + case WALL: + img = IMG_Load ("wall.png"); + break; + case PLAYER: + img = IMG_Load ("player.png"); + break; + case TARGET: + img = IMG_Load ("target.png"); + break; + case BOX: + img = IMG_Load ("box.png"); + break; + case BOX_ON_TARGET: + img = IMG_Load ("box_on_target.png"); + break; + case PLAYER_ON_TARGET: + img = IMG_Load ("player_on_target.png"); + break; + } + texture + = SDL_CreateTextureFromSurface (display_user->renderer, img); + displayImage (display_user->renderer, texture, pos, size); + SDL_FreeSurface (img); + SDL_DestroyTexture (texture); + } } - } - SDL_RenderPresent (display_user->renderer); + SDL_RenderPresent (display_user->renderer); } int getMaxSize () { - SDL_Init (SDL_INIT_VIDEO); // init if error - SDL_DisplayMode display; - SDL_GetCurrentDisplayMode (0, &display); // get dim display user - int result = 0; - if (display.w <= display.h) - { - result = display.w; - } - else - { - result = display.h; - } - SDL_Quit (); - return (result - 50); // margin + SDL_Init (SDL_INIT_VIDEO); // init if error + SDL_DisplayMode display; + SDL_GetCurrentDisplayMode (0, &display); // get dim display user + int result = 0; + if (display.w <= display.h) + { + result = display.w; + } + else + { + result = display.h; + } + SDL_Quit (); + return (result - 50); // margin } void initSDL (dis *display_user) { - SDL_Init (SDL_INIT_VIDEO); - display_user->window = SDL_CreateWindow ( - "Sokoman", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, - display_user->size_window, display_user->size_window, SDL_WINDOW_SHOWN); - if (!display_user->window) - { - SDL_Quit (); - perror ("Window null"); - exit (-1); - } + SDL_Init (SDL_INIT_VIDEO); + display_user->window + = SDL_CreateWindow ("Sokoman", SDL_WINDOWPOS_CENTERED, + SDL_WINDOWPOS_CENTERED, display_user->size_window, + display_user->size_window, SDL_WINDOW_SHOWN); + if (!display_user->window) + { + SDL_Quit (); + perror ("Window null"); + exit (-1); + } - display_user->renderer - = SDL_CreateRenderer (display_user->window, -1, SDL_RENDERER_SOFTWARE); - if (!display_user->renderer) - { - SDL_Quit (); - perror ("Renderer null"); - exit (-1); - } + display_user->renderer + = SDL_CreateRenderer (display_user->window, -1, SDL_RENDERER_SOFTWARE); + if (!display_user->renderer) + { + SDL_Quit (); + perror ("Renderer null"); + exit (-1); + } } void displayImage (SDL_Renderer *renderer, SDL_Texture *texture, vect pos, int size) { - SDL_Rect rect = { pos.x, pos.y, size, size }; - SDL_RenderCopy (renderer, texture, NULL, &rect); + SDL_Rect rect = { pos.x, pos.y, size, size }; + SDL_RenderCopy (renderer, texture, NULL, &rect); } diff --git a/function.c b/function.c index 7d5b36b..f39467f 100644 --- a/function.c +++ b/function.c @@ -8,365 +8,369 @@ unsigned short int **creatArea2D (const unsigned int N) { - unsigned short int **tab2d; - tab2d = calloc (N, sizeof (unsigned short int *)); - if (tab2d == NULL) - { - return NULL; - } - - bool fail = false; - unsigned int i; - for (i = 0; i < N && !fail; ++i) - { - tab2d[i] = calloc (N, sizeof (unsigned short int)); - if (tab2d[i] == NULL) + unsigned short int **tab2d; + tab2d = calloc (N, sizeof (unsigned short int *)); + if (tab2d == NULL) { - fail = true; + return NULL; } - } - if (fail) - { - unsigned int j; - for (j = 0; j < i; ++j) + bool fail = false; + unsigned int i; + for (i = 0; i < N && !fail; ++i) { - free (tab2d[j]); + tab2d[i] = calloc (N, sizeof (unsigned short int)); + if (tab2d[i] == NULL) + { + fail = true; + } } - free (tab2d); - return NULL; - } - return tab2d; + + if (fail) + { + unsigned int j; + for (j = 0; j < i; ++j) + { + free (tab2d[j]); + } + free (tab2d); + return NULL; + } + return tab2d; } void free2D (unsigned short int **tab, int N) { - int i; - for (i = 0; i < N; ++i) - { - free (tab[i]); - } - free (tab); - return; + int i; + for (i = 0; i < N; ++i) + { + free (tab[i]); + } + free (tab); + return; } short int canIGoDirection (short int valueOfNCase, short int valueOfNPlusOneCase) { - if (valueOfNCase != WALL) - { - if ((valueOfNCase == BOX && valueOfNPlusOneCase == EMPTY) - || (valueOfNCase == BOX && valueOfNPlusOneCase == TARGET)) + if (valueOfNCase != WALL) { - if (valueOfNPlusOneCase == TARGET) - { - // Box on target - return 3; - } - // move the box - return 2; - } - if ((valueOfNCase == BOX_ON_TARGET && valueOfNPlusOneCase == EMPTY) - || (valueOfNCase == BOX_ON_TARGET && valueOfNPlusOneCase == TARGET)) - { - if (valueOfNPlusOneCase == TARGET) - { - // Box on target and player on target too - return 6; - } - // move the box but player on a target - return 5; - } - if (valueOfNCase == TARGET) - { - // move player on target - return 4; + if ((valueOfNCase == BOX && valueOfNPlusOneCase == EMPTY) + || (valueOfNCase == BOX && valueOfNPlusOneCase == TARGET)) + { + if (valueOfNPlusOneCase == TARGET) + { + // Box on target + return 3; + } + // move the box + return 2; + } + if ((valueOfNCase == BOX_ON_TARGET && valueOfNPlusOneCase == EMPTY) + || (valueOfNCase == BOX_ON_TARGET + && valueOfNPlusOneCase == TARGET)) + { + if (valueOfNPlusOneCase == TARGET) + { + // Box on target and player on target too + return 6; + } + // move the box but player on a target + return 5; + } + if (valueOfNCase == TARGET) + { + // move player on target + return 4; + } + + if (valueOfNCase == EMPTY) + { + // move player + return 1; + } } - if (valueOfNCase == EMPTY) - { - // move player - return 1; - } - } - - return 0; + return 0; } void move (unsigned short int **tab, vect *playerPos, vect direction) { - short int valueOfNCase - = tab[playerPos->x + direction.x][playerPos->y + direction.y]; + short int valueOfNCase + = tab[playerPos->x + direction.x][playerPos->y + direction.y]; - vect add = plusVect (*playerPos, direction); - add = plusVect (add, direction); - short int valueOfNPlusOneCase; + vect add = plusVect (*playerPos, direction); + add = plusVect (add, direction); + short int valueOfNPlusOneCase; - if (add.x < 0 || add.y < 0) - { - valueOfNPlusOneCase = WALL; - } - else - { - valueOfNPlusOneCase = tab[add.x][add.y]; - } - - short int returnValue = canIGoDirection (valueOfNCase, valueOfNPlusOneCase); - short int playerState = tab[playerPos->x][playerPos->y]; - - switch (returnValue) - { - case 0: - - break; - case 1: - // move player - tab[playerPos->x + direction.x][playerPos->y + direction.y] = PLAYER; - break; - case 2: - // move player and the box - - tab[playerPos->x + direction.x][playerPos->y + direction.y] = PLAYER; - tab[playerPos->x + direction.x * 2][playerPos->y + direction.y * 2] = BOX; - break; - case 3: - // move player and the box is well-placed - - tab[playerPos->x + direction.x][playerPos->y + direction.y] = PLAYER; - tab[playerPos->x + direction.x * 2][playerPos->y + direction.y * 2] - = BOX_ON_TARGET; - break; - case 4: - // move player on a target - - tab[playerPos->x + direction.x][playerPos->y + direction.y] - = PLAYER_ON_TARGET; - break; - case 5: - // move box and player on a target - - tab[playerPos->x + direction.x * 2][playerPos->y + direction.y * 2] = BOX; - tab[playerPos->x + direction.x][playerPos->y + direction.y] - = PLAYER_ON_TARGET; - break; - case 6: - // move player on a target and box on a target - - tab[playerPos->x + direction.x * 2][playerPos->y + direction.y * 2] - = BOX_ON_TARGET; - tab[playerPos->x + direction.x][playerPos->y + direction.y] - = PLAYER_ON_TARGET; - break; - default: - printf ("Commande inconnue !\n"); - } - - if (returnValue != 0) - { - if (playerState == PLAYER_ON_TARGET) + if (add.x < 0 || add.y < 0) { - tab[playerPos->x][playerPos->y] = TARGET; + valueOfNPlusOneCase = WALL; } else { - tab[playerPos->x][playerPos->y] = EMPTY; + valueOfNPlusOneCase = tab[add.x][add.y]; + } + + short int returnValue + = canIGoDirection (valueOfNCase, valueOfNPlusOneCase); + short int playerState = tab[playerPos->x][playerPos->y]; + + switch (returnValue) + { + case 0: + + break; + case 1: + // move player + tab[playerPos->x + direction.x][playerPos->y + direction.y] = PLAYER; + break; + case 2: + // move player and the box + + tab[playerPos->x + direction.x][playerPos->y + direction.y] = PLAYER; + tab[playerPos->x + direction.x * 2][playerPos->y + direction.y * 2] + = BOX; + break; + case 3: + // move player and the box is well-placed + + tab[playerPos->x + direction.x][playerPos->y + direction.y] = PLAYER; + tab[playerPos->x + direction.x * 2][playerPos->y + direction.y * 2] + = BOX_ON_TARGET; + break; + case 4: + // move player on a target + + tab[playerPos->x + direction.x][playerPos->y + direction.y] + = PLAYER_ON_TARGET; + break; + case 5: + // move box and player on a target + + tab[playerPos->x + direction.x * 2][playerPos->y + direction.y * 2] + = BOX; + tab[playerPos->x + direction.x][playerPos->y + direction.y] + = PLAYER_ON_TARGET; + break; + case 6: + // move player on a target and box on a target + + tab[playerPos->x + direction.x * 2][playerPos->y + direction.y * 2] + = BOX_ON_TARGET; + tab[playerPos->x + direction.x][playerPos->y + direction.y] + = PLAYER_ON_TARGET; + break; + default: + printf ("Commande inconnue !\n"); + } + + if (returnValue != 0) + { + if (playerState == PLAYER_ON_TARGET) + { + tab[playerPos->x][playerPos->y] = TARGET; + } + else + { + tab[playerPos->x][playerPos->y] = EMPTY; + } + playerPos->x = playerPos->x + direction.x; + playerPos->y = playerPos->y + direction.y; } - playerPos->x = playerPos->x + direction.x; - playerPos->y = playerPos->y + direction.y; - } } void inGameLoop (unsigned short int **tab2d, int N, vect *playerPos, vect *targets, int nbr_targets, dis *display_user) { - vect direction = { 0, 0 }; - char input; - bool finish = false; - while (!finish) - { - printf ("Utilisez Z/Q/S/D pour bouger, X pour quitter : "); - - input = getchar (); - - if (input == 'x') + vect direction = { 0, 0 }; + char input; + bool finish = false; + while (!finish) { - break; // Quitter le jeu - } + printf ("Utilisez Z/Q/S/D pour bouger, X pour quitter : "); - switch (input) - { - case 'd': - direction.y = 1; - direction.x = 0; + input = getchar (); - break; - case 'q': - direction.y = -1; - direction.x = 0; - break; - case 'z': - direction.x = -1; - direction.y = 0; - break; - case 's': - direction.x = 1; - direction.y = 0; - break; - default: - direction.x = 0; - direction.y = 0; - } + if (input == 'x') + { + break; // Quitter le jeu + } - system ("clear"); - move (tab2d, playerPos, direction); + switch (input) + { + case 'd': + direction.y = 1; + direction.x = 0; - printf ("\n"); - if (isWin (tab2d, targets, nbr_targets)) - { - puts ("Win!"); - finish = true; + break; + case 'q': + direction.y = -1; + direction.x = 0; + break; + case 'z': + direction.x = -1; + direction.y = 0; + break; + case 's': + direction.x = 1; + direction.y = 0; + break; + default: + direction.x = 0; + direction.y = 0; + } + + system ("clear"); + move (tab2d, playerPos, direction); + + printf ("\n"); + if (isWin (tab2d, targets, nbr_targets)) + { + puts ("Win!"); + finish = true; + } + if (islose (tab2d, N)) + { + puts ("lose!"); + finish = true; + } + screenDisplay (tab2d, N); + screenDisplaySDL (tab2d, display_user); } - if (islose (tab2d, N)) - { - puts ("lose!"); - finish = true; - } - screenDisplay (tab2d, N); - screenDisplaySDL (tab2d, display_user); - } } bool isWin (unsigned short int **tab2d, vect *targets, int nbr_targets) { - int i; - for (i = 0; i < nbr_targets; ++i) - { - int x = targets[i].x; - int y = targets[i].y; - if (tab2d[x][y] != BOX_ON_TARGET) + int i; + for (i = 0; i < nbr_targets; ++i) { - return false; + int x = targets[i].x; + int y = targets[i].y; + if (tab2d[x][y] != BOX_ON_TARGET) + { + return false; + } } - } - return true; + return true; } bool islose (unsigned short int **tab2d, const int N) { - int x = 0, y = 0; - for (x = 0; x < N; ++x) - { - for (y = 0; y < N; ++y) + int x = 0, y = 0; + for (x = 0; x < N; ++x) { - bool isblock = false; - if (tab2d[x][y] == BOX) - { - vect box; - box.x = x; - box.y = y; - isblock = blockBox (tab2d, box); - } + for (y = 0; y < N; ++y) + { + bool isblock = false; + if (tab2d[x][y] == BOX) + { + vect box; + box.x = x; + box.y = y; + isblock = blockBox (tab2d, box); + } - if (isblock) - { - return true; - } + if (isblock) + { + return true; + } + } } - } - return false; + return false; } vect plusVect (vect one, vect two) { - vect result; - result.x = one.x + two.x; - result.y = one.y + two.y; - return result; + vect result; + result.x = one.x + two.x; + result.y = one.y + two.y; + return result; } int lengthVect (vect vector) { return abs (vector.x) + abs (vector.y); } bool blockBox (unsigned short int **tab2d, vect box_coor) { - int nbr_touch = 0; - vect card[4] = { { 0, -1 }, { 1, 0 }, { 0, 1 }, { -1, 0 } }; - int indice_card[4] = { 0 }; - int id_box = -1; - int i; - for (i = 0; i < 4; ++i) - { - vect test = plusVect (box_coor, card[i]); - unsigned short int val = tab2d[test.x][test.y]; - if (val == BOX || val == WALL || val == BOX_ON_TARGET) + int nbr_touch = 0; + vect card[4] = { { 0, -1 }, { 1, 0 }, { 0, 1 }, { -1, 0 } }; + int indice_card[4] = { 0 }; + int id_box = -1; + int i; + for (i = 0; i < 4; ++i) { - nbr_touch++; - if (val == BOX || val == BOX_ON_TARGET) - { - id_box = nbr_touch - 1; - } - indice_card[nbr_touch - 1] = i; + vect test = plusVect (box_coor, card[i]); + unsigned short int val = tab2d[test.x][test.y]; + if (val == BOX || val == WALL || val == BOX_ON_TARGET) + { + nbr_touch++; + if (val == BOX || val == BOX_ON_TARGET) + { + id_box = nbr_touch - 1; + } + indice_card[nbr_touch - 1] = i; + } } - } - if (nbr_touch == 0) - return false; - - if (nbr_touch >= 3) - { - if (id_box != -1) - { - vect test = plusVect (card[indice_card[(id_box + 1) % 3]], - card[indice_card[(id_box + 2) % 3]]); - if (test.x == 0 && test.y == 0) + if (nbr_touch == 0) return false; + + if (nbr_touch >= 3) + { + if (id_box != -1) + { + vect test = plusVect (card[indice_card[(id_box + 1) % 3]], + card[indice_card[(id_box + 2) % 3]]); + if (test.x == 0 && test.y == 0) + return false; + } + return true; + } + + if (nbr_touch == 2) + { + int id1 = indice_card[0]; + int id2 = indice_card[1]; + vect add = plusVect (card[id1], card[id2]); + if (lengthVect (add) == 2) + { + if (id_box == -1) + return true; + vect test = plusVect (card[indice_card[id_box]], + card[indice_card[(id_box + 1) % 2]]); + test = plusVect (test, box_coor); + if (tab2d[test.x][test.y] == WALL) + return true; + } + return false; + } + + vect normal = card[indice_card[0]]; + vect director1 = card[(indice_card[0] + 1) % 4]; + vect director2 = card[(indice_card[0] + 1) % 4]; + vect dir_test[2] = { director1, director2 }; + + bool wall = false; + + for (int i = 0; i < 2; ++i) + { + vect current = plusVect (box_coor, dir_test[i]); + while (!wall) + { + unsigned short int val = tab2d[current.x][current.y]; + if (val == WALL) + wall = true; + if (val == TARGET) + return false; + + vect cur_nor = plusVect (current, normal); + val = tab2d[cur_nor.x][cur_nor.y]; + if (val != WALL || val != BOX || val != BOX_ON_TARGET) + { + return false; + } + } } return true; - } - - if (nbr_touch == 2) - { - int id1 = indice_card[0]; - int id2 = indice_card[1]; - vect add = plusVect (card[id1], card[id2]); - if (lengthVect (add) == 2) - { - if (id_box == -1) - return true; - vect test = plusVect (card[indice_card[id_box]], - card[indice_card[(id_box + 1) % 2]]); - test = plusVect (test, box_coor); - if (tab2d[test.x][test.y] == WALL) - return true; - } - return false; - } - - vect normal = card[indice_card[0]]; - vect director1 = card[(indice_card[0] + 1) % 4]; - vect director2 = card[(indice_card[0] + 1) % 4]; - vect dir_test[2] = { director1, director2 }; - - bool wall = false; - - for (int i = 0; i < 2; ++i) - { - vect current = plusVect (box_coor, dir_test[i]); - while (!wall) - { - unsigned short int val = tab2d[current.x][current.y]; - if (val == WALL) - wall = true; - if (val == TARGET) - return false; - - vect cur_nor = plusVect (current, normal); - val = tab2d[cur_nor.x][cur_nor.y]; - if (val != WALL || val != BOX || val != BOX_ON_TARGET) - { - return false; - } - } - } - return true; - perror ("error in blockBox"); - exit (0); + perror ("error in blockBox"); + exit (0); } diff --git a/function.h b/function.h index c0852b0..8f7b275 100644 --- a/function.h +++ b/function.h @@ -18,24 +18,24 @@ typedef struct Vecteur { - int x; - int y; + int x; + int y; } vect; typedef struct Score { - time_t before; - time_t after; - unsigned int move_player; - unsigned int move_box; + time_t before; + time_t after; + unsigned int move_player; + unsigned int move_box; } score; typedef struct essential_sdl { - SDL_Window *window; - SDL_Renderer *renderer; - unsigned int size_window; - unsigned int size_box; + SDL_Window *window; + SDL_Renderer *renderer; + unsigned int size_window; + unsigned int size_box; } dis; unsigned short int **creatArea2D (const unsigned int N); diff --git a/main.c b/main.c index 6a1c4bd..42aef79 100644 --- a/main.c +++ b/main.c @@ -11,34 +11,34 @@ int main () { - dis display_user; - display_user.size_window = getMaxSize (); - display_user.size_box = SIZE_PLAY; - initSDL (&display_user); + dis display_user; + display_user.size_window = getMaxSize (); + display_user.size_box = SIZE_PLAY; + initSDL (&display_user); - vect *playerPos = (vect *)malloc (sizeof (vect)); - vect *targets; - int nbr_targets; - score playerScore; - unsigned short int **tab2d = creatArea2D (SIZE_PLAY); + vect *playerPos = (vect *)malloc (sizeof (vect)); + vect *targets; + int nbr_targets; + score playerScore; + unsigned short int **tab2d = creatArea2D (SIZE_PLAY); - playerScore.before = time (NULL); + playerScore.before = time (NULL); - targets - = fileToTab2D ("test.txt", tab2d, SIZE_PLAY, playerPos, &nbr_targets); - screenDisplaySDL (tab2d, &display_user); - screenDisplay (tab2d, SIZE_PLAY); - inGameLoop (tab2d, SIZE_PLAY, playerPos, targets, nbr_targets, - &display_user); + targets + = fileToTab2D ("test.txt", tab2d, SIZE_PLAY, playerPos, &nbr_targets); + screenDisplaySDL (tab2d, &display_user); + screenDisplay (tab2d, SIZE_PLAY); + inGameLoop (tab2d, SIZE_PLAY, playerPos, targets, nbr_targets, + &display_user); - playerScore.after = time (NULL); - printf ("%ld\n", playerScore.after - playerScore.before); + playerScore.after = time (NULL); + printf ("%ld\n", playerScore.after - playerScore.before); - SDL_DestroyWindow (display_user.window); - SDL_DestroyRenderer (display_user.renderer); - free2D (tab2d, SIZE_PLAY); - free (playerPos); - free (targets); - SDL_Quit (); - return 0; + SDL_DestroyWindow (display_user.window); + SDL_DestroyRenderer (display_user.renderer); + free2D (tab2d, SIZE_PLAY); + free (playerPos); + free (targets); + SDL_Quit (); + return 0; } diff --git a/read.c b/read.c index 500e60d..7a6596e 100644 --- a/read.c +++ b/read.c @@ -5,48 +5,48 @@ vect *fileToTab2D (const char *name_file, unsigned short int **tab, const unsigned N, vect *player, int *nbr_targets) { - vect *targets = malloc (sizeof (vect)); - (*nbr_targets) = 0; - FILE *file = fopen (name_file, "r"); - unsigned int x = 0, y = 1; - while (!feof (file)) - { - char current = fgetc (file); - switch (current) + vect *targets = malloc (sizeof (vect)); + (*nbr_targets) = 0; + FILE *file = fopen (name_file, "r"); + unsigned int x = 0, y = 1; + while (!feof (file)) { - case '#': - tab[x][y] = WALL; - break; - case 'C': - tab[x][y] = BOX; - break; - case 'I': - targets = realloc (targets, sizeof (vect) * (++nbr_targets[0])); - targets[nbr_targets[0] - 1].x = x; - targets[nbr_targets[0] - 1].y = y; - tab[x][y] = TARGET; - break; - case 'P': - player->x = x; - player->y = y; - tab[x][y] = PLAYER; - break; - case '\n': - y = 0; - ++x; - break; - default: - tab[x][y] = EMPTY; - break; - } - ++y; + char current = fgetc (file); + switch (current) + { + case '#': + tab[x][y] = WALL; + break; + case 'C': + tab[x][y] = BOX; + break; + case 'I': + targets = realloc (targets, sizeof (vect) * (++nbr_targets[0])); + targets[nbr_targets[0] - 1].x = x; + targets[nbr_targets[0] - 1].y = y; + tab[x][y] = TARGET; + break; + case 'P': + player->x = x; + player->y = y; + tab[x][y] = PLAYER; + break; + case '\n': + y = 0; + ++x; + break; + default: + tab[x][y] = EMPTY; + break; + } + ++y; - if (x >= N || y >= N) - { - perror ("Level out of range !"); - exit (-1); + if (x >= N || y >= N) + { + perror ("Level out of range !"); + exit (-1); + } } - } - fclose (file); - return targets; + fclose (file); + return targets; }