简单Elixir游戏服设计-创建玩家模型
删除model.ex
创建玩家模型 player.ex, 简单化,只有唯一标识,昵称,金币,够用了。
选择 map 代表数据,是为了扩展数据结构,方便增加功能。struct也是可以的。
add_num 和 cost_num 存粹是为了简化代码
一系列的get/set 是为了操作玩家数据用的(也可以减少代码吧)
defmodule Player do
def init do
%{
id: 0, # 唯一标识
name: "", # 昵称
gold: 0, # 金币
}
end def get_id(player), do: player.id
def set_id(player, new_id), do: put_in(player.id, new_id) def set_name(player, new_name), do: put_in(player.name, new_name)
def get_name(player), do: player.name def add(num) when num >=0 , do: &(&1 + num)
def cost(num) when num >=0 , do: &(&1 - num) def get_gold(player), do: player.gold
def add_gold(player, num) , do: update_in(player.gold, add(num))
def cost_gold(player, num), do: update_in(player.gold, cost(num))
end
增加player 的测试 player_test.ex
defmodule PlayerTest do
use ExUnit.Case
doctest Player setup do %{player: Player.init}
end test "设置ID", %{player: player} do
set_id = "test"
new_id = player |> Player.set_id(set_id) |> Player.get_id
assert new_id == set_id
end test "设置昵称", %{player: player} do
set_name = "新名字"
new_name= player |> Player.set_name(set_name) |> Player.get_name
assert new_name == set_name
end test "增加金币", %{player: player} do
num = 10
new_gold = player |> Player.add_gold(num) |> Player.get_gold
old_gold = player |> Player.get_gold
assert new_gold == old_gold + num
end test "减少金币", %{player: player} do
num = 10
new_gold = player |> Player.cost_gold(num) |> Player.get_gold
old_gold = player |> Player.get_gold
assert new_gold == old_gold - num
end
end
我用的sublime,安装elixr包,然后tools ==》 build system ==》 elixr mix test
ctrl + B 就可以测试了。
简单Elixir游戏服设计-创建玩家模型的更多相关文章
- 简单Elixir游戏服设计- 创建项目
反正是写到哪算哪. 创建umbrella项目 mix new simple_game --umbrella 创建model项目 cd simple_game\apps mix new model 创建 ...
- 简单Elixir游戏服设计-玩家进程跑起来
有了玩家模型,我们试试让玩家进程跑起来. 需要搞个PlayerSupervisor来负责启动和监控玩家进程. defmodule PlayerSupervisor do use Supervisor ...
- 简单Elixir游戏服设计- 游戏玩法介绍
抄以前的,做了点修改. 到目前为止,我们完成了玩家的数据和进程建模,现在介绍游戏玩法. 为什么我们还不做客户端接入.协议指定呢?为什么还没有网关和数据存储呢.在我接手的游戏, 这些通常已经定下来了,我 ...
- 简单Elixir游戏服设计-玩家进程注册
上回说用Registry 做本地注册(跨服可以用syn,只是稍微麻烦点,需要模拟global注册机制,写个封装模块). 修改game_server 项目的mix.exs, 增加应用启动 def app ...
- 简单Elixir游戏服设计-玩法simple_poker
上回介绍了玩法,现在编写了玩法的简单建模. 做到现在感觉目前还没有使用umbrella的必要(也许以后会发现必要吧),model 应用完全可以合并到game_server. 代码还在https://g ...
- Elixir游戏服设计五
在<Elixir游戏服设计一>里提到,按照系统功能划分成app要保证原子性很难, 现在想想也没那么难.保证原子性,无非就是需要某个单点去完成操作.那么选择玩家进程去做原子性工作就可以了. ...
- Elixir游戏服设计一
在Erlang游戏服设计总结http://www.cnblogs.com/rubyist/p/5530575.html里, 我提到我想要的游戏服设计方法,希望以应用做为基础构建块.最近我在学习elix ...
- Elixir游戏服设计三
玩家进程用gen_server来建模,我不直接使用 use GenServer, 而是使用exactor,该库可以去掉反锁的接口定义. 我们新建一个 player_server_manager app ...
- 关于Elixir游戏服设计系列
写着写着就废球了,感觉空对空,实在没什么意思. 另外很快就要搞新项目,决定新项目就直接上elixir了.目前该做的准备工作已经探索了一些了. 以下的东西是写给同事参考的,感兴趣的可以看看,提建议更好. ...
随机推荐
- js 中采用词法作用域
所谓的 词法( 代码 )作用域, 就是代码在编写过程中体现出来的作用范围. 代码一旦写好, 不用执行, 作用范围就已经确定好了. 这个就是所谓词法作用域. 在 js 中词法作用域规则: 1.函数允许访 ...
- h5audio标签
因为音频格式有版权,各浏览器使用不同的音频格式. 音频格式兼容性 音频格式 Chrome Firefox IE9 Opera Safari MP3 支持 不支持 支持 不支持 支持 OGG 支持 支持 ...
- chrome开发工具指南(三)
Security 面板 使用 Security Overview 可以立即查看当前页面是否安全. 检查各个源以查看连接和证书详情(安全源)或找出具体哪些请求未受保护(非安全源). Security O ...
- ios 初体验< UISegmentedControl 分段控件>
小知识: 数组快速创建 @[@"",@"",@"",@"".......],字典快速创建方法:@{@"&q ...
- 汇编指令-bic(位清除)、orr(位或)(3)
1. bic (Bit Clear)位清除指令bic指令的格式为:bic{条件}{S} Rd,Rn,operand bic指令将Rn 的值与操作数operand2 的反码按位逻辑"与&q ...
- Springboot与Thymeleaf模板引擎整合基础教程(附源码)
前言 由于在开发My Blog项目时使用了大量的技术整合,针对于部分框架的使用和整合的流程没有做详细的介绍和记录,导致有些朋友用起来有些吃力,因此打算在接下来的时间里做一些基础整合的介绍,当然,可能也 ...
- 【Java IO流】对象的序列化和反序列化
对象的序列化和反序列化 1)对象序列化,就是将Object对象转换成byte序列,反之叫对象的反序列化. 2)序列化流(ObjectOutputStream),是字节的过滤流—— writeObjec ...
- RAID RAID 大揭秘~
p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; f ...
- CCIE-MPLS VPN-实验手册(下卷)
10:跨域的MPLS VPN (Option A) 10.1 实验拓扑 10.1 实验需求 a. R1 R2 R3 组成P-NETWORK R1 R2 R3 位于AS 1,底层协议采用EI ...
- java伪代码
愚公移山的目标是毕力平险,指通豫南,达于汉阴,方法是扣石垦壤,箕畚运于渤海之尾 条件判断if(愚公死了)我的儿子替我完成.循环结构是“子又生孙,孙又生子,子子孙孙无穷匮也” import.java.大 ...