Erlang:如何重用以gen_fsm形式表示的策略?
我正在实施机器人足球,它使用gen_fsm来表示每个机器人的策略。 我已经为攻击者制定了策略。现在,我想使用相同的策略来运行多个攻击者,比如说5个攻击者。为此,我必须在5个不同的模块上复制相同的gen_fsm代码(200行),总共产生1000行代码。Erlang:如何重用以gen_fsm形式表示的策略?,erlang,Erlang,我正在实施机器人足球,它使用gen_fsm来表示每个机器人的策略。 我已经为攻击者制定了策略。现在,我想使用相同的策略来运行多个攻击者,比如说5个攻击者。为此,我必须在5个不同的模块上复制相同的gen_fsm代码(200行),总共产生1000行代码。 有没有办法编写一个gen_fsm并在多个模块中重用它? 下面是一个示例代码段 -module(planner). -behaviour(gen_fsm). start() -> start_link(). start_link()
有没有办法编写一个gen_fsm并在多个模块中重用它? 下面是一个示例代码段
-module(planner).
-behaviour(gen_fsm).
start() ->
start_link().
start_link() ->
gen_fsm:start_link({local, ?SERVER}, ?MODULE, [], []).
init([]) ->
{ok, state1, ets:new(test,[public])}.
state1({test},State) ->
case ets:lookup(State,ball) of
[] ->
action!{turn,80},
{next_state,state1,State};
Data ->
% some code % %,
{next_state,state2,State}
end;
state2({test},State) ->
% --- some code ---%
您可能应该在没有全局注册名称的情况下启动
gen_fsm
进程。尝试:
start_link() ->
gen_fsm:start_link(?MODULE, [], []).
请记住使用从
gen\u fsm:start\u link/3
返回的进程id跟踪进程。您可能应该在没有全局注册名称的情况下启动gen\u fsm
进程。尝试:
start_link() ->
gen_fsm:start_link(?MODULE, [], []).
请记住使用从
gen\u fsm:start\u link/3
返回的进程id跟踪您的进程,为什么不像其他答案暗示的那样,为每个攻击者生成5个运行相同代码的进程,每个攻击者1个?为什么不生成5个运行相同代码的进程,每个攻击者1个?,运行相同代码的进程数量没有限制。因此,如果您想要5个玩家,那么让5个进程运行相同的fsm逻辑代码可能是最容易的。正如其他答案所暗示的,但没有明确说明,您可以有多少个进程运行相同的代码。因此,在您的情况下,如果您想要5个玩家,那么可能最容易让5个进程运行相同的fsm逻辑代码。跟踪spawn_link
,+1返回的Pid非常重要。跟踪spawn_link
,+1返回的Pid非常重要。