在 Clojure 中,布尔值用true或false表示。
谓词函数(返回布尔值的函数)通常以问号(?)结尾,但这只是约定俗成。
核心库中包含用于逻辑运算符的函数,例如not、and和or。
在这个练习中,你将为朋友正在开发的一款新 RPG 游戏实现任务逻辑。游戏的主角是 Annalyn,一个勇敢的女孩,身边跟着一只凶猛又忠诚的宠物狗。不幸的是,灾难降临了:她最好的朋友在森林里寻找浆果时被绑架了。Annalyn 会设法找到并救出她的朋友,在这次冒险中可以选择带上她的狗。
沿着踪迹走了一段时间后,Annalyn 找到了关押她朋友的营地。原来那里有两个绑匪:一位强大的骑士和一个狡猾的弓箭手。
找到绑匪后,Annalyn 考虑自己能采取以下哪些行动:
你有四个任务:根据森林里那三个角色的状态,以及 Annalyn 的宠物狗是否在场,实现判断上述行动是否可用的逻辑。
实现 can-fast-attack? 函数,它接收一个布尔值,表示骑士是否醒着。根据骑士的状态,如果可以发动快速攻击,该函数返回 true;否则返回 false:
(def knight-awake? true)
(can-fast-attack? knight-awake?)
;;=> false
实现 can-spy? 函数,它接收三个布尔值,分别表示骑士、弓箭手和囚犯是否醒着。根据这三个角色的状态,如果可以侦察该群体,该函数返回 true;否则返回 false:
(def knight-awake? false)
(def archer-awake? true)
(def prisoner-awake? false)
(can-spy? knight-awake? archer-awake? prisoner-awake?)
;;=> true
实现 can-signal-prisoner? 函数,它接收两个布尔值,分别表示弓箭手和囚犯是否醒着。根据这两个角色的状态,如果可以给囚犯发信号,该函数返回 true;否则返回 false:
(def archer-awake? false)
(def prisoner-awake? true)
(can-signal-prisoner? archer-awake? prisoner-awake?)
;;=> true
实现 can-free-prisoner? 函数,它接收四个布尔值。前三个形参分别表示骑士、弓箭手和囚犯是否醒着。最后一个形参表示 Annalyn 的宠物狗是否在场。根据这三个角色的状态以及 Annalyn 的宠物狗是否在场,如果可以解救囚犯,该函数返回 true;否则返回 false:
(def knight-awake? false)
(def archer-awake? true)
(def prisoner-awake? false)
(def dog-present? false)
(can-free-prisoner? knight-awake? archer-awake? prisoner-awake? dog-present?)
;;=> false