115 lines
2.9 KiB
C
115 lines
2.9 KiB
C
/* ************************************************************************** */
|
|
/* */
|
|
/* ::: :::::::: */
|
|
/* enemy.c :+: :+: :+: */
|
|
/* +:+ +:+ +:+ */
|
|
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
|
|
/* +#+#+#+#+#+ +#+ */
|
|
/* Created: 2023/01/04 14:08:08 by erey-bet #+# #+# */
|
|
/* Updated: 2023/01/06 18:46:13 by erey-bet ### ########.fr */
|
|
/* */
|
|
/* ************************************************************************** */
|
|
|
|
#include "../so_long.h"
|
|
|
|
void distance_player(int **map, int x, int y, int nbr)
|
|
{
|
|
if (map[x][y] == -1 || nbr >= 11)
|
|
return ;
|
|
if (map[x][y + 1] > -1 && (map[x][y + 1] == 0 || map[x][y + 1] > nbr))
|
|
map[x][y + 1] = nbr;
|
|
if (map[x + 1][y] > -1 && (map[x + 1][y] == 0 || map[x + 1][y] > nbr))
|
|
map[x + 1][y] = nbr;
|
|
if (map[x - 1][y] > -1 && (map[x - 1][y] == 0 || map[x - 1][y] > nbr))
|
|
map[x - 1][y] = nbr;
|
|
if (map[x][y - 1] > -1 && (map[x][y - 1] == 0 || map[x][y - 1] > nbr))
|
|
map[x][y - 1] = nbr;
|
|
distance_player(map, x, y + 1, nbr + 1);
|
|
distance_player(map, x + 1, y, nbr + 1);
|
|
distance_player(map, x - 1, y, nbr + 1);
|
|
distance_player(map, x, y - 1, nbr + 1);
|
|
}
|
|
|
|
int **ft_strdups_int(char **src)
|
|
{
|
|
int **src_cpy;
|
|
int x;
|
|
int y;
|
|
|
|
src_cpy = ft_calloc(ft_strslen(src) + 1, (sizeof(int *)));
|
|
if (src_cpy == NULL)
|
|
return (NULL);
|
|
x = -1;
|
|
while (src[++x])
|
|
{
|
|
src_cpy[x] = ft_calloc(ft_strlen(src[x]) + 1, sizeof(int));
|
|
y = -1;
|
|
while (src[x][++y])
|
|
{
|
|
if (src[x][y] != '0')
|
|
src_cpy[x][y] = -1;
|
|
else
|
|
src_cpy[x][y] = 0;
|
|
}
|
|
}
|
|
src_cpy[x] = NULL;
|
|
return (src_cpy);
|
|
}
|
|
|
|
void find(int **map, t_xy *new_pos, int x, int y)
|
|
{
|
|
int i;
|
|
|
|
i = -1;
|
|
if (map[x][y + 1] != -1)
|
|
{
|
|
i = map[x][y + 1];
|
|
new_pos->y = y + 1;
|
|
}
|
|
if (choice(map, &i, x + 1, y))
|
|
{
|
|
new_pos->x = x + 1;
|
|
new_pos->y = y;
|
|
}
|
|
if (choice(map, &i, x - 1, y))
|
|
{
|
|
new_pos->x = x - 1;
|
|
new_pos->y = y;
|
|
}
|
|
if (choice(map, &i, x, y - 1))
|
|
{
|
|
new_pos->x = x;
|
|
new_pos->y = y - 1;
|
|
}
|
|
}
|
|
|
|
t_xy path_finding(t_data *data, int x, int y)
|
|
{
|
|
t_xy new_pos;
|
|
int i;
|
|
int **map;
|
|
|
|
new_pos.x = x;
|
|
new_pos.y = y;
|
|
map = ft_strdups_int(data->map);
|
|
map[data->y_ply][data->x_ply] = -2;
|
|
distance_player(map, data->y_ply, data->x_ply, 1);
|
|
find(map, &new_pos, x, y);
|
|
i = 0;
|
|
while (map[i])
|
|
free(map[i++]);
|
|
free(map);
|
|
return (new_pos);
|
|
}
|
|
|
|
void move_enemy(t_data *data)
|
|
{
|
|
t_xy pos;
|
|
|
|
set_element(data, data->y_ene, data->x_ene, '0');
|
|
pos = path_finding(data, data->x_ene, data->y_ene);
|
|
set_element(data, pos.y, pos.x, 'e');
|
|
data->x_ene = pos.x;
|
|
data->y_ene = pos.y;
|
|
}
|