%%%------------------------------------------------------------------- %%% @author DY %%% @copyright (C) 2020, %%% @doc %%% 收集终点路径 %%% 返回:SUCCESS %%% @end %%% Created : 07. 10月 2020 15:13 %%%------------------------------------------------------------------- -module(action_collect_dest_path). -include("eBhv3.hrl"). -include("example.hrl"). %% API -export([tick/2]). tick(_BTree, #{cur_grid := CurGrid, grid_list := GirdList} = State) -> case GirdList of [] -> EndGrid = get_end_grid(CurGrid), State1 = State#{grid_list := get_grid_path(CurGrid, EndGrid)}, ?INFO("~ts:找到穿传说中的“大蒜”的位置,要尽快到达那里!", [maps:get(uid, State1)]), {?BT_SUCCESS, State1}; _ -> ?INFO("~ts:天要黑了,要尽快到达那里!", [maps:get(uid, State)]), {?BT_SUCCESS, State} end. get_end_grid(CurGrid) -> EndGridList = [{0, 0}, {0, ?MAX_X}, {?MAX_Y, ?MAX_X}, {?MAX_Y, 0}], {_, EndGrid} = hd(lists:sort([{calc_distance(CurGrid, Grid), Grid} || Grid <- EndGridList])), EndGrid. calc_distance({X1, Y1}, {X2, Y2}) -> math:sqrt(math:pow(X1 - X2, 2) + math:pow(Y1 - Y2, 2)). get_grid_path(CurGrid, EndGrid) -> case EndGrid of {0, 0} -> get_grid_path(CurGrid, [EndGrid], 1, 1); {0, ?MAX_X} -> get_grid_path(CurGrid, [EndGrid], 1, -1); {?MAX_Y, ?MAX_X} -> get_grid_path(CurGrid, [EndGrid], -1, -1); {?MAX_Y, 0} -> get_grid_path(CurGrid, [EndGrid], -1, 1) end. get_grid_path(CurGrid, GridPath, XInc, YInc) -> case GridPath of [CurGrid | _] -> GridPath; [{X, Y} | _] -> case Y + YInc of Y1 when Y1 == 0 orelse Y1 == ?MAX_X -> get_grid_path(CurGrid, [{X + XInc, Y1}, {X, Y1} | GridPath], XInc, bnot YInc + 1); Y1 -> get_grid_path(CurGrid, [{X, Y1} | GridPath], XInc, YInc) end end.