Elixir游戏服设计六

接上章,我新建了个app做包含Table模型, TableServer等。Table桌子的代码暂时如下, 有一些状态还没用上

defmodule Table do

    @state_accept 0   #准备接入玩家
    @state_ready 1    #开局准备?
    defdelegate [fetch(t, key), get_and_update(t, key, list)], to: Map
    defstruct [:config, :seats, :state]
    def new(config) do
        %Table{
            config: config,
            seats: %{},
            state: @state_accept
        }
    end

    def is_full?(table) do
        cur_count = Enum.count(table.seats)
        cur_count >= table.config.allow_count
    end

    def has_player?(table, player_id) do
        table.seats[player_id]
    end

    def check_in(table, player) do
        update_in(table.seats, &(Map.put(&1, player.base_info.id, player)))
    end

    def check_out(table, player_id) do
        update_in(table.seats, &(Map.delete(&1, player_id)))
    end
end

我们需要相关的配置table_config.txt

id,     allow_count,   base_gold,   need_gold,     desc
int,    int,           int,         int,        string
1,      4,             10,          480,         新手场
2,      4,             100,         4800,        中级场
3,      4,             1000,        48000,       高级场

这个txt可以由excel通过xslx2csv工具生成。然后我们利用table_config.txt 生成代码配置table_config.ex.

我们当然可以在TableConfig里经由excel文件直接生成,那样会更方便。

defmodule TableConfig do
    Module.register_attribute __MODULE__, :column_names, []
    Module.register_attribute __MODULE__, :column_types, []
    Module.register_attribute __MODULE__, :config, []
    line_with_index = File.stream!(Path.join([__DIR__, "table_config.txt"]) , [], :line)
                      |> Stream.with_index
    for {line, index} <- line_with_index do
        items = line |> String.split(",") |> Stream.map(&String.strip(&1))
        case index do
            0 ->
                @column_names items |> Enum.map(&String.to_atom(&1))
            1 ->
                @column_types items
                              |> Stream.with_index
                              |> Enum.map(fn {v, i} -> {i, String.to_atom(v)} end)
                              |> IO.inspect
                              |> Enum.into(%{})
            _ ->
                new_items = items
                            |> Stream.with_index
                            |> Stream.map( &( TypeConverter.convert(&1, @column_types) ) )
                zip = Enum.zip(@column_names, new_items)
                @config  Enum.into(zip, %{})
                IO.inspect @config            # 以下函数花了我点时间,最后不得不通过模块属性完成,我不知道有没有其他方法         # 早期的版本是者这样的               # config = Enum.into(zip, %{})               # def get(unquote(config.id)) do               #   unquote(config)  # 这里会报错,百思不得其解,在ErrorMsg里我是这样用的,没有问题。不知2者区别在哪               # end
                def get(unquote(@config.id)) do
                    @config
                end
        end
    end

end

最后上点测试代码table_test.exs

defmodule TabelTest do
  use ExUnit.Case
  # import PipeHere
  setup do
      config = TableConfig.get(1)
      table = Table.new(config)
      {:ok, table: table}
  end

  test "table is full ", %{table: table} do
      new_table =
        1..table.config.allow_count
        |> Stream.map(&Player.new/1)
        |> Enum.reduce(table, fn p, acc -> Table.check_in(acc, p) end)
    assert new_table |> Table.is_full?
  end

  test "table has player", %{table: table} do
       p1 = Player.new(1)
       p2 = Player.new(2)
       new_table = Table.check_in(table, p1)
       assert Table.has_player?(new_table, p1.base_info.id)
       refute Table.has_player?(table, p2.base_info.id)
  end

  test "table check_in_and_out", %{table: table} do
        p1 = Player.new(1)
        new_table = Table.check_in(table, p1)
        check_out_table = Table.check_out(new_table, p1.base_info.id)
        refute Table.has_player?(check_out_table, p1.base_info.id)
  end
end

下一小节会从牌局开始吧,然后TableServer,然后让它跑起来。

时间: 2024-12-21 02:20:09

Elixir游戏服设计六的相关文章

Elixir游戏服设计三

玩家进程用gen_server来建模,我不直接使用 use GenServer, 而是使用exactor,该库可以去掉反锁的接口定义. 我们新建一个 player_server_manager app吧, 使用 mix new player_server_manager --sup, 会给我们增加sup.然后在mix.exs里增加exactor的依赖如下: defp deps do [{:exactor, "~> 2.2"}] end 跑 mix deps.get,成功了依赖就准

关于Elixir游戏服设计系列

