gpt4 book ai didi

clojure - 如何在 clojure 中实现带有嵌套返回的循环?

转载 作者:行者123 更新时间:2023-12-01 10:00:49 25 4
gpt4 key购买 nike

我在这里玩一个狡猾的教程:

http://buildnewgames.com/introduction-to-crafty/

我想知道这个特定的函数是如何在 clojurescript/clojure 中实现的

 var max_villages = 5;
for (var x = 0; x < Game.map_grid.width; x++) {
for (var y = 0; y < Game.map_grid.height; y++) {
if (Math.random() < 0.02) {
Crafty.e('Village').at(x, y);

if (Crafty('Village').length >= max_villages) {
return;
}
}
}
}

我知道我们可以使用 (for []) 构造,但是当 max_villages 达到 5 时,您如何让它停止?

最佳答案

这是一种方法:

(def max-villages 5)

(->> (for [x (range map-width)
y (range map-height)]
[x y])
(filter (fn [_] (< (rand) 0.02)))
(take max-villages))

然后可能添加 (map make-village-at) 或类似管道的下一阶段的内容;如果它是为了执行副作用,添加一个 dorundoall 作为最后阶段以强制它们立即发生(根据返回值是否选择一个或另一个)很有趣)。

注意。由于 seq 分 block ,可能会产生一些额外的向量和随机数,但它会小于 32。

一种更命令式的方法,带有用于比较的计数器:

(let [counter (atom 0)]
(doseq [x (range map-width)
:while (< @counter max-villages)
y (range map-height)
:while (< @counter max-villages)
:when (< (rand) 0.02)]
(swap! counter inc)
(prn [x y]))) ; call make-village-at here

:while 在其测试表达式失败时在当前嵌套级别终止循环; :when 立即进入下一次迭代。 doseq 也支持分 block ,但是 :while 会阻止它执行不必要的工作。

关于clojure - 如何在 clojure 中实现带有嵌套返回的循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16599191/

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