gpt4 book ai didi

clojure - Clojure 中纸牌游戏的状态

转载 作者:行者123 更新时间:2023-12-01 07:37:21 26 4
gpt4 key购买 nike

我对 clojure 比较陌生,但掌握了主要的功能概念。我真正挣扎的是状态。

我正在编写一个简单的纸牌游戏应用程序,现在我正在编写游戏引擎。所以国家的概念很快就给了我一巴掌。

我需要跟踪很多与游戏相关的事情:

  • 甲板状况
  • 积分状态
  • 谁是经销商
  • ...等

  • 我已经阅读了状态如何在 clojure、Refs、Agents、Atoms 和线程局部变量中使用。但它们似乎都不是我正在做的事情的正确选择。

    所以我的实际问题是:我使用什么 clojure 构造来维护 clojure 中单线程游戏引擎的状态?

    最佳答案

    函数式编程的一个一般原则是,您可以通过为每个函数访问状态使用添加的输入 arg 和输出 arg 替换全局状态来使您的代码更通用。

    在这种情况下,这意味着提供 game arg 到每一轮游戏,并让每一轮游戏返回一个新的 game用于 future 。这样做有几个优点。没有变异,所以不需要管理和协调变异。您的测试可以包括运行一轮播放功能。如果您需要 AI,它可以在广度优先的基础上轻松运行游戏的许多分支回合,以测试可能的结果,而不会干扰实际游戏的状态。

    这可能是什么样子的粗略草图:

    (def make-game
    [players]
    (let [[draw & deck] (shuffle cards)]
    {:draw draw
    :deck deck
    :points (zipmap players (repeat 0))
    :dealer (first players)})

    (defn run-round
    [game]
    (let [points (update-points (:draw game) (:points game))
    [draw & deck] (:deck game)]
    (assoc game :deck deck :draw draw :points points)))

    (defn winner?
    [game]
    (some #(> (val %) 42) (:points game)))

    (defn -main
    (let [gameplay (take-while #(not (winner? %))
    (iterate run-round (make-game)))]
    (:points (run-round (last gameplay)))))

    这当然是一个非常琐碎的游戏,每个玩家的点数都是从抽到的牌中得出的。下一张牌将在每一回合从洗好的牌组中抽出,直到我们有总分表明获胜者。

    关于clojure - Clojure 中纸牌游戏的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28461207/

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