學習軌道
/
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,全部免費。