Erlang入门:服务进程实例操作与练习3
2015-01-13 12:39
363 查看
银行服务使用示例:
创建用户:bank_server:create_account(myname, 100).
用户存钱:myname ! {deposit, 10}.
用户取钱:myname ! {cash1, 20}.
myname ! {cash2, 30}.
查询余额:myname ! check.
========================
游戏角色使用示例:
创建角色:{ok, Pid} = game_server:create_player(Id, Hp, Mp).
角色加血:Pid ! {add_hp, 100}.
角色加魔:Pid ! {add_mp, 100}.
查看角色:Pid ! show.
创建用户:bank_server:create_account(myname, 100).
用户存钱:myname ! {deposit, 10}.
用户取钱:myname ! {cash1, 20}.
myname ! {cash2, 30}.
查询余额:myname ! check.
========================
游戏角色使用示例:
创建角色:{ok, Pid} = game_server:create_player(Id, Hp, Mp).
角色加血:Pid ! {add_hp, 100}.
角色加魔:Pid ! {add_mp, 100}.
查看角色:Pid ! show.
%% @author Rolong %% %% server module Callback module %% ----------------- --------------- %% %% start(Module, Args) ---> Module:init(Args) -> {ok, State} %% %% Pid ! Msg ---> Module:handle(Msg, State) -> {ok, State} -module(server). -compile(export_all). -spec start(Mod, Args) -> {ok, Pid} when Mod :: atom(), Args :: [term(), ...], Pid :: pid(). start(Mod, Args)-> {ok, State} = Mod:init(Args), Pid = spawn(?MODULE, server, [Mod, State]), {ok, Pid}. server(Mod, State) -> receive Msg -> {ok, State1} = Mod:handle(Msg, State), server(Mod, State1) end.
%% @author Rolong -module(bank_server). -compile(export_all). -define(I(F), io:format(F++"~n", [])). -define(I(F, A), io:format(F++"~n", A)). %% 银行服务使用示例: %% %% 创建用户:bank_server:create_account(myname, 100). %% 用户存钱:myname ! {deposit, 10}. %% 用户取钱:myname ! {cash1, 20}. %% myname ! {cash2, 30}. %% 查询余额:myname ! check. %%'银行开户,并存入初始金额 -spec create_account(Name, Money) -> any() when Name :: atom(), Money :: integer(). create_account(Name, Money)-> {ok, Pid} = server:start(?MODULE, [Money]), %% 假设年费为10 Pid ! {yearly, 10}, erlang:register(Name, Pid). %%. init([Money]) -> {ok, Money}. %%'银行服务窗口 %%'存钱 handle({deposit, AddMoney}, Money) -> NewMoney = Money + AddMoney, ?I("deposit money: ~w -> ~w", [Money, NewMoney]), {ok, NewMoney}; %%. %%'取钱(可透支) handle({cash1, SubMoney}, Money) -> NewMoney = Money - SubMoney, ?I("deposit money: ~w -> ~w", [Money, NewMoney]), {ok, NewMoney}; %%. %%'取钱(不可透支) handle({cash2, SubMoney}, Money) -> NewMoney = Money - SubMoney, case NewMoney > 0 of true -> %% 支取成功 ?I("deposit money: ~w -> ~w", [Money, NewMoney]), {ok, NewMoney}; false -> %% 支取失败 提示余额不足 ?I("Insufficient balance, current money is ~w", [Money]), {ok, Money} end; %%. %%'扣年费(这里假设10秒为一年) handle({yearly, Payment}, Money) -> Year = case get(year) of undefined -> put(year, 0), 0; Y -> YY = Y + 1, put(year, YY), YY end, erlang:send_after(10 * 1000, self(), {yearly, Payment}), Reply = if Money =< 0 -> %% 没有钱可以扣 Money; Year =:= 0 -> %% 还不到一年,不用扣 Money; true -> NewMoney = Money - Payment, case NewMoney > 0 of true -> %% 扣费成功 ?I("Yearly Payment: ~w -> ~w", [Money, NewMoney]), NewMoney; false -> %% 余额不足以扣年费,则扣到0为止 ?I("Yearly Payment: ~w -> ~w", [Money, 0]), 0 end end, {ok, Reply}; %%. %%'查询 handle(check, Money) -> ?I("Current money is: ~w", [Money]), {ok, Money}; %%. %%'收到目前不受理的业务,反馈给客户 handle(Msg, Money) -> ?I("Do NOT accept business:~p", [Msg]), {ok, Money}. %%. %%. %% vim: set filetype=erlang foldmarker=%%',%%. foldmethod=marker:
%% @author Rolong %% %% 游戏角色使用示例: %% 创建角色:{ok, Pid} = game_server:create_player(Id, Hp, Mp). %% 角色加血:Pid ! {add_hp, 100}. %% 角色加魔:Pid ! {add_mp, 100}. %% 查看角色:Pid ! show. -module(game_server). -compile(export_all). -define(I(F), io:format(F++"~n", [])). -define(I(F, A), io:format(F++"~n", A)). -record(state, { id = 0 ,hp = 0 ,mp = 0 }). -spec create_player(Id, Hp, Mp) -> {ok, Pid} when Id :: integer(), Hp :: integer(), Mp :: integer(), Pid :: pid(). create_player(Id, Hp, Mp) -> server:start(?MODULE, [Id, Hp, Mp]). init([Id, Hp, Mp]) -> State = #state{id = Id, hp = Hp, mp = Mp}, {ok, State}. handle({add_hp, AddHp}, #state{hp = Hp} = State) -> NewHp = Hp + AddHp, State1 = State#state{ hp = NewHp }, ?I("Add HP: ~w + ~w = ~w", [Hp, AddHp, NewHp]), {ok, State1}; handle({add_mp, AddMp}, #state{mp = Mp} = State) -> NewMp = Mp + AddMp, State1 = State#state{ mp = NewMp }, ?I("Add MP: ~w + ~w = ~w", [Mp, AddMp, NewMp]), {ok, State1}; handle(show, #state{id = Id, hp = Hp, mp = Mp} = State) -> ?I("ID: ~w, HP:~w, MP:~w", [Id, Hp, Mp]), {ok, State}; handle(logout, _State) -> ?I("logout ..."), %% TODO: Save to database ... exit(normal); handle(Msg, State) -> ?I("received undefined message:~p", [Msg]), {ok, State}.
相关文章推荐
- Erlang入门:服务进程实例操作与练习1
- Erlang入门:服务进程实例操作与练习2
- Erlang入门:进程实例操作与练习2
- Erlang入门:进程实例操作与练习1
- Erlang入门:进程实例操作与练习3(选修)
- Erlang入门:gen_server实例操作与练习1
- Erlang入门:gen_server实例操作与练习2
- Erlang入门:构建application练习4(进程link的作用)
- WCF热门问题编程示例(2)多个实例调用一个WCF服务操作,需要等待服务响应吗
- [原创]Zenoss配置入门-监控Linux的进程和IP服务
- [sed与Awk教程入门与实例练习]
- Windows server 2012 新功能试用---- powershell 3.0 进程和服务的操作 推荐
- WCF热门问题编程示例(2)多个实例调用一个WCF服务操作,需要等待服务响应吗
- COM/DCOM开发练习之进程内组件实例
- c#操作进程、服务、注册表(源码测试通过)
- COM/DCOM开发练习之进程外组件实例
- COM/DCOM开发练习之远程进程外组件实例
- javascript JSON操作入门实例
- sed与Awk教程入门与实例练习(ZZ)
- WCF热门问题编程示例(2)多个实例调用一个WCF服务操作,需要等待服务响应吗