写着写着就废球了,感觉空对空,实在没什么意思. 另外很快就要搞新项目,决定新项目就直接上elixir了.目前该做的准备工作已经探索了一些了. 以下的东西是写给同事参考的,感兴趣的可以看看,提建议更好. 游戏大体分为如下服务器 1. 网关服务器(必须) 2. 游戏服务器(必须) 3. 后台管理服务器(一般必须) 4. 数据存储服务器(必须) 5. 支付服务器(安桌或者第三方回调的话,必须) Elixir umbrella 项目目录结构可大概如下 1. 游戏数据模型(包括简单的获取更新逻辑) 2.

简单Elixir游戏服设计-玩家进程跑起来

有了玩家模型,我们试试让玩家进程跑起来. 需要搞个PlayerSupervisor来负责启动和监控玩家进程. defmodule PlayerSupervisor do use Supervisor def start_link(_opts) do Supervisor.start_link(__MODULE__, :ok, name: __MODULE__) end def init(:ok) do Supervisor.init([PlayerServer], strategy: :simp

Elixir游戏服设计四

上章说到我们要引入syn https://github.com/ostinelli/syn/ 看过文档,它并没有直接提供{via, Module, Name} 相关的方法.我们需要封装一下. Name暂时可以用id,如果有需要再调整 以后有回调需求的话,刚好也可以做在那个模块里. 在player_server_manager项目里增加{:syn, "1.4.0"} 运行命令获取依赖 修改application 方法,增加依赖 def application do [applicatio

简单Elixir游戏服设计- 创建项目

反正是写到哪算哪. 创建umbrella项目 mix new simple_game --umbrella 创建model项目 cd simple_game\apps mix new model 创建 game_server 项目 同样在apps目录下 mix new game_server 最后项目结构如下 我尝试把它发布出去,结果 https://github.com/rubyist1982/simple.git 和我预期的不一样,我初始应该以项目做仓库好点.

Erlang游戏服设计总结

这主要是一年多来,个人从事Erlang游戏服开发中对一些事情的思考. 想到哪说到哪,没有条理可言. 欢迎讨论. 通常Erlang游戏服务的设计涉及到的东东包括如下: 任务系统 活动系统 公会系统 玩法系统 好友系统 聊天系统 商城 转盘 以及其他 我经历过的项目不多,只有2个.在这2个项目中我看到系统建模都采用如下一锅端的方式: 即玩家进程加载了所有玩家数据,处理所有可能的系统: 整个游戏服通常只有玩家进程.公会进程.玩法进程以及一些公共进程. 整个游戏服里你看到的都是进程,看不到应用. 通常玩

游戏开发经验谈(二):对战类全球服游戏的设计与实现

上篇文章<游戏开发经验谈(一):游戏架构里隐藏的五个坑及其应对方案>,我们主要讲解了游戏架构设计当中隐藏的一些坑及其应对方案,错过的小伙伴可以点击链接回溯之前的内容.本期内容,将会重点介绍对战类全球服游戏的设计思路与技术实现. 对战类游戏的设计思路 协议的选择 游戏设计之初,需要决定选择哪种协议来进行通讯.对于对战类游戏来说,首先推荐的肯定是UDP. 尽管UDP对开发基础有较高的要求,需要开发者自己实现传输成功检验.重传以及可靠性保证等,但相对于低开发成本的TCP,UDP在效率和时效性上都有极

FPS游戏服务器设计的问题 【转】

一.追溯 去gameloft笔试,有一个题目是说: 叫你去设计一个FPS(第一人称射击游戏),你是要用TCP呢还是要用UDP,说明理由 . 二.学习 这是两篇网上找到的文章,写非常不错. 当时笔试的时候自己没想到这么全,但大概想法都是一致的,摘录下来再学习一下. 1.网络游戏程序员须知 UDP vs TCP 作者:[email protected] 首发链接:http://blog.csdn.net/rellikt/archive/2010/08/21/5829020.aspx 这篇教程让我们就

说说我们的游戏动画设计

游戏美术行情在线 在我国游戏动画行业是比较特殊的行业,是国家大力发展行业,是一个起点低发展快的行业,游戏动画设计制作人才是我国游戏动画发展的不可缺少的一部分.在此背景下,游戏动画人才水涨船高,成为人才市场上最紧俏的人才之一.加上游戏动画产业范围广.衍生品多,.拓展空间大,所以我国游戏动画设计制作人才需求量非常大. 目前游戏美术培训机构多以3dmax游戏动画制作课程为主,那到底什么是3dmax游戏动画制作呢? 我们制作的过程分成九个步骤,分别是: 一.模型检查:检查模型是否符合动作制作要求以及项目