rendered paste body-module(ant_sim).
ant_loop(P, WithFood, W_pid) ->
Candidates = [ahead(P), ahead_left(P), ahead_right(P)],
ant_retry_loop(Candidates, WithFood, W_pid),
receive after 40 -> ok end,
ant_loop(P1, WithFood1, W_pid).
ant_retry_loop(Candidates, WithFood, W_pid) ->
W_pid ! {self(), info, Candidates},
% receive FPA {Food, Pheromone, Ant} info of all candidates
% pick target cell P1 based on score
% correspondingly, we should have FPA1 and WithFood1
W_pid ! {self(), move, P, P1, FPA1},
receive
ok -> {P1, WithFood1};
_ -> ant_retry_loop(Candidates, WithFood, W_pid)
end.
ahead({X0, Y0, Dir}) ->
X1 = list:nth(Dir, [X, X+1, X+1, X+1, X, X-1, X-1, X-1]),
Y1 = list:nth(Dir, [Y-1, Y-1, Y, Y+1, Y+1, Y+1, Y, Y-1]),
{X1 rem 80, Y1 rem 80, Dir}.
ahead_left({X, Y, Dir}) ->
ahead({X, Y, Dir-1 rem 8}).
ahead_right({X, Y, Dir}) ->
ahead({X, Y, Dir+1 rem 8}).
world_loop(State) ->
receive
{Pid, info, Ps} ->
Pid ! [current(State, P) || P <- Ps],
world_loop(State);
{Pid, move, P0, P1, FPA1} ->
case current(State, P1) of
FPA1 ->
% make the move by constructing State1
Pid ! ok,
world_loop(State1);
_ ->
Pid ! no,
world_loop(State)
end
end.