13 出牌倒数要怎麽做才好?

整理一下算分数方法

这个方法实在太扯了,他很明显的有分成三个区块,

  1. 用 round 拿到该范围的卡
  2. 算该局分数
  3. 检查要不要reverse
  defp calculate_score(%{host: %{desk: host_desk}, guest: %{desk: guest_desk}, round: round}) do
    [host_cards, guest_cards] =
      Enum.map([host_desk, guest_desk], &Enum.slice(&1, (round - 1)..(round * 3 - 1)))

    [host_score, guest_score] =
      [host_cards, guest_cards]
      |> Enum.map(&Enum.reject(&1, fn card -> card == :reverse end))
      |> Enum.map(&Enum.sum(&1))

    reverse =
      [host_desk, guest_desk]
      |> Enum.map(&Enum.filter(&1, fn card -> card == :reverse end))
      |> List.flatten()
      |> length()
      |> rem(2) == 1

    %{host: host_score, guest: guest_score, reverse: reverse}
  end

我把检查 reverse 跟 算分数 拆开成方法

  defp reverse?(desk) do
    desk
    |> Enum.filter(&(&1 == :reverse))
    |> length()
    |> rem(2) == 1
  end

  defp get_score(desk) do
    desk
    |> Enum.reject(&(&1 == :reverse))
    |> Enum.sum()
  end

把限制范围放在 呼叫上两个方法的前面

  defp add_wins(%{turn: turn, round: round, host: host, guest: guest} = game) when turn > 3 do
    range_start = (round - 1) * 3
    range = range_start..(range_start + 2) # 取该局的范围
    
    host_desk = Enum.slice(host.desk, range)
    guest_desk = Enum.slice(guest.desk, range)

    # 原本的统一从传回来的值拿结果,改成直接呼叫方法。
    if apply_reverse(
         get_score(host_desk) > get_score(guest_desk),
         reverse?(host_desk ++ guest_desk)
       ) do
      assign_to_player(game, :host, :wins, game.host.wins + 1)
    else
      assign_to_player(game, :guest, :wins, game.guest.wins + 1)
    end
  end

出牌倒数规划

都连线游戏了,总不能让对方一直等

我想做成,每个 turn 如果 30 秒内没有出牌的话,系统帮你随机出
之後想要的话再看看要不要做成可以调整时限,

要做的事情大概是

在游戏开始与换回合的时候使用 Process.send_after

  Process.send_after(self(), {:times_up, :host, 1, 1}, 30000)

第三个变数是时间,单位为毫秒

再使用 handle_info 接收定时随机出牌的命令

  def handle_info({:times_up, :host, round, turn}, game) do
    # 检查他在指定 round 的指定 turn 有没有出牌了
    # 没有的话帮 host 出牌
  end

明天来试试看这个方向好不好做


<<:  [铁人赛 Day12] 来读 Hooks FAQ 文件吧! - Hooks 取代 render props 跟 HOC 的用法了吗?

>>:  [Day12] Storybook - Writing Docs

Material UI in React [ Day 30 ] 总结

今天是参赛的最後一天,至此已经讲解完侧边栏位的内容了,之後会再整理每一章节的范例在 code sen...

【Go】多维 slice / array

虽然之前有看过 slice / array 比较的文章, 但在写 leetcode 时还是碰到点小麻...

Day 26 战斗民族-俄罗斯酸奶牛肉 Beef Stroganoff

为了做火焰烤饼而自制酸奶油,做完烤饼还有剩下的酸奶油,所以试着找了其他酸奶油料了,意外发现了俄罗斯的...

Day 38 (PHP)

1.除错查看var_dump、echo gettype,看变数有没有错 echo gettype($...

Day 08-制作购物车系统环境之npm

建议跟Node.js搭配食用--->https://ithelp.ithome.com.tw/...