【问题标题】:Is this code idiomatic? Are there better or more concise ways to write this?这段代码是惯用的吗?有没有更好或更简洁的方法来写这个?
【发布时间】: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


【解决方案1】:

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

(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 键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 2020-03-14
    • 1970-01-01
    相关资源
    最近更新 更多