so_long/parsing.c
2022-02-13 22:28:48 +01:00

167 lines
2.8 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* parsing.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/02/13 22:26:34 by apommier #+# #+# */
/* Updated: 2022/02/13 22:28:18 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
#include "so_long.h"
#include "./libft/libft.h"
int is_player(char **map)
{
int i;
int j;
int player;
player = 0;
i = 0;
j = 0;
while (map[j])
{
i = 0;
while (map[j][i++])
{
if (map[j][i] == 'P')
player++;
}
j++;
}
if (player == 1)
return (1);
return (0);
}
int is_exit(char **map)
{
int i;
int j;
int exit;
exit = 0;
i = 0;
j = 0;
while (map[j])
{
i = 1;
while (map[j][i])
{
if (map[j][i++] == 'E')
exit++;
}
j++;
}
if (exit > 0)
return (1);
return (0);
}
int is_item(char **map)
{
int i;
int j;
int item;
item = 0;
i = 0;
j = 0;
while (map[j])
{
i = 1;
while (map[j][i])
{
if (map[j][i++] == 'E')
item++;
}
j++;
}
return (item);
}
int is_rectangle(char **map)
{
int i;
int j;
i = 0;
j = 0;
while (map[j])
{
i = 1;
while (map[j][i])
{
if (map[j][i] != '0' && map[j][i] != '1' && map[j][i] != 'P'
&& map[j][i] != 'E' && map[j][i] != 'C')
return (0);
i++;
}
j++;
}
j = 0;
while (map[j + 1])
{
if (ft_strlen(map[j]) != ft_strlen(map[j + 1]))
return (0);
j++;
}
return (1);
}
int is_close(char **map)
{
int i;
int j;
i = 0;
j = 0;
while (map[j][i])
{
if (map[j][i++] != '1')
return (0);
}
while (map[j])
{
if (map[j][0] != '1' || map[j][ft_strlen(map[j]) - 1] != '1')
return (0);
j++;
}
i = 0;
while (map[j - 1][i])
{
if (map[j - 1][i++] != '1')
return (0);
}
return (1);
}
void ft_error(char *error_msg, char **map)
{
int i;
i = 0;
while (map[i])
free(map[i++]);
ft_putstr_fd(error_msg, 2);
exit(1);
}
int check_map(char **map)
{
if (!is_player(map))
ft_error("You need just one player\n", map);
if (!is_exit(map))
ft_error("There is no exit\n", map);
if (!is_close(map))
ft_error("The map isn't close\n", map);
if (!is_item(map))
ft_error("There is no item\n", map);
if (!is_rectangle(map))
ft_error("The map isn't a rectangle\n", map);
return (1);
}