我创建了一些练习来展示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,并让两个线程从smaug转移到{bilbo} gandalf直到smaug没有:items
离开。
为什么以下事务会抛出异常?
: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
。请记住:生命值永远不会小于0!
如果字符的:items
值为0,则该字符已死。因此,:life
值设置为false。
正如你可能已经注意到的那样,没有人可以通过自己的角色击败:alive
。幸运的是,smaug
可以治愈其他角色。但首先你必须实现一个函数,让gandalf
治愈gandalf
。因此bilbo
值会增加。同时愈合会减少:life
gandalf's
。如果他的:mana
达到0,他就可以治疗。现在让:mana
在每次战斗后治愈gandalf
。现在两个角色都参与了战斗,两者都将从bilbo
收到:items
。请注意,smaug
值永远不应小于0. :mana
Bilbos
值也不应小于0!
:life
和:atk
设置bilbo
值。
现在实施日循环。要表示日期时间,请将整数值定义为gandalf
。该值应该在单独的线程中每秒更新一次。因此,attle和day cycle由分离的线程执行。每次更新都会将日期时间增加1.最大值为23。
如果是天(6-17),bilbo和gandalf获得1/ ref
值的奖励。在晚上(18 - 5),他们得到负1/3的奖金。