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

安娜琳的滲透行動

學習練習

簡介

Go 中的布林值由預先宣告的布林型別bool表示,它的值可以是true或false。 它是一種定義型別。

var closed bool    // boolean variable 'closed' implicitly initialized with 'false'
speeding := true   // boolean variable 'speeding' initialized with 'true'
hasError := false  // boolean variable 'hasError' initialized with 'false' 

Go 支援三種邏輯運算子,可以將運算式求值為布林值,回傳true或false。

運算子 代表的意思
&&(and) 當兩個敘述都為真時,結果為真。
||(or) 只要至少一個敘述為真,結果就為真。
!(not) 只有在敘述為假時,結果才為真。

說明

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

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

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

  • 快速攻擊:如果騎士正在睡覺,就能發動快速攻擊,因為他穿上盔甲需要時間,所以會處於毫無防備的狀態。
  • 偵察:只要他們之中至少 1 人醒著,就能偵察這群人。 否則,偵察只是浪費時間。
  • 向囚犯打暗號:如果囚犯醒著而弓箭手正在睡覺,就能用鳥叫聲向囚犯打暗號,因為弓箭手受過鳥叫聲暗號的訓練,可能因此攔截訊息。
  • 釋放囚犯:Annalyn 可以試著潛入營地釋放囚犯。 這是有風險的舉動,只有在下列 2 種情況之一才能成功:
    • 如果 Annalyn 帶著寵物狗,只要弓箭手在睡覺,她就能救出囚犯。 騎士怕狗,而弓箭手來不及在 Annalyn 和囚犯逃走之前做好準備。
    • 如果 Annalyn 沒有帶狗,她和囚犯就得非常小心翼翼! 如果囚犯醒著,而且騎士和弓箭手都睡著,Annalyn 就能釋放囚犯;但如果囚犯在睡覺,就救不了:囚犯會被 Annalyn 突然出現嚇到,進而吵醒騎士和弓箭手。

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

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

定義 CanFastAttack() 函式,它接受一個布林值,用來表示騎士是否醒著。 這個函式會根據騎士的狀態,在可以發動快速攻擊時回傳 true,否則回傳 false:

var knightIsAwake = true
fmt.Println(CanFastAttack(knightIsAwake))
// Output: false

2. 檢查是否能偵察這群人

定義 CanSpy() 函式,它接受 3 個布林值,分別表示騎士、弓箭手和囚犯是否醒著。 這個函式會根據這 3 個角色的狀態,在可以偵察這群人時回傳 true,否則回傳 false:

var knightIsAwake = false
var archerIsAwake = true
var prisonerIsAwake = false
fmt.Println(CanSpy(knightIsAwake, archerIsAwake, prisonerIsAwake))
// Output: true

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

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

var archerIsAwake = false
var prisonerIsAwake = true
fmt.Println(CanSignalPrisoner(archerIsAwake, prisonerIsAwake))
// Output: true

4. 檢查是否能釋放囚犯

定義 CanFreePrisoner() 函式,它接受 4 個布林值。 前 3 個參數分別表示騎士、弓箭手和囚犯是否醒著。 最後 1 個參數表示 Annalyn 的寵物狗是否在場。 這個函式會根據這 3 個角色的狀態以及 Annalyn 的寵物狗是否在場,在能釋放囚犯時回傳 true,否則回傳 false:

var knightIsAwake = false
var archerIsAwake = true
var prisonerIsAwake = false
var petDogIsPresent = false
fmt.Println(CanFreePrisoner(knightIsAwake, archerIsAwake, prisonerIsAwake, petDogIsPresent))
// Output: false
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Go Exercism

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

註冊 Exercism,透過 34 個概念165 個練習 和真人引導來學習並精通 Go,全部免費。