我正在学习下班后学习clojure的过程中,我正在通过制作一个小游戏(喜欢quil库)让我熟悉特定和一般FP中的clojure的不同方面.
因此,我的游戏世界存在地图数据结构的三维网格(矢量地图矢量的矢量).我想迭代3d空间中的每个点(map)并在满足条件时更改数据.这是我最初的解决方案:
(游戏数据结构是游戏状态(地图))
(defn soil-gen [game]
(let [world-x (game :world-x)
world-y (game :world-y)
world-z (game :world-z)]
(for [x (range world-x)
y (range world-y)
z (range world-z)
:when (> z (* world-z (rand)))]
(assoc-in game [:world x y z :type] :soil))))
Run Code Online (Sandbox Code Playgroud)
但是这会返回每次迭代的结果列表(我的游戏状态数据结构)而不是一个游戏数据结构.我应该能够以某种方式将每次迭代的结果传递回去.像loop/recur这样的东西可能但是我认为你不能将recur与for结合起来.
有人知道吗?
谢谢
你可以做的是使用reduce具有for如下图所示:
(defn soil-gen [game]
(let [world-x (game :world-x)
world-y (game :world-y)
world-z (game :world-z)]
(reduce (fn [g [x y z]] (assoc-in g [:world x y z :type] :soil)))
game
(for [x (range world-x)
y (range world-y)
z (range world-z)
:when (> z (* world-z (rand)))]
[x y z]))))
Run Code Online (Sandbox Code Playgroud)