轨道
/
Clojure
Clojure
/
练习
/
Annalyn 的潜入
Annalyn 的潜入

Annalyn 的潜入

学习练习

简介

在 Clojure 中,布尔值用true或false表示。

谓词函数(返回布尔值的函数)通常以问号(?)结尾,但这只是约定俗成。

核心库中包含用于逻辑运算符的函数,例如not、and和or。

说明

在这个练习中,你将为朋友正在开发的一款新 RPG 游戏实现任务逻辑。游戏的主角是 Annalyn,一个勇敢的女孩,身边跟着一只凶猛又忠诚的宠物狗。不幸的是,灾难降临了:她最好的朋友在森林里寻找浆果时被绑架了。Annalyn 会设法找到并救出她的朋友,在这次冒险中可以选择带上她的狗。

沿着踪迹走了一段时间后,Annalyn 找到了关押她朋友的营地。原来那里有两个绑匪:一位强大的骑士和一个狡猾的弓箭手。

找到绑匪后,Annalyn 考虑自己能采取以下哪些行动:

  • 快速攻击:如果骑士正在睡觉,就可以发动快速攻击,因为他穿上盔甲需要时间,这让他很脆弱。
  • 侦察:只要三人中至少有一个人醒着,就可以对他们进行侦察。否则,侦察只是浪费时间。
  • 给囚犯发信号:如果囚犯醒着,而弓箭手正在睡觉,就可以用鸟叫声给囚犯发信号。弓箭手受过鸟叫信号的训练,如果醒着就可能截获信息。
  • 解救囚犯:Annalyn 可以试着潜入营地解救囚犯。 这么做很冒险,只有两种方式之一才能成功:
    • 如果 Annalyn 带着她的宠物狗,那么只要弓箭手在睡觉,她就能救出囚犯。 骑士怕狗,而弓箭手来不及准备好,Annalyn 和囚犯就已经逃走了。
    • 如果 Annalyn 没有带宠物狗,那她和囚犯就得非常小心! 如果囚犯醒着,而且骑士和弓箭手都在睡觉,Annalyn 就能救出囚犯。但是,如果囚犯在睡觉,就没法救他:囚犯会被突然出现的 Annalyn 吓到,从而惊醒骑士和弓箭手。

你有四个任务:根据森林里那三个角色的状态,以及 Annalyn 的宠物狗是否在场,实现判断上述行动是否可用的逻辑。

1. 检查能否发动快速攻击

实现 can-fast-attack? 函数,它接收一个布尔值,表示骑士是否醒着。根据骑士的状态,如果可以发动快速攻击,该函数返回 true;否则返回 false:

(def knight-awake? true)

(can-fast-attack? knight-awake?)
;;=> false

2. 检查能否侦察该群体

实现 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

3. 检查能否给囚犯发信号

实现 can-signal-prisoner? 函数,它接收两个布尔值,分别表示弓箭手和囚犯是否醒着。根据这两个角色的状态,如果可以给囚犯发信号,该函数返回 true;否则返回 false:

(def archer-awake? false)
(def prisoner-awake? true)

(can-signal-prisoner? archer-awake? prisoner-awake?)
;;=> true

4. 检查能否解救囚犯

实现 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
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Clojure Exercism

准备好开始 Annalyn 的潜入 了吗?

注册 Exercism,借助 12 个概念105 个练习 和真人导师指导,学习并掌握 Clojure,全部免费。