删除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游戏服设计-创建玩家模型的更多相关文章

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

    反正是写到哪算哪. 创建umbrella项目 mix new simple_game --umbrella 创建model项目 cd simple_game\apps mix new model 创建 ...

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

    有了玩家模型,我们试试让玩家进程跑起来. 需要搞个PlayerSupervisor来负责启动和监控玩家进程. defmodule PlayerSupervisor do use Supervisor ...

  3. 简单Elixir游戏服设计- 游戏玩法介绍

    抄以前的,做了点修改. 到目前为止,我们完成了玩家的数据和进程建模,现在介绍游戏玩法. 为什么我们还不做客户端接入.协议指定呢?为什么还没有网关和数据存储呢.在我接手的游戏, 这些通常已经定下来了,我 ...

  4. 简单Elixir游戏服设计-玩家进程注册

    上回说用Registry 做本地注册(跨服可以用syn,只是稍微麻烦点,需要模拟global注册机制,写个封装模块). 修改game_server 项目的mix.exs, 增加应用启动 def app ...

  5. 简单Elixir游戏服设计-玩法simple_poker

    上回介绍了玩法,现在编写了玩法的简单建模. 做到现在感觉目前还没有使用umbrella的必要(也许以后会发现必要吧),model 应用完全可以合并到game_server. 代码还在https://g ...

  6. Elixir游戏服设计五

    在<Elixir游戏服设计一>里提到,按照系统功能划分成app要保证原子性很难, 现在想想也没那么难.保证原子性,无非就是需要某个单点去完成操作.那么选择玩家进程去做原子性工作就可以了. ...

  7. Elixir游戏服设计一

    在Erlang游戏服设计总结http://www.cnblogs.com/rubyist/p/5530575.html里, 我提到我想要的游戏服设计方法,希望以应用做为基础构建块.最近我在学习elix ...

  8. Elixir游戏服设计三

    玩家进程用gen_server来建模,我不直接使用 use GenServer, 而是使用exactor,该库可以去掉反锁的接口定义. 我们新建一个 player_server_manager app ...

  9. 关于Elixir游戏服设计系列

    写着写着就废球了,感觉空对空,实在没什么意思. 另外很快就要搞新项目,决定新项目就直接上elixir了.目前该做的准备工作已经探索了一些了. 以下的东西是写给同事参考的,感兴趣的可以看看,提建议更好. ...

随机推荐

  1. Singleton(单例)模式

    Singleton(单例)模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点. public class Singleton { private static Singleton ourIns ...

  2. jmeter3.2 创建webservice 测试

    1.创建测试计划 templates→select Template→Building a SOAP WebService Test Plan 2.修改HTTP Request Defaults中的参 ...

  3. 201521123118《java程序与设计》第七次作业

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 public bo ...

  4. 201521123102 《Java程序设计》第2周学习总结

    #1. 本周学习总结(1)学习使用码云存储代码(2)掌握了常见数据类型的使用.转换(3)回顾了前面学过的基本语法(4)复习一二三章内容 #2. 书面作业**Q1.使用Eclipse关联jdk源代码,并 ...

  5. 201521123004《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 答:思维导图如下: Java中使用try-catch语法处理异常: try { 可能产生异常的代码段 }catch ...

  6. 201521123100 《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 1.本次PTA作业题集异常 常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己 ...

  7. 201521123019 《Java程序设计》第12周学习总结

    1. 本章学习总结 2. 书面作业 Q1.字符流与文本文件:使用 PrintWriter(写),BufferedReader(读) 1.1 生成的三个学生对象,使用PrintWriter的printl ...

  8. bookStore第二篇【图书模块、前台页面】

    图书模块 分析 在设计图书管理的时候,我们应该想到:图书和分类是有关系的.一个分类可以对应多本图书. 为什么要这样设计?这样更加人性化,用户在购买书籍的时候,用户能够查看相关分类后的图书,而不是全部图 ...

  9. Apache Spark 2.2.0 中文文档 - 概述 | ApacheCN

    Spark 概述 Apache Spark 是一个快速的, 多用途的集群计算系统. 它提供了 Java, Scala, Python 和 R 的高级 API,以及一个支持通用的执行图计算的优化过的引擎 ...

  10. 使用tcpdump拦截linux服务端网络数据

    语法范例: tcpdump -vv -i ens3 '((tcp)&&(host 183.239.240.48)&&(port 3001))'  -c 100 -w 1 ...