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を返す3つの論理演算子があります。
| 演算子 | 意味 |
|---|---|
&&(論理積) |
両方の命題が真であれば真になります。 |
||(論理和) |
少なくとも一方の命題が真であれば真になります。 |
!(否定) |
命題が偽である場合にのみ真になります。 |
この演習では、友人が開発している新しいRPGゲームのクエストロジックを実装します。 ゲームの主人公はアナリン。勇敢な女の子で、獰猛で忠実なペットの犬を連れています。 ところが不幸にも、森でベリーを探していた親友が誘拐されてしまいます。 アナリンは親友を見つけて助け出そうとします。このクエストでは、ペットの犬を連れて行くこともできます。
親友の足跡をしばらく追ったあと、親友が囚われている野営地を見つけます。 誘拐犯は2人いました。強大な騎士と、ずる賢い弓使いです。
誘拐犯を見つけたアナリンは、次のうちどの行動が取れるかを考えます:
この演習には4つのタスクがあります。森で見つけた3人の状態と、アナリンのペットの犬がいるかどうかに基づいて、上記の行動が可能かどうかを判定するロジックを実装します。
騎士が起きているかどうかを示す真偽値を受け取るCanFastAttack()関数を定義します。
この関数は、騎士の状態に基づいて速攻を仕掛けられるならtrueを返します。
そうでなければfalseを返します:
var knightIsAwake = true
fmt.Println(CanFastAttack(knightIsAwake))
// Output: false
騎士、弓使い、囚人がそれぞれ起きているかどうかを示す3つの真偽値を受け取るCanSpy()関数を定義します。
この関数は、3人の状態に基づいてスパイできるならtrueを返します。
そうでなければfalseを返します:
var knightIsAwake = false
var archerIsAwake = true
var prisonerIsAwake = false
fmt.Println(CanSpy(knightIsAwake, archerIsAwake, prisonerIsAwake))
// Output: true
弓使いと囚人がそれぞれ起きているかどうかを示す2つの真偽値を受け取るCanSignalPrisoner()関数を定義します。
この関数は、2人の状態に基づいて囚人に合図を送れるならtrueを返します。
そうでなければfalseを返します:
var archerIsAwake = false
var prisonerIsAwake = true
fmt.Println(CanSignalPrisoner(archerIsAwake, prisonerIsAwake))
// Output: true
4つの真偽値を受け取るCanFreePrisoner()関数を定義します。
最初の3つの入力は、騎士、弓使い、囚人がそれぞれ起きているかどうかを示します。
最後の入力は、アナリンのペットの犬がいるかどうかを示します。
この関数は、3人の状態とアナリンのペットの犬がいるかどうかに基づいて囚人を救出できるならtrueを返します。
そうでなければfalseを返します:
var knightIsAwake = false
var archerIsAwake = true
var prisonerIsAwake = false
var petDogIsPresent = false
fmt.Println(CanFreePrisoner(knightIsAwake, archerIsAwake, prisonerIsAwake, petDogIsPresent))
// Output: false