Erlang:如何重用以gen_fsm形式表示的策略?

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来表示每个机器人的策略。 我已经为攻击者制定了策略。现在,我想使用相同的策略来运行多个攻击者,比如说5个攻击者。为此,我必须在5个不同的模块上复制相同的gen_fsm代码(200行),总共产生1000行代码。
有没有办法编写一个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非常重要。