这个方法实在太扯了,他很明显的有分成三个区块,
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
今天是参赛的最後一天,至此已经讲解完侧边栏位的内容了,之後会再整理每一章节的范例在 code sen...
虽然之前有看过 slice / array 比较的文章, 但在写 leetcode 时还是碰到点小麻...
为了做火焰烤饼而自制酸奶油,做完烤饼还有剩下的酸奶油,所以试着找了其他酸奶油料了,意外发现了俄罗斯的...
1.除错查看var_dump、echo gettype,看变数有没有错 echo gettype($...
建议跟Node.js搭配食用--->https://ithelp.ithome.com.tw/...