【发布时间】:2020-07-14 02:53:20
【问题描述】:
我正在尝试为扑克游戏建模。
我的游戏状态表示在地图中,对于这个问题,我只对玩家感兴趣。
{:players {:1 {:money 200} :2 {money 400}}}
每个函数都接受一个游戏状态和一些其他参数并返回一个新的游戏状态,例如:
(defn update-player-money
"Returns new game state where player has added amount to his money"
[game-state player amount]
(assoc-in game-state [:players player :money]
(+ (-> game-state :players player :money)
amount)))
现在我想要一个函数,在传递新游戏状态的同时从每个玩家身上移除一定数量的钱。 为了清楚起见,两个玩家会做的事情:
(update-player-money (update-player-money game-state :1 (- 20)) :2 (-20))
这是我想出的:
(defn phase-1-blind
"Removes blind from all players."
[game-state blind-amount]
(letfn [(blind-helper [game-state player-list amount]
(if (seq player-list)
(blind-helper (update-player-money game-state
(first player-list)
(- amount))
(rest player-list)
amount)
game-state))]
(blind-helper game-state (keys (:players game-state)) blind-amount)))
这可行,但我想知道是否有更惯用或更简洁的方式来实现相同的效果。
【问题讨论】:
-
你检查过
update-in吗? -
update-in肯定会改进update-player-money功能。还有比在第二个函数中手动编写递归更好的选择吗? -
再提一提:如果你把更新玩家的金钱和更新游戏状态中的玩家的金钱分开,你可以重用之前的函数。
-
:1不是惯用语。只需使用 1
标签: clojure