學習軌道
/
F#
F#
/
練習
/
安娜琳的滲透行動
安娜琳的滲透行動

安娜琳的滲透行動

學習練習

簡介

布林

F# 中的布林值由 bool 型別表示,它的值可以是 true 或 false。

F# 支援三種布林運算子:not(非)、&&(且)與 ||(或)。

說明

在這個練習中,你將為一位朋友正在開發的新 RPG 遊戲實作任務邏輯。遊戲的主角是 Annalyn,一位勇敢的女孩,帶著一隻凶猛又忠誠的寵物狗。不幸的是,災難降臨了:她最好的朋友在森林裡尋找莓果時被綁架了。Annalyn 會試著找到並釋放她最好的朋友,這趟任務中她可以選擇帶上她的狗。

沿著好朋友的蹤跡追尋了一段時間後,她找到了囚禁她好朋友的營地。原來有 2 個綁匪:一位強大的騎士和一名狡猾的弓箭手。

找到綁匪後,Annalyn 思考自己可以採取下列哪些行動:

  • 快速攻擊:如果騎士正在睡覺,就能發動快速攻擊,因為他需要時間穿上盔甲,所以會很脆弱。
  • 刺探:只要其中至少 1 個人醒著,就能對這群人進行刺探。否則,刺探只是浪費時間。
  • 向囚犯打暗號:如果囚犯醒著而弓箭手正在睡覺,就能用鳥叫聲向囚犯打暗號,因為弓箭手受過鳥叫聲暗號的訓練,有可能攔截訊息。
  • 釋放囚犯:Annalyn 可以試著潛入營地釋放囚犯。 這是件有風險的事,只有 2 種方式能成功:
    • 如果 Annalyn 帶著她的寵物狗,只要弓箭手睡著,她就能救出囚犯。 騎士怕狗,而弓箭手在 Annalyn 和囚犯逃脫前也來不及準備。
    • 如果 Annalyn 沒有帶狗,她和囚犯就必須非常小心翼翼! 如果囚犯醒著,而且騎士和弓箭手都在睡覺,Annalyn 就能釋放囚犯;但如果囚犯正在睡覺,就無法救出他:囚犯會被 Annalyn 突然出現嚇到,進而吵醒騎士和弓箭手。

你有 4 項任務:根據在森林裡找到的 3 個角色狀態,以及 Annalyn 的寵物狗是否在場,實作出判斷上述行動是否可行的邏輯。

1. 檢查是否能發動快速攻擊

實作canFastAttack函式,它接收一個布林值,表示騎士是否醒著。這個函式會根據騎士的狀態,在可以發動快速攻擊時回傳true,否則回傳false:

let knightIsAwake = true
canFastAttack(knightIsAwake)
// => false

2. 檢查是否能刺探這群人

實作canSpy函式,它接收 3 個布林值,分別表示騎士、弓箭手和囚犯是否醒著。這個函式會根據這 3 個角色的狀態,在可以刺探這群人時回傳true,否則回傳false:

let knightIsAwake = false
let archerIsAwake = true
let prisonerIsAwake = false
canSpy(knightIsAwake, archerIsAwake, prisonerIsAwake)
// => true

3. 檢查是否能向囚犯打暗號

實作canSignalPrisoner函式,它接收 2 個布林值,分別表示弓箭手和囚犯是否醒著。這個函式會根據這 2 個角色的狀態,在可以向囚犯打暗號時回傳true,否則回傳false:

let archerIsAwake = false
let prisonerIsAwake = true
canSignalPrisoner(archerIsAwake, prisonerIsAwake)
// => true

4. 檢查是否能釋放囚犯

實作canFreePrisoner函式,它接收 4 個布林值。前 3 個參數分別表示騎士、弓箭手和囚犯是否醒著,最後一個參數表示 Annalyn 的寵物狗是否在場。這個函式會根據這 3 個角色的狀態和 Annalyn 的寵物狗是否在場,在可以釋放囚犯時回傳true,否則回傳false:

let knightIsAwake = false
let archerIsAwake = true
let prisonerIsAwake = false
let petDogIsPresent = false
canFreePrisoner(knightIsAwake, archerIsAwake, prisonerIsAwake, petDogIsPresent)
// => false
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
F# Exercism

準備好開始 安娜琳的滲透行動 了嗎?

註冊 Exercism,透過 18 個概念148 個練習 和真人引導來學習並精通 F#,全部免費。