15 修bug兼整理

好拉 昨天算是一个里程碑,
游戏的核心也快完成了。

来修复一下 可以出手牌没有的牌的 bug

先把 handle_cast :play_card 里面的东西全部搬出去到 play_card_with_checks 方法
然後再用 have_this_card? 来写判断

  def handle_cast({:play_card, player, card}, game) do
    if have_this_card?(game, player, card) do
      {:noreply, play_card_with_checks(game, player, card)}
    else
      {:noreply, game}
    end
  end

  def have_this_card?(game, player, card) do
    game
    |> Map.get(player)
    |> Map.get(:hand)
    |> Enum.member?(card) # 检查 card 有没有在 hand 里面
  end

  def play_card_with_checks(%{turn: current_turn} = game, player, card) do
    game
    |> play_card_for(player, card)
    |> end_turn()
    |> add_wins()
    |> end_round()
    |> end_game()
    |> start_turn_timer(current_turn)
  end

  defp start_turn_timer(game, current_turn \\ 0) do
    if game.status == :start && current_turn != game.turn do
      Process.send_after(self(), {:times_up, :host, game.round, game.turn}, 1500)
      Process.send_after(self(), {:times_up, :guest, game.round, game.turn}, 1500)
    end

    game
  end

最後这边我还把 开启倒数计时 也做成独立的方法,他接收 game, 回传 game,
让我们可以把它直接串在 出牌的那一串 pipe

  def init(game) do
    {:ok, start_turn_timer(game)}
  end

init 那边也有用到,现在可以直接呼叫 start_turn_timer 就好了
另外 start_turn_timer 收的参数里面 \\是指预设的值,如果没有给就是 0
0 是给 init 用的,确保他依定会发动

诶我这个方法一直整理不好

add_wins 这个判断该 round 是谁赢,并且在他的 wins 里面加一
这个方法我怎麽写都不满意,我现在又改成这样。

  defp add_wins(%{turn: turn, host: host, guest: guest} = game) when turn > 3 do
    if host_win_this_round?(game) do
      assign_to_player(game, :host, :wins, game.host.wins + 1)
    else
      assign_to_player(game, :guest, :wins, game.guest.wins + 1)
    end
  end

  defp add_wins(game), do: game

  defp host_win_this_round?(%{round: round, host: host, guest: guest}) 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)
    host_win = get_score(host_desk) > get_score(guest_desk)

    if reverse?(host_desk ++ guest_desk) do
      host_win
    else
      !host_win
    end
  end

满困扰的,你觉得怎样改好

然後我现在才发现,这样子假如分数一样会变成 guest 赢,
我写的时候完全忘记之前订说,如果分数一样的话,有比较大的卡的人赢
不过我现在有点不想这样做,明天来看看怎麽办。
或者是就先这样XD


回来修正错误
原本 ! 的地方放反了

  if reverse?(host_desk ++ guest_desk) do
    !host_win
  else
    host_win
  end

<<:  Day-15 : image_tag 咩啊抓用置入图片?

>>:  Day#14 注册与按钮

30天学会Python: Day 23-交换数值

要交换两个变数的值,在 Python 有几种写法 可以先另外建立一个变数,再互相指派,假设输入的数值...

Material UI in React [Day 3] Layout (Grid & ThemeProvider)

Grid 今天要讲解的是Grid排版的部分,如果是有使用过bootstrap的经验的朋友,其实它的逻...

VC++6 最小化 Win32 Application

● 1 ● 创建 Win32 Application 并使用 「A simple Win32 app...

Day02 - 盘点需求,准备环境与工具

在大致了解完永丰金APIs的两大面向後,接下来要选择与决定要使用什麽语言或工具来完成接下来的开发与串...

[第四只羊] 迷雾森林建筑工事 III 透过Jumpstarter建立新专案

天亮了 昨晚是平安夜 关於迷雾森林故事 洛神降临 图片来源 她就是洛神啊 以前只听过爸妈说过 这还是...