gpt4 book ai didi

clojure - 对于更新世界 "state"的函数,我想返回发生的事件字符串的向量

转载 作者:行者123 更新时间:2023-12-02 11:58:26 25 4
gpt4 key购买 nike

我有一个小游戏世界状态,如下所示:

(defn odds [percentage]
(< (rand-int 100) percentage))

(defn world []
{:entities []})

(defn make-bird []
{:pos [(rand-int 100) (rand-int 100)]
:age 0
:dir (vec/dir (rand (. Math PI)))})

(defn generate-entities [entities]
(if (odds 10)
(conj entities (make-bird))
entities))

(defn update-entity [entity]
(-> entity
(update :pos (partial vec/add (:dir entity)))
(update :age inc)))

(defn update-entities [entities]
(vec (map update-entity entities)))

(defn old? [{age :age}]
(> age 10))

(defn prune-entities [entities]
(vec (filter #(not (old? %)) entities)))

(defn update-world [world]
(-> world
(update :entities generate-entities)
(update :entities update-entities)
(update :entities prune-entities)))

因此,update-world 经历了三个步骤。首先,有 1/10 的几率生成一个新的鸟实体,它以随机方向飞行。然后它会更新所有鸟类,更新它们的位置并增加它们的年龄。然后修剪所有老鸟。我使用同样的技术来生成粒子系统。您可以做一些有趣的事情,例如 (iterate update-world (world)) 来获取世界状态的惰性列表,您可以按照您想要的任何帧速率使用它。

但是,我现在有一个游戏世界,其中有自治实体,它们四处漫游并做事,有点像鸟类。但我想获得评估 update-world 时发生的情况的文本表示。例如,update-world 理想情况下会返回一个新世界状态的元组和一个字符串向量 - [“一只鸟出生于 [12, 8]。”,“一只鸟于 [1, 2] 年老去世。"].

但是我真的不能再使用(iterate update-world (world))了。我真的不知道该怎么做。这是您使用 with-out-string 的用途吗?

最佳答案

如果您只想增强您的情况下的顶级函数 (update-world),您只需创建一个可在 iterate 中使用的包装函数。一个简单的例子:

(defn increment [n]
(inc n))

(defn logging-increment [[_ n]]
(let [new-n (increment n)]
[(format "Old: %s New: %s" n new-n) new-n]))

(take 3 (iterate logging-increment [nil 0]))
;; => ([nil 0] ["Old: 0 New: 1" 1] ["Old: 1 New: 2" 2])

如果您想在多个级别收集数据时执行此操作,并且不想修改现有函数的签名(例如,您只想将其用于调试),那么使用动态作用域似乎是一个合理的选择选项。

或者,您可以考虑使用一些跟踪工具,例如 clojure/tools.trace 。您只需将 defn 更改为 deftrace 或使用 trace-nstrace-vars 即可打开和关闭函数调用的日志记录.

关于clojure - 对于更新世界 "state"的函数,我想返回发生的事件字符串的向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37225385/

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