gpt4 book ai didi

clojure - 这段代码是惯用的吗?有没有更好或更简洁的方法来写这个?

转载 作者:行者123 更新时间:2023-12-04 09:30:09 26 4
gpt4 key购买 nike

我正在尝试模拟扑克游戏。
我的游戏状态表示在 map 中,对于这个问题,我只对玩家感兴趣。{: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)))
这有效,但我想知道是否有更惯用或更简洁的方法来实现相同的效果。

最佳答案

如果你想实现 phase-1-blind使用 update-player-money , reduce 在这里很有用:

(defn update-player-money
"Returns new game state where player has added amount to his money"
[game player-id amt]
(update-in game [:players player-id :money] (fnil + 0) amt))

(defn phase-1-blind
"Removes blind from all players."
[game blind]
(reduce #(update-player-money % %2 blind)
game
(keys (:players game))))
update-player-money , fnil 即使玩家没有 :money 也能确保事情不会中断。关键在里面。

关于clojure - 这段代码是惯用的吗?有没有更好或更简洁的方法来写这个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62881450/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com