Files
Sokoban/script/read.c

131 lines
3.0 KiB
C

/**
* \file read.c
* Ce fichier est le programe qui lit d'autre fichier, nottament les maps.
*/
#include "../include/function.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/**
* \brief La fonction permet de stocker la zone de jeu en fonction de la lecture d'un fichier.
* \param name_file Le nom du fichier a ouvrir.
* \param tab Le tableau 2D carre du plateau de jeu a remplir.
* \param N La taille de tab.
* \param player Les coordonnée du joueur que le programe vas trouvé.
* \param nbr_targets Le nombre de points d'interer trouver.
* \return Vect La fonction renvoie le tableau des coordonnée des points d'interer.
*/
vect *fileToTab2D (const char *name_file, char **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 = 0;
while (!feof (file))
{
char current = fgetc (file);
if (current == EOF)
{
break;
}
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 = -1;
++x;
break;
default:
tab[x][y] = EMPTY;
break;
}
++y;
if (x > N || y > N)
{
perror ("Level out of range !");
exit (-1);
}
}
fclose (file);
return targets;
}
int countCustomMaps(char *name_directory)
{
int nbr = 0;
char name_map[50] = "";
sprintf(name_map, "%s/custom_%d.txt",name_directory ,nbr);
FILE *file = fopen(name_map, "r");
while (file != NULL)
{
nbr++;
sprintf(name_map, "%s/custom_%d.txt",name_directory ,nbr);
file = fopen(name_map, "r");
}
return nbr;
}
char ** generatorMenu(char *name_directory, vect *size, vect *pos_player)
{
pos_player->x = 4;
pos_player->y = 1;
int nbr_custom = countCustomMaps(name_directory);
size->x = 9;
size->y = 5*(3+nbr_custom) +7;
char **menu = creatArea2D(size->x,size->y);
int i = 1;
for (i = 1;i < size->y-1; ++i)
{
menu[4][i] = EMPTY;
if (i == size->y-2)
{
menu[4][i] = BUTTON;
}
}
int j,k ;
for (j = 5; j < size->y-5; j+=5)
{
for (k = 1 ; k < 4; ++k)
{
if (k == 1)
{
menu[k][j] = BUTTON;
}
else
{
menu[k][j] = EMPTY;
}
}
}
menu[4][1] = PLAYER;
return menu;
}