トラック
/
PHP
PHP
/
演習
/
アナリンの潜入
アナリンの潜入

アナリンの潜入

学習演習

はじめに

真偽値

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を返します
Caution

andとorという演算子もあり、それぞれ&&と||に対応するものです。 ただし、&&や||と同じ動作をするわけではなく、予期しない結果を生むことがあるため、その使用はおすすめしません。

説明

この演習では、友人が開発中の新しいRPGゲームの冒険ロジックを実装します。 ゲームの主人公はAnnalyn。勇敢な少女で、勇敢で忠実な愛犬がいます。 ところが悲劇が起こります。森で木の実を探していた親友が誘拐されてしまったのです。 Annalynは親友を見つけて助け出そうとします。この冒険に、愛犬を連れて行くこともできます。

親友の跡をしばらく追ったすえ、彼女は親友が囚われている野営地を見つけます。 誘拐犯は2人います。屈強な騎士と、ずる賢い弓術士です。

誘拐犯を見つけたAnnalynは、次のうちどの行動が取れるかを考えます。

  • 速攻: 騎士が**眠っている**ときは速攻できます。騎士が鎧を身に着けるには時間がかかるので、その間は無防備になるからです。
  • スパイ: 少なくとも1人が**起きている**なら、その集団をスパイできます。そうでなければ、スパイは時間の無駄です。
  • 囚人への合図: 囚人が**起きていて、弓術士が眠っている**なら、鳥のさえずりを使って囚人に合図を送れます。弓術士は鳥のさえずりによる合図を訓練されているので、メッセージを傍受されてしまうからです。
  • 囚人の解放: Annalynは野営地に忍び込んで囚人を解放しようとできます。 これは危険な行為で、次の2つのうちどちらかの場合にしか成功しません:
    • Annalynが愛犬を連れている場合、弓術士が**眠っていれば**囚人を救い出せます。 騎士は犬を恐れているうえ、Annalynと囚人が逃げ出す前に弓術士が準備をする時間はありません。
    • Annalynが愛犬を連れていない場合は、Annalynと囚人はとても慎重に行動しなければなりません。 囚人が**起きていて、騎士と弓術士が2人とも眠っているなら、Annalynは囚人を解放できます。しかし囚人が眠っている**と救い出せません。Annalynが突然現れると囚人が驚いて、騎士と弓術士を起こしてしまうからです。

タスクは4つあります。森で見つけた3人のキャラクターの状態と、Annalynの愛犬がいるかどうかに基づいて、上の行動が可能かどうかを判定するロジックを実装しましょう。

1. 「速攻」アクションが可能かどうかを確認する

騎士が起きているかどうかを示す真偽値を1つ受け取る、canFastAttackという名前の関数を実装します。 この関数は、キャラクターの状態に基づいて「速攻」アクションが可能ならtrueを返します。 そうでなければfalseを返します。

<?php
$is_knight_awake = true;

$infiltration = new AnnalynsInfiltration();
$infiltration->canFastAttack($is_knight_awake);
// => false

2. 「スパイ」アクションが可能かどうかを確認する

騎士、弓術士、囚人がそれぞれ起きているかどうかを示す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

3. 「囚人への合図」アクションが可能かどうかを確認する

弓術士と囚人がそれぞれ起きているかどうかを示す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. 「囚人の解放」アクションが可能かどうかを確認する

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
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
PHP Exercism

アナリンの潜入を始める準備はできましたか?

Exercismに登録すれば、11個のコンセプト122個の演習、そして本物の人間によるメンタリングとともに、PHPを学んでマスターできます。すべて無料です。