在 Clojure 中,您通常不会使用可变数据结构,而是创建一个描述玩家当前状态的不可变数据。对播放器的更新将创建一条描述更新状态的新数据。马特的回答给出了一个很好的例子。
如果你想随着时间的推移保持一个“玩家”身份并随着时间的推移而发生多次状态变化,你可以用一个原子来做到这一点,如下所示:
(def initial-player-state
{:hp 10
:pos [0 0 0]
:items []})
(def player (atom initial-player-state))
;; Define some update functions
(defn damage [player dmg]
(update-in player [:hp] + dmg))
(defn move [player dir]
(update-in player [:pos] #(vec (map + % dir))))
(defn add-item [player item]
(update-in player [:items] conj item))
;; Make some changes
(swap! player move [5 0 0])
(swap! player damage -3)
(swap! player add-item "Apple")
;; view the current player state by dereferencing the atom
@player
=> {:hp 10, :pos [0 0 0], :items ["Apple"]}
请注意,在真正的游戏中,您可能在单个原子中拥有整个不可变的游戏状态,而不仅仅是玩家。