真或假的值由Bool型別表示。
它只包含兩個值:true和false。
julia> true
true
julia> false
false
Julia 有三個布林運算子。
&&是布林的「and」。
如果&&兩側的運算式都是true,它的結果就會是true。
julia> true && true
true
julia> true && false
false
||是布林的「or」。
只要||兩側其中一邊的運算式是true,它的結果就會是true。
julia> true || true
true
julia> false || true
true
!是布林的「not」。
它會把true和false的值互換。
julia> !true
false
julia> !false
true
運算式比較長、比較複雜時,最好用括號把意圖表達清楚。
julia> (true || false) && (false && true)
false
在這個練習中,你會為朋友正在開發的一款電玩遊戲寫一些邏輯。遊戲的主角是 Annalyn,一個勇敢的女孩,身邊帶著一隻凶猛又忠誠的寵物狗。不幸的是,災難降臨了:她最好的朋友在森林裡尋找莓果時遭到綁架。Annalyn 會試著找到並救出她的朋友,這趟冒險中她可以選擇帶上她的狗。
Annalyn 最後找到了囚禁她朋友的營地,結果發現綁匪有兩個人:一名強大的騎士和一名狡猾的弓箭手。
玩家會看到接下來可以採取哪些行動的幾個選項。四個可能的選項中,你需要各寫一個函式,告訴遊戲是否應該顯示該選項。
如果騎士正在睡覺,Annalyn 就能趁他還沒完全清醒、穿好盔甲之前,快速突襲營地。
實作一個名為can_do_fast_attack的函式,它接受一個布林值,表示騎士是否醒著。這個函式會依據角色的狀態,在「快速攻擊」行動可用時回傳true,否則回傳false:
julia> knight_awake = true
julia> can_do_fast_attack(knight_awake)
false
只要他們之中至少有一個人醒著,就可以對這群人進行偵察。否則,偵察只是浪費時間。
實作一個名為can_spy的函式,它接受三個布林值,分別表示騎士、弓箭手和囚犯是否醒著。這個函式會依據角色的狀態,在「偵察」行動可用時回傳true,否則回傳false:
# Output suppressed from the next 3 lines
julia> knight_awake = false
julia> archer_awake = true
julia> prisoner_awake = false
julia> can_spy(knight_awake, archer_awake, prisoner_awake)
true
如果囚犯醒著,而且弓箭手正在睡覺,就可以用鳥叫聲向她打信號。如果弓箭手醒著,就沒辦法安全地打信號,因為弓箭手也受過鳥叫聲信號的訓練。
實作一個名為can_signal_prisoner的函式,它接受兩個布林值,分別表示弓箭手和囚犯是否醒著。這個函式會依據角色的狀態,在「對囚犯打信號」行動可用時回傳true,否則回傳false:
julia> archer_awake = false
julia> prisoner_awake = true
julia> can_signal_prisoner(archer_awake, prisoner_awake)
true
Annalyn 可以試著潛入營地救出她的朋友。這件事風險很高,只有兩種情況能成功:
如果 Annalyn 帶著她的寵物狗,只要弓箭手在睡覺,她就能救出囚犯。 騎士怕狗,而弓箭手也來不及在 Annalyn 和她的朋友逃脫之前做好準備。
如果 Annalyn 沒帶狗,她和囚犯就得非常小心才行! 如果她醒著,而且騎士和弓箭手都在睡覺,Annalyn 就能救出囚犯;但如果囚犯在睡覺,就救不了她:她會被 Annalyn 突然出現嚇到,然後驚醒騎士和弓箭手。
實作一個名為can_free_prisoner的函式,它接受四個布林值。前三個參數分別表示騎士、弓箭手和囚犯是否醒著。最後一個參數表示 Annalyn 的寵物狗是否在場。這個函式會依據角色的狀態,在「釋放囚犯」行動可用時回傳true,否則回傳false:
julia> knight_awake = false
julia> archer_awake = true
julia> prisoner_awake = false
julia> dog_present = false
julia> can_free_prisoner(knight_awake, archer_awake, prisoner_awake, dog_present)
false