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

时间:2017-05-30 01:20:28

标签: clojure transactions stm

我创建了一些练习来展示clojure stm的功能和功能。它们是否足够好,还是有更好的方法来展示stm的好处?

我的工作:

项目转移

  1. 按如下方式定义三个字符:

    (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 ()}))  
    
  2. 现在实现一个适当的功能,将一个角色的项目转移到其他角色之一。

    1. 现在您可以轻松地将:items从一个角色转移到另一个角色,启动两个线程,一个用于bilbo,一个用于gandalf,并让两个线程从smaug转移到{bilbo} gandalf直到smaug没有:items离开。

    2. 为什么以下事务会抛出异常?

      :items
    3. 战斗系统

      1. 从头开始用三个字符重新开始。现在实现一个模拟两个角色之间战斗的功能。因此,从防御者的(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。请记住:生命值永远不会小于0! 如果字符的:items值为0,则该字符已死。因此,:life值设置为false。

      2. 正如你可能已经注意到的那样,没有人可以通过自己的角色击败:alive。幸运的是,smaug可以治愈其他角色。但首先你必须实现一个函数,让gandalf治愈gandalf。因此bilbo值会增加。同时愈合会减少:life gandalf's。如果他的:mana达到0,他就可以治疗。现在让:mana在每次战斗后治愈gandalf。现在两个角色都参与了战斗,两者都将从bilbo收到:items。请注意,smaug值永远不应小于0. :mana Bilbos值也不应小于0!

      3. 现在我们想让游戏变得更有活力。我们希望根据日期时间:life:atk设置bilbo值。 现在实施日循环。要表示日期时间,请将整数值定义为gandalf。该值应该在单独的线程中每秒更新一次。因此,attle和day cycle由分离的线程执行。每次更新都会将日期时间增加1.最大值为23。 如果是天(6-17),bilbo和gandalf获得1/ ref值的奖励。在晚上(18 - 5),他们得到负1/3的奖金。

0 个答案:

没有答案