bool型(真偽値の略)が持つ値は、trueとfalseの2つだけです。コードの中では、trueとfalseというリテラル値の大文字と小文字は区別されません。
<?php
$value_is_true = true;
$value_is_false = false;
真偽値は、演算子の結果として論理式の中でよく使われ、そのあと制御構造の中で使われます。
論理演算子には、次のようなものがあります。
!$a:$aがtrueでない場合にtrueを返します$a && $b:$aと$bがどちらもtrueの場合にtrueを返します$a || $b:$aと$bの少なくとも一方がtrueの場合にtrueを返しますandとorという演算子もあり、それぞれ&&と||に対応するものです。
ただし、&&や||と同じ動作をするわけではなく、予期しない結果を生むことがあるため、その使用はおすすめしません。
この演習では、友人が開発中の新しいRPGゲームの冒険ロジックを実装します。 ゲームの主人公はAnnalyn。勇敢な少女で、勇敢で忠実な愛犬がいます。 ところが悲劇が起こります。森で木の実を探していた親友が誘拐されてしまったのです。 Annalynは親友を見つけて助け出そうとします。この冒険に、愛犬を連れて行くこともできます。
親友の跡をしばらく追ったすえ、彼女は親友が囚われている野営地を見つけます。 誘拐犯は2人います。屈強な騎士と、ずる賢い弓術士です。
誘拐犯を見つけたAnnalynは、次のうちどの行動が取れるかを考えます。
タスクは4つあります。森で見つけた3人のキャラクターの状態と、Annalynの愛犬がいるかどうかに基づいて、上の行動が可能かどうかを判定するロジックを実装しましょう。
騎士が起きているかどうかを示す真偽値を1つ受け取る、canFastAttackという名前の関数を実装します。
この関数は、キャラクターの状態に基づいて「速攻」アクションが可能ならtrueを返します。
そうでなければfalseを返します。
<?php
$is_knight_awake = true;
$infiltration = new AnnalynsInfiltration();
$infiltration->canFastAttack($is_knight_awake);
// => false
騎士、弓術士、囚人がそれぞれ起きているかどうかを示す3つの真偽値を受け取る、canSpyという名前の関数を実装します。
この関数は、キャラクターの状態に基づいて「スパイ」アクションが可能ならtrueを返します。
そうでなければfalseを返します。
<?php
$is_knight_awake = false;
$is_archer_awake = true;
$is_prisoner_awake = false;
$infiltration = new AnnalynsInfiltration();
$infiltration->canSpy($is_knight_awake, $is_archer_awake, $is_prisoner_awake);
// => true
弓術士と囚人がそれぞれ起きているかどうかを示す2つの真偽値を受け取る、canSignalという名前の関数を実装します。
この関数は、キャラクターの状態に基づいて「囚人への合図」アクションが可能ならtrueを返します。
そうでなければfalseを返します。
<?php
$is_archer_awake = false;
$is_prisoner_awake = true;
$infiltration = new AnnalynsInfiltration();
$infiltration->canSignal($is_archer_awake, $is_prisoner_awake);
// => true
4つの真偽値を受け取る、canLiberateという名前の関数を実装します。
最初の3つの仮引数は、騎士、弓術士、囚人がそれぞれ起きているかどうかを示します。
最後の仮引数は、Annalynの愛犬がいるかどうかを示します。
この関数は、キャラクターの状態とAnnalynの愛犬がいるかどうかに基づいて「囚人の解放」アクションが可能ならtrueを返します。
そうでなければfalseを返します。
<?php
$is_knight_awake = false;
$is_archer_awake = true;
$is_prisoner_awake = false;
$is_dog_present = false;
$infiltration = new AnnalynsInfiltration();
$infiltration->canLiberate(
$is_knight_awake,
$is_archer_awake,
$is_prisoner_awake,
$is_dog_present
);
// => false