好拉 昨天算是一个里程碑,
游戏的核心也快完成了。
先把 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 咩啊抓用置入图片?
要交换两个变数的值,在 Python 有几种写法 可以先另外建立一个变数,再互相指派,假设输入的数值...
Grid 今天要讲解的是Grid排版的部分,如果是有使用过bootstrap的经验的朋友,其实它的逻...
● 1 ● 创建 Win32 Application 并使用 「A simple Win32 app...
在大致了解完永丰金APIs的两大面向後,接下来要选择与决定要使用什麽语言或工具来完成接下来的开发与串...
天亮了 昨晚是平安夜 关於迷雾森林故事 洛神降临 图片来源 她就是洛神啊 以前只听过爸妈说过 这还是...