`
qqdenghaigui
  • 浏览: 120818 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Erlang OTP设计原则Gen_Fsm行为

 
阅读更多

Erlang OTP设计原则Gen_Fsm行为

 

1. Fsm 称为 有限状态机,举个例子,游戏中的怪物称为NPC,NPC一般有几种状态,比如:静止,移动,死亡,被攻击,攻击英雄等等几个有限的状态,那么我们就可以有限状态机实现NPC的状态变更。

 

  一个有限状态机可以用一个关系式来描述,State(静止状态S1) x Event(英雄进入视野范围事件E) -> Actions(开始移动动作A), State(移动状态S2)

 

  解释如下:当一个NPC处于静止状态S1,有一个英雄进入NPC视野范围时E,会触发NPC开始移动动作A,并且NPC转变状态为移动状态S2。

 

  对于一个用 gen_fsm 行为实现的FSM来说,状态转换规则被写为符合如下约定的一系列Erlang函数:

 

StateName( Event, StateData ) ->

 

    .. 这里放动作的代码 ...

 

    { next_state, StateName', StateData' }

 

 

2. 接下来我们来看个例子,游戏中NPC状态变化,当然我做了很大的简化,真正游戏中的逻辑比这复杂的多。这里我只是为了说明,erlang OTP设计原则中的gen_fsm如何使用,代码如下:

 

-module(npc).

 

-behaviour(gen_fsm).

 

%% API

-export([start_link/0]).

 

%% gen_fsm callbacks

-export([init/1, static/2, moving/2, handle_event/3,

     handle_sync_event/4, handle_info/3, terminate/3, code_change/4]).

 

-export([hero_join/0, hero_leave/0]).

 

-define(SERVER, ?MODULE).

 

-record(npc, {state}).

 

start_link() ->

    gen_fsm:start_link({local, ?SERVER}, ?MODULE, [], []).

 

%% 初始化NPC为静止状态

init([]) ->

    io:format("init...~n"),

    State = #npc{state = static},

    io:format("init State: ~p~n", [State]),

   {ok, static, State}.

 

%% 英雄进入视野

hero_join() ->

    gen_fsm:send_event(?SERVER, hero_join).

 

%% 英雄离开视野

hero_leave() ->

    gen_fsm:send_event(?SERVER, hero_leave).

 

%% 静止状态下,接受来自客户端的事件

static(Event, State) ->

    case Event of

    hero_join -> %% 英雄进入视野

        do_moving(), %% 执行动作

        NewState = State#npc{state = moving},

        io:format("npc set state: ~p~n", [NewState]),

        {next_state, moving, NewState}

    end.

 

%% 移动状态下,接受来自客户端的事件

moving(Event, State) ->

    case Event of

    hero_leave -> %% 英雄离开视野

        do_static(), %% 执行动作

        NewState = State#npc{state = static},

        io:format("npc set state: ~p~n", [NewState]),

        {next_state, static, NewState}

    end.

 

handle_event(_Event, StateName, State) ->

    {next_state, StateName, State}.

 

handle_sync_event(_Event, _From, StateName, State) ->

    Reply = ok,

    {reply, Reply, StateName, State}.

 

handle_info(_Info, StateName, State) ->

    {next_state, StateName, State}.

 

terminate(_Reason, _StateName, _State) ->

    ok.

 

code_change(_OldVsn, StateName, State, _Extra) ->

    {ok, StateName, State}.

 

%% NPC 开始移动,进入移动状态

do_moving() ->

    io:format("npc beigin moving...~n").

 

%% NPC 停止移动,进入静止状态

do_static() ->

    io:format("npc stop moving, join static...~n").

   代码注释比较详细,接下来可以通过运行代码,来好好理解下这个例子,

 

  1. 首先,调用 npc:start_link(). 来初始化NPC服务;这个时候NPC处于静止状态 static;

 

  2. 当npc处于静止状态时,我们通过调用 npc:hero_join().来表示有一个侠客进入NPC的视野,那么这个时候gen_fsm会默认调用当前gen_fsm处于的状态,也就是static的处理方法,也就是 static(Event, State) 这个函数,这边可能比较绕,我已经尽量去用直白的语言来表达,能力有限,大家多思考下,呵呵;

 

  3. 当处理 static 函数时,Event 这个变量,就是 gen_fsm:send_event(?SERVER, hero_join). hero_join,紧接着执行对应的动作,在这里也就是 do_moving(),开始移动;

 

  4. 最后,我们需要返回 {next_state, moving, NewState} 让gen_fsm进入下一个状态,也就是 moving 状态;

 

  5. 当npc处于移动时,我们通过调用 npc:hero_leave(). 来表示 该侠客移动NPC的视野,那么对应的 moving(Event, State) 函数就会被调用,其他的处理与 static 时的处理是类似的,这里就不重复表述了。

 

  这个例子还有一些函数,我没有讲到,希望在以后的教程来跟大家分享,谢谢。

分享到:
评论

相关推荐

    Erlang otp_win64_21.1.exe otp_win32_21.1.exe

    它包含了一系列预定义的模块、行为(如GenServer、GenEvent和Gen_fsm)以及设计原则,这些都旨在帮助开发者创建可靠和可扩展的应用程序。例如,Erlang的进程模型允许程序中的组件独立运行,通过消息传递进行通信,这...

    erlang OTP Design Principles之Gen中文

    Erlang OTP设计原则中的Gen_Fsm行为是一个关键的概念,用于构建健壮、可扩展的并发应用程序。Gen_Fsm,即通用有限状态机,是一种行为模式,它提供了一种结构化的方法来处理具有多种状态和事件的系统。本文将深入探讨...

    Erlang otp_win64_22.0

    10. **行为模块**:如GenServer、GenEvent和Gen_fsm等,是OTP的一部分,它们提供了一种组织代码和处理并发行为的标准方式。 压缩包子文件"otp_win64_22.0.exe"的安装流程通常包括以下步骤: 1. 下载并运行安装程序...

    Erlang otp_win64_21和22版本 exe

    - **行为模块**:如GenServer、GenEvent和Gen_fsm等,它们定义了常见的并发模式,简化了状态管理和事件处理。 - **应用程序管理**:OTP提供了应用程序框架,用于组织和管理软件组件,确保其按预期启动、停止和升级...

    erlang_otp_src_17.3.tar.gz

    7. **行为模块**:如gen_server、gen_event、gen_fsm等,是OTP设计模式的具体实现,简化了编写服务器、事件处理器和有限状态机的代码。 关于压缩包内的"otp_src_17.3",这是Erlang OTP 17.3版本的源代码目录。为了...

    Erlang OTP设计原理文档 中文版本

    OTP设计原则着重于实现高度并发、容错性和高效能。下面将详细讨论Erlang OTP中的关键概念和相关知识点。 1. 监督树(Supervision Tree): 监督树是OTP设计的核心概念,它是一种组织Erlang进程的方式。每个节点都...

    Erlang_OTP_设计原理(含目录).pdf

    Erlang OTP设计原理是一份深入探讨Erlang/OTP(Open Telecom Platform)框架中设计模式和组织代码原则的文档。Erlang OTP作为Erlang语言的中间件平台,提供了构建可扩展和容错系统的标准方法。 文档开篇就介绍了...

    基于Erlang的gen_tcp聊天室代码,功能完整

    gen_tcp是Erlang OTP(开放电信平台)提供的一种行为模块,它允许程序员以面向过程的方式处理TCP连接。gen_tcp提供了创建、监听、接受和关闭TCP套接字的函数,以及发送和接收数据的基本操作。 **Erlang的并发特性**...

    otp_win64_23.2.exe

    5. **行为模式**:OTP定义了几种预定义的行为模式,如GenServer、GenEvent和Gen_fsm,这些模式提供了一种组织和管理Erlang进程的标准方式,帮助实现常见的并发和状态管理问题。 6. **公共接口**:OTP还包含各种标准...

    otp_win64_20.3.rar

    2. **行为模式**: 如GenServer、GenEvent和Gen_fsm等,提供了一种结构化的方式来实现常见的并发设计模式。 3. **应用和发布**: OTP应用程序结构定义了如何组织源代码,以及如何管理和部署应用程序。 ** Erlang ** ...

    Erlang OTP并发编程实战(中文版)

    **OTP** 是Erlang环境中的一个核心组件,提供了一系列的设计原则、库以及工具,用于构建高度可靠和容错的分布式系统。OTP包含了行为(Behaviours)、应用(Applications)、释放(Releases)、错误管理(Error ...

    Erlang OTP 设计原理 - 中文版

    例如,Gen_Server和Gen_Fsm都是Erlang OTP提供的行为模式,它们定义了处理消息的基本结构,并要求开发者实现与具体逻辑相关的回调函数。 应用(Application)在Erlang/OTP中是一个封装了代码、模块、资源文件和配置...

    otp_src_R11B-5.tar.gz_OTP_erlang_otp-src-R11B_otp_s

    OTP框架在Erlang之上提供了一系列库、设计原则和开发工具,用于构建可靠和容错的系统。这些库包括Mnesia(分布式数据库)、Event Logger、公共接口定义语言(CIDL)以及行为模式如GenServer、GenEvent和Gen_fsm等。...

    otp_win64_25.0.4.rar

    7. **行为模式**:如GenServer、GenEvent和Gen_fsm等,为常见的设计模式提供抽象,简化了状态管理和事件处理。 8. **热升级**:Erlang系统支持在线代码升级,无需停止服务即可更新应用程序。 9. **编译器与虚拟机*...

    otp_src_21.1.tar.gz

    1. **模块化设计**:OTP提供了各种预定义的进程行为模式(gen_server、gen_event、gen_fsm等),便于开发者创建符合特定模式的进程,提高了代码复用和可维护性。 2. **分布式计算**:Erlang OTP支持跨节点的进程...

    Erlang_OTP_设计原理 中文版

    Erlang的这种设计哲学在Erlang/OTP设计原理中得到了充分的体现。接下来我将详细解释文档中提到的相关知识点。 1. 监督树(Supervision Trees):监督树是Erlang/OTP的核心概念之一,它是一种分层的组织结构,用于...

    otp_src_22.0_h.tar.gz

    OTP提供了几个设计良好的应用框架,如gen_server、gen_event、gen_fsm等,它们是基于行为模式的模块,简化了并发编程和状态管理。 5. **分布式功能** OTP支持跨节点的分布式计算,使得在多台机器上构建分布式系统...

    使用OTP原理构建一个非阻塞的TCP服务器

    OTP为开发健壮、容错的应用提供了强大的框架,它包含了一系列行为模式,如gen_server和gen_fsm,这些模式可以帮助我们构建高效、可扩展的服务。 首先,我们需要理解什么是非阻塞TCP服务器。在Erlang中,"非阻塞"指...

    Inside_Erlang_OTP

    3. 进程行为(Behaviours):如GenServer、GenEvent和Gen_fsm等,为常见的并发模式提供了抽象,简化了开发过程。 4. 公共服务:如Mnesia数据库,一个分布式、事务型的数据库系统,设计用来与Erlang的并发和容错特性...

    otp_src_19.1.tar.gz

    4. **行为模块**:OTP库包含了一系列预定义的行为模块,如GenServer、GenEvent和Gen_fsm等,它们提供了标准的接口和状态管理,简化了复杂应用的开发。 5. **错误恢复和容错机制**:Erlang OTP设计了一套强大的错误...

Global site tag (gtag.js) - Google Analytics