Clojure-展示软件事务内存的代码示例

Clojure-展示软件事务内存的代码示例,clojure,transactions,stm,Clojure,Transactions,Stm,我创建了一些练习来展示clojure stm的能力和功能。它们是否足够好,或者是否有更好的方式显示stm的好处 我的工作: 项目转移 定义三个字符,如下所示: (def smaug (ref {:life 500, :atk 50, :def 25, :alive true, :items (set(range 100)))) (def bilbo (ref {:life 250, :atk 35, :def 12, :alive true, :items ()})) (def gandalf

我创建了一些练习来展示clojure stm的能力和功能。它们是否足够好,或者是否有更好的方式显示stm的好处

我的工作:

项目转移

  • 定义三个字符,如下所示:

    (def smaug (ref {:life 500, :atk 50, :def 25, :alive true, :items (set(range 100))))
    (def bilbo (ref {:life 250, :atk 35, :def 12, :alive true, :items ()}))
    (def gandalf (ref {:life 300, :atk 27, :def 8, :mana 50, :alive true, :items ()}))  
    
  • 现在实现一个适当的函数,将一个字符的:项之一传输到另一个字符

  • 现在您可以轻松地将
    :items
    从一个角色转移到另一个角色,启动两个线程,一个用于bilbo,一个用于gandalf,让两个线程将
    :items
    从smaug转移到bilbo和gandalf,直到smaug没有
    :items
    为止

  • 为什么下面的事务会引发异常

    (dosync
        @(future (dosync 
            (alter bilbo update-in [:items] conj (first (get @smaug :items))) 
                (alter smaug update-in [:items] disj (first (get @smaug :items))))) 
    (alter gandalf update-in [:items] conj (first (get @smaug :items)))
    (alter smaug update-in [:items] disj (first (get @smaug :items)))) 
    
  • 作战系统

  • 从一开始就用三个字符重新开始。现在实现一个模拟两个角色之间战斗的函数。因此,攻击者的
    :atk
    值减去防御者的
    :def
    值将从防御者的
    :life
    值中减去。每场战斗只有一名攻击者和一名防御者。 现在,让其中一个角色与
    smaug
    战斗,如果一个角色打败了smaug,他将获得所有
    :物品。请记住:生命值永远不能小于0!!!
    如果字符的
    :life
    值为0,则该字符为死字符。因此,
    :alive
    值设置为false

  • 正如你可能已经注意到的那样,没有一个角色能够独自击败斯穆格。幸运的是,
    gandalf
    可以治愈其他角色。但首先,您必须实现一个函数,它让
    gandalf
    heal
    bilbo
    。因此,
    :寿命
    值增加。同时治疗减少了甘道夫的法力。如果他的
    :法力
    达到0,他可以;我无法痊愈。现在,让甘道夫在每次战斗后治愈比尔博。现在两个角色都参与了战斗,他们都将从
    smaug
    接收
    :items
    。请记住,
    :mana
    值不应小于0
    Bilbos
    :life
    值也不应小于0

  • 现在我们想让游戏更有活力。我们想根据白天的时间来确定
    比尔博
    甘道夫
    :atk
    值。 现在实施日周期。要表示白天,请将整数值定义为
    ref
    。该值应在单独的线程中每秒更新一次。因此,attle和day循环由单独的线程执行。每次更新都会将一天的时间增加1。最大值为23。 如果是第6-17天,比尔博和甘道夫将获得其
    :atk
    价值的1/3奖金。在晚上(18-5),他们得到1/3的负奖金

  • 斯穆格、比尔博、甘道夫——这不是取自181ff页吗?如果是,为什么不检查一下这本书呢?是的,它来自这本书,但是我的问题没有答案。但是我想听听其他的观点,我读了几遍,发现了代码片段中的语法错误,绞尽脑汁,最后我仍然在想:问题是什么?问题在哪里?如果只是
    ,那么它们(示例)足够好吗?
    -您没有真正为
    部分提供
    。你在寻找什么样的答案?问题是
    这些例子是否足够好,可以向试图进入这门学科的人总结stm的功能?