- 博客(36)
- 收藏
- 关注
转载 简单Elixir游戏服设计-call和测试不舒服的地方
这个系列写到这里,主要关注的2点在于。1. 到底是call好还是cast好2.到底怎么测试更简单现在发现前面的想法坚持不下来,让我觉得不舒服。1.call还是比较适用于阻塞期间无需及时处理其他消息的用法,这不适合多人游戏。 之前为什么纠结于这个问题,实际上是希望利用call的有返回方便测试。 但后面在进程端的测试其实很少,也就是说没有增益。...
2017-10-25 09:35:00
141
转载 简单Elixir游戏服设计- PlayerServer 怎么设计?
通常,所有的玩家的操作都会经过玩家进程去处理。那么当玩家的操作很多的时候该怎么去设计划分呢?(比如你有任务模块、充值模块、不同玩法模块的时候)。在以前的项目中,大家是这么做的,以数字编码模块,比如handle(1xxxxx)处理登录 handle(2XXXX)处理任务等等。然后1xxxx 一个文件, 2xxxx另一个文件。调用就经过一张路由表去做。不是说这...
2017-10-24 10:33:00
153
转载 简单Elixir游戏服设计- TableServer的测试
上回讲到,游戏逻辑交由Table去测试了,TableServer似乎没有什么可测的了。想了下,TableServer还是有点东西可测的,至少我们可以测试API接口是否正常。所以现在补了点TableServer的测试。代码也做了点修改。另外顺便提一下,如果在一个节点只用1个Registry提供Player/Table等多种注册的话,最好分装几个Global注册的API并增加...
2017-10-23 14:35:00
168
转载 简单Elixir游戏服设计-增加不翻牌和不补牌以及牌局加速测试
这回增加了不翻牌,不补牌操作以及牌局加速的测试。代码已经提交,测试肯定失败!为了使测试通过,我们需要给增加字段标识操作状态。在哪加好呢?table加?可以。但在seat加更自然。我的状态需要标识三种,可以用nil表示尚未操作,true翻牌,false不翻牌。补牌也是。下回使测试通过。不测试,以及使测试通过。代码已经提交。转载于:https...
2017-10-18 09:37:00
105
转载 简单Elixir游戏服设计-关于call还是cast
之前写了篇关于call还是cast的讨论,实际等要改成call的时候又发生了疑问。因为call的确有如下作用:1.阻塞客户端2.有返回值能确定操作是否成功,并能很好的支持测试3.保证时序,只有call成功了,才能继续执行下一步可是除此之外,还有其他好处吗?麻烦呢?如果table_server只是为一个玩家所用,那么可能是合适的。可惜不是,tabl...
2017-10-17 16:21:00
144
转载 简单Elixir游戏服设计- 丰富桌子进程
轮到处理桌子进程了。桌子进程抛开消息发送,基本上就是table的转调用。无谓测试驱动先还是写代码先,反正怎么顺就怎么搞。defmodule TableServer do use GenServer, restart: :temporary, start: {__MODULE__, :start_link, []} def start_link(ta...
2017-10-16 15:09:00
137
转载 简单Elixir游戏服设计-完善测试和代码改进
上回提到SImpleTable有些函数的cond少了true字句,表明我们的测试覆盖不到。这回给增加了上去,并改进了几个api。相应的测试代码也做了更正。有测试做支撑,可以放心修改。已经提交到git,从git看更方便。我们显然还有测试或者功能要完成,比如区分翻牌和补牌阶段,什么时候进入翻牌,什么时候翻牌时间已过?所以牌桌可能建模成准备-> (...
2017-10-16 09:35:00
100
转载 简单Elixir游戏服设计-使table测试通过
error_msg.ex 使用了点宏(废了点时间,一致在尝试抹初那段for,想直接定义个工具宏,由于生疏了没能很快成功,好在for的代码也很简短,而实际上从csv生成的话,也是要做循环工作,算是安慰)defmodule ErrorMsg do @msgs %{ player_not_enough: "player_not_enough"...
2017-10-13 15:03:00
113
转载 简单Elixir游戏服设计- 给table增加测试代码
测试驱动,先simple_table_test.exs里增加测试吧。目前想到的这么多,如果遗漏后续增加,写测试代码比业务代码还是难,好处是提前想下模块的api接口。像我这样一下子写那么多测试,其实也不对,反馈周期太长,测试驱动就没乐趣了,而且代码调整可能导致测试要重新调整。(这里只是示例,以后就不这么搞了)另外想了下,像table这样的整装(意思是协调调用其...
2017-10-13 11:08:00
100
转载 简单Elixir游戏服设计-如何使测试更容易?
发现编写代码的时间和思考测试的时间比例是2:8,甚至于更少。大量的时间花在思考怎么编写测试。无论是否使用测试驱动,我们都需要考虑使测试更容易。测试的目标大致有2点:1. 测试尽可能覆盖全2.同时测试尽量少(测试多了,必然是混乱的)目前写到这里要逐步进入游戏逻辑了。table显然会有状态迁移,我们会给它增加字段。问题是我们怎么测试那些状态逻辑呢?是在table_...
2017-10-12 16:41:00
95
转载 简单Elixir游戏服设计-测试驱动?
我们开始要进行牌局游戏了。前面的开发我都是代码与测试交织进行,代码先的时候多点。但在写测试的时候玩玩发现代码不好测试,又去改代码。所以现在我们改下方式,考虑测试优先。以测试优先的角度去思考,其实前面所有起进程的工作都过早了。应该还是直接测试数据结构的。牌局游戏首先要发牌吧,因此我们最先应该测试的是往Seat加牌。seat_test.exs增加测试代码 tes...
2017-10-12 12:48:00
155
转载 简单Elixir游戏服设计-桌子进程跑起来
像Player进程那样增加TableServer代表桌子进程增加TableSupervisor监控TableServer。使用同一个Registry,因此名字也改成LocalRegistry了。因此Registry的启动代码,以及原来PlayerServer的register_name要做稍微修改。当然你也可以使用2个不同的Registry,但恐怕就要增加一个RegstryS...
2017-10-12 10:38:00
108
转载 简单Elixir游戏服设计-桌子和座位
建模桌子和座位代码比较短小,直接贴吧。model里新建simple_table.ex和seat.ex,项目里新增对应的test.座位部分defmodule Seat do def init(player) do %{ id: player |> Player.get_id, ...
2017-10-11 15:31:00
128
转载 简单Elixir游戏服设计-玩法simple_poker
上回介绍了玩法,现在编写了玩法的简单建模。做到现在感觉目前还没有使用umbrella的必要(也许以后会发现必要吧),model应用完全可以合并到game_server。代码还在https://github.com/rubyist1982/simple上。model应用新增simple_poker.ex , 代码不多,做了点简单注释,可以贴下defmodul...
2017-10-11 11:35:00
137
转载 简单Elixir游戏服设计- 游戏玩法介绍
抄以前的,做了点修改。到目前为止,我们完成了玩家的数据和进程建模,现在介绍游戏玩法。为什么我们还不做客户端接入、协议指定呢?为什么还没有网关和数据存储呢。在我接手的游戏,这些通常已经定下来了,我没法改变。在我开始这个系列时,我也常常陷入这些细节而不知所措,感觉不把所有设施搞完备没法写代码。但其实,这些和游戏服的逻辑关系不大。游戏服的本质就玩家建模、玩法等,有了这些就已经足...
2017-10-10 14:32:00
188
转载 简单Elixir游戏服设计-玩家进程注册
上回说用Registry做本地注册(跨服可以用syn,只是稍微麻烦点,需要模拟global注册机制,写个封装模块)。修改game_server项目的mix.exs,增加应用启动 def application do [ extra_applications: [:logger], mod: {GameServer, []} ...
2017-09-30 14:18:00
123
转载 简单Elixir游戏服设计-玩家进程跑起来
有了玩家模型,我们试试让玩家进程跑起来。需要搞个PlayerSupervisor来负责启动和监控玩家进程。defmodule PlayerSupervisor do use Supervisor def start_link(_opts) do Supervisor.start_link(__MODULE__, :ok, name...
2017-09-30 13:02:00
115
转载 简单Elixir游戏服设计-创建玩家模型
删除model.ex创建玩家模型 player.ex,简单化,只有唯一标识,昵称,金币,够用了。选择map代表数据,是为了扩展数据结构,方便增加功能。struct也是可以的。add_num和cost_num存粹是为了简化代码一系列的get/set是为了操作玩家数据用的(也可以减少代码吧)defmodule Player do def ini...
2017-09-29 15:29:00
115
转载 简单Elixir游戏服设计- 创建项目
反正是写到哪算哪。创建umbrella项目mix new simple_game --umbrella创建model项目cdsimple_game\appsmixnewmodel创建game_server项目同样在apps目录下mix new game_server最后项目结构如下我尝试把它发布出去,结果https://git...
2017-09-29 14:26:00
134
转载 简单Elixir游戏服务器-安装Elixir
用WebInstaller安装半天也没下载成功文件。改成直接下载erlang和elixir预编译包了。安装很简单,最后设置好环境变量。cmd执行 elixir -v最后顺便下载了个githubwindows客户端,以前都是内网用git。这回希望能写完这个简单系列,发布代码出去。转载于:https://www.cnblogs.com/rub...
2017-09-29 14:06:00
234
转载 简单Elixir游戏服务器开篇
以前的Elixir游戏服设计系列种种原因没有完成。后来虽然用Elixir +riak完成了一个麻将的初始版本,可惜公司也挂了。现在到新公司,比较空闲,想着像完成一个心愿一样,还是重启下吧(希望不要又烂尾),改头换面叫简单Elixir游戏服务器系列。一些说明0.没怎么写过博客,也懒得去研究了,说到哪算哪吧,为了自己愉快。所以排版,链接方面可能不好。1.游戏是...
2017-09-29 10:13:00
173
转载 关于Elixir游戏服设计系列
写着写着就废球了,感觉空对空,实在没什么意思。另外很快就要搞新项目,决定新项目就直接上elixir了。目前该做的准备工作已经探索了一些了。以下的东西是写给同事参考的,感兴趣的可以看看,提建议更好。游戏大体分为如下服务器1. 网关服务器(必须)2. 游戏服务器(必须)3. 后台管理服务器(一般必须)4. 数据存储服务器(必须)5. 支付服务器(安桌或...
2016-06-16 17:59:00
138
转载 Elixir游戏服设计六
接上章,我新建了个app做包含Table模型, TableServer等。Table桌子的代码暂时如下, 有一些状态还没用上defmodule Table do @state_accept 0 #准备接入玩家 @state_ready 1 #开局准备? defdelegate [fetch(t, key), get_and_up...
2016-06-01 15:23:00
110
转载 Elixir游戏服设计六
到目前为止,我们完成了玩家的数据和进程建模,现在我们可以开始增加一种玩法上去了。为什么我们还不做客户端接入、协议指定呢?为什么还没有网关和数据存储呢。在我接手的游戏,这些通常已经定下来了,我没法改变。在我开始这个系列时,我也常常陷入这些细节而不知所措,感觉不把所有设施搞完备没法写代码。但其实,这些和游戏服的逻辑关系不大。游戏服的本质就玩家建模、玩法等,有了这些就已经足够跑逻辑...
2016-05-30 17:43:00
106
转载 Elixir游戏服设计五
在《Elixir游戏服设计一》里提到,按照系统功能划分成app要保证原子性很难,现在想想也没那么难。保证原子性,无非就是需要某个单点去完成操作。那么选择玩家进程去做原子性工作就可以了。比如要重置某个任务,需要花费金币和背包里某个物品,那么大概的逻辑是这样的。在玩家进程里def reset_task(task_id) do {need_gold, need_ite...
2016-05-30 14:28:00
140
转载 Elixir游戏服设计四
上章说到我们要引入synhttps://github.com/ostinelli/syn/看过文档,它并没有直接提供{via, Module, Name} 相关的方法。我们需要封装一下。Name暂时可以用id,如果有需要再调整以后有回调需求的话,刚好也可以做在那个模块里。在player_server_manager项目里增加{:syn, "1.4.0"} 运行命令获取依...
2016-05-30 12:53:00
110
转载 Elixir游戏服设计三
玩家进程用gen_server来建模,我不直接使用 use GenServer, 而是使用exactor,该库可以去掉反锁的接口定义。我们新建一个 player_server_manager app吧, 使用 mix new player_server_manager --sup, 会给我们增加sup。然后在mix.exs里增加exactor的依赖如下: defp deps...
2016-05-27 18:05:00
110
转载 Elixir游戏服设计二
搞一个例子,而没有实际的目标,做起来真是烦人。几次三番都想放弃。后来想想,即使最后完成不了完整的服务器,把需要的知识点搞搞,摸熟悉也是好的。这里没有完整的项目目录,主要是对需要的指点进行整理。要完整写个教材的话,话费我太多时间,恐怕我继续不下去。先搞个建模吧。玩家数据目前如下defmodule Player do @behavior Access ...
2016-05-27 16:51:00
141
转载 Elixir游戏服设计一
在Erlang游戏服设计总结http://www.cnblogs.com/rubyist/p/5530575.html里,我提到我想要的游戏服设计方法,希望以应用做为基础构建块。最近我在学习elixir,它有很多方便的语法糖以及很好用的库,能够解决我在游戏中开发中碰到的很多繁琐工作。因此我决定用它来做练手,并期望下个项目中使用它。游戏服的设计通常涉及如下东东:协议...
2016-05-26 14:17:00
137
转载 Erlang游戏服设计总结
这主要是一年多来,个人从事Erlang游戏服开发中对一些事情的思考。想到哪说到哪,没有条理可言。欢迎讨论。通常Erlang游戏服务的设计涉及到的东东包括如下:任务系统活动系统公会系统玩法系统好友系统聊天系统商城转盘以及其他我经历过的项目不多,只有2个。在这2个项目中我看到系统建模都采用如下一锅端的方式:即玩家进程加载了所...
2016-05-26 12:01:00
217
转载 dets
模块说明提供基于文件的项式存储,项式以元组表示,其中某个位置为键,默认第1位置Dets为Mniesia所用,后者增加了事务、查询、和分布式支持。Dets文件不能超过2GB。Dets只有set 、bag、 duplicate_bag 三种类型,没有ordered_set显示调用关闭或者打开的process终止时,都会关闭表。运行时系统意外终止会导致表格没有正确关闭,...
2014-11-23 18:58:00
246
转载 calendar
模块说明本模块提供了本地时间、世界时间、星期几的计算和几个时间转换函数local time 考虑了时区和夏令时,Universal time是取0经度的时间,且没有夏令时。反正是搞不明白了!!!UTC(Universal Coordinated Time) 也叫GMT(Greenwich Mean Time),中文世界时间、格林威治时间、国际标准时间local_t...
2014-11-22 01:12:00
74
转载 binary
模块说明函数经过优化,比等价Erlang实现(比如位语法)更快,更节省内存大部分可用位语法等价实现模块的实现根据EEP(Erlang Enhancement Proposal)31模块只处理面向字节的数据binary,位串Bitstring不是binary,使用会badarg异常操作基于0索引所有的选项列表,后面的选项覆盖前面的选项超出范围的操作会导致ba...
2014-11-21 16:24:00
225
转载 base64
模块说明base64编解码,RFC2045和RFC4648,如果有疑问可看RFC。编码结果比原来大约33%decode和decode_to_string 仅仅忽略空白字符,如空白符、tab、\n等mime_decode和mime_decode_to_string 忽略不合法字符Data Typesascii_string() = [1..255]ascii_b...
2014-11-20 22:59:00
66
转载 array
模块说明实用可扩展的数组。数组描述数组可以随需要固定大小或者自动增长。未设置的条目有默认值。数组开始下标为0,和其他erlang数据结构(比如元组)不同。除非创建数组的时候指定默认值,否则默认为原子undefined。数组无法区分默认值和设置值一样的情况,因此需要避免。数组不会自动收缩;索引I设置了值后,则[0,I]范围都可以访问,除非调用了resize/2...
2014-11-20 14:56:00
75
转载 ActiveRecord Sql Server中文问题2
下面代码在netbean下执行有问题,因为netbean的文件保存格式是utf-8.会报错存在多字节字符。搞不明白。但如果直接存为ANSI即一切正常。记之# coding : gb2312require "rubygems"gem 'activesupport', '=2.3.8'require "active_record"#require 'odbc_...
2010-10-13 16:52:00
109
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人