经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Erlang » 查看文章
简单Elixir游戏服设计-桌子进程跑起来
来源:cnblogs  作者:damnit  时间:2018/9/25 20:32:16  对本文有异议

像Player进程那样增加TableServer代表桌子进程

增加TableSupervisor监控TableServer。使用同一个Registry,因此名字也改成LocalRegistry了。

因此Registry的启动代码,以及原来PlayerServer的register_name要做稍微修改。

当然你也可以使用2个不同的Registry,但恐怕就要增加一个RegstrySupervisor 去start_child了,

又或者手动启动2个(更加不建议)。

新的game_server.ex

  1. defmodule GameServer do
  2. use Application
  3. def start(_type, _args) do
  4. children = [
  5. {Registry, keys: :unique, name: LocalRegistry},
  6. PlayerSupervisor,
  7. TableSupervisor
  8. ]
  9. Supervisor.start_link(children, strategy: :one_for_one)
  10. end
  11. end
game_server.ex

PlayerServer 的register_name 应该按table_server 那样修改,这样清晰,并且也不会冲突。

  1. defmodule TableServer do
  2. use GenServer, restart: :temporary, start: {__MODULE__, :start_link, []}
  3. def start_link(table) do
  4. GenServer.start_link(__MODULE__, table, name: register_name(table))
  5. end
  6. def init(table) do
  7. {:ok, table}
  8. end
  9. def register_name(%{} = table), do: register_name(table |> SimpleTable.get_id)
  10. def register_name(id), do: {:via, Registry, {LocalRegistry, {Table, id}}}
  11. def exist?(table) do
  12. key = {Table, table |> SimpleTable.get_id}
  13. case Registry.lookup(LocalRegistry, key) do
  14. [{_pid, _}] -> true
  15. [] -> false
  16. end
  17. end
  18. end
table_server.ex

新增了exist? 判断函数,以后会有用吧。

原则上当玩家创建了一个牌局后,没解散之前不允许再创建(当然你可以改,我只是简化了)

table_supervisor 测试

  1. defmodule TableSupervisorTest do
  2. use ExUnit.Case
  3. doctest PlayerSupervisor
  4. setup do
  5. Application.stop(GameServer)
  6. Application.start(GameServer)
  7. %{}
  8. end
  9. test "测试TableSupervisor启动TableServer" do
  10. table1 = SimpleTable.init |> SimpleTable.set_id(1)
  11. table2 = SimpleTable.init |> SimpleTable.set_id(2)
  12. assert {:ok, _p1} = TableSupervisor.start_table(table1)
  13. assert {:ok, _p2} = TableSupervisor.start_table(table2)
  14. assert TableServer.exist?(table1)
  15. assert TableServer.exist?(table2)
  16. end
  17. end

改成使用exist? 了

player_supervisor_test.exs 也照着修改。

编译测试ok。

代码变迁参看git吧。

下回我们由玩家创建牌局,一步步展开吧。

XXXX,想了下 上句话不对,创建那些跟玩法也没有关系,先放着,直接起牌局玩才对。

XXXXX,上句好像也不对,本质上server进程只是转调用数据结构的操作,因此牌局玩法完全可以是数据结构的操作先。

所以下回我们直接操作数据,进行牌局。

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号