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"]}
実際のゲームでは、プレーヤーだけでなく、不変のゲーム ステート全体が 1 つのアトムに含まれる場合があることに注意してください。