设为首页 加入收藏

TOP

简单Elixir游戏服设计-玩法simple_poker(一)
2017-10-11 13:59:19 】 浏览:8760
Tags:简单 Elixir 游戏 设计 玩法 simple_poker

上回介绍了玩法,现在编写了玩法的简单建模。

做到现在感觉目前还没有使用umbrella的必要(也许以后会发现必要吧),model 应用完全可以合并到game_server。

代码还在https://github.com/rubyist1982/simple 上。

model 应用新增 simple_poker.ex , 代码不多,做了点简单注释,可以贴下

defmodule SimplePoker do
    @cards  for i <- 1..4, j<- 1..13, do: {i, j}
    @ten 10
    @ace 1
    @tian_gong [8,9]
    @ignore 0
    def init_cards, do: @cards
    # 洗牌
    def shuffle(cards), do: cards |> Enum.shuffle

    # 初始发牌
    def init_deal(cards, seat_num) do
        {cs, left} = cards |> Enum.split(seat_num * 2)
        {:ok, Enum.chunk_every(cs, 
		    
 
			
span>2), left} end # 补单张 def deal([card| left]), do: {:ok, card, left} def single_point({_, p}) when p < @ten, do: p def single_point(_), do: @ten def normal_power(cards) do sum = cards |> Enum.map( &single_point(&1) ) |> Enum.sum rem(sum, @ten) end # 牌力计算, 需参考是否开牌 def power([_a, _b] = cards, is_open) do p = normal_power(cards) cond do p in @tian_gong and is_open -> {:tian_gong, p} true ->{:normal, p} end end def power(cards, false) do cond do is_flush_straight?(cards) -> {:flush_straight, @ignore} is_three?(cards) -> {:three, @ignore} is_flush?(cards) -> {:flush, @ignore} is_straight?(cards) -> {:straight, @ignore} true -> {:normal, normal_power(cards)} end end # a 是否赢 b # 都是天公,比点数 def win?({:tian_gong, p1}, {:tian_gong, p2}), do: p1 > p2 # 天公比其他都大 def win?({:tian_gong, _}, _), do: true def win?(_, {:tian_gong, _}), do: false # 非普通牌,通牌型一样大 def win?({same, _}, {same, _}) when same != :normal, do: false # 同花顺比余下都大, 以下类推 def win?({:flush_straight, _}, _), do: true def win?(_, {:flush_straight, _}), do: false def win?({:three, _}, _), do: true def win?(_, {:three, _}), do: false def win?({:flush, _}, _), do: true def win?(_, {:flush, _}), do: false def win?({:straight, _}, _), do: true def win?(_, {:straight, _}), do: false # 普通牌需要比较点数 def win?({:normal, p1}, {:normal, p2}), do: p1 > p2 # 赢多少倍 def multiply({:tian_gong, _}), do: 1 def multiply({:flush_straight, _}), do: 16 def multiply({:three, _}), do: 8 def multiply({:flush, _}), do: 4 def multiply({:straight, _}), do: 2 def multiply({:normal, _}), do: 1 def is_flush?([{s, _}, {s, _}, {s, _}]), do: true def is_flush?(_), do: false def is_straight?([{_, p1}, {_, p2}, {_, p3}]) do [n1, n2, n3] = [p1, p2, p3] |> Enum.sort cond do n1 + 1 == n2 and n2 + 1 == n3 -> true n1 == @ace and n2 + 1 == n3 -> true n1 == @ace and n2 + 2 == n3 -> true true -> false end end def is_three?([{_, p}, {_, p}, {_, p}]), do: true def is_three?([{_, p1}, {_, p2}, {_, p3}]) do case [p1, p2, p3] |> Enum.sort do [@ace, @ace, _] -> true [@ace, n, n] -> true _other -> false end end def is_flush_straight?(cards), do: is_flush?(cards) and is_straight?(cards) end # SimplePoker.init_cards |> SimplePoker.shuffle |> IO.inspect # SimplePoker.init_cards |> SimplePoker.init_deal(2) |> IO.inspect
simple_poker.ex

测试代码 simple_poker_test.exs

defmodule SimplePokerTest do
  use ExUnit.Case
  doctest SimplePoker

  setup do
      %{
          s_ace: {1,1},   # 黑桃A
          h_ace:  {2, 1}, # 红桃A,
          c_ace: {3, 1},  # 梅花A
          s_two: {1, 2},  # 黑桃2
          h_two: {2, 2},  # 红桃2
          c_two: {3, 2},  # 梅花2
          s_three: {1, 3},  # 黑桃3
          h_three: {2, 3}, # 红桃3
          s_four: {1, 4},  # 黑桃4
          h_four: {2, 4},  # 红桃4
          s_five: {1, 5}, # 黑桃5
          s_eight: {1, 8}, # 黑桃8
          s_nine:
			
		  
编程开发网
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇简单Elixir游戏服设计-桌子进程跑.. 下一篇【windows环境下】RabbitMq的安装..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

array(4) { ["type"]=> int(8) ["message"]=> string(24) "Undefined variable: jobs" ["file"]=> string(32) "/mnt/wp/cppentry/do/bencandy.php" ["line"]=> int(217) }