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

アナリンの潜入

学習演習

はじめに

真偽値

Bool型は、言語の基本的な構成要素の1つです。何かが真か偽かを表すための型で、それぞれTrueとFalseという値を使います。

真偽値は、&&の「AND」演算子と||の「OR」演算子で組み合わせることができ、not関数で否定できます。

真偽値は、特定の条件が満たされたときだけ実行される分岐をコードに作るときにも、とても役立ちます。Elmでは、これはif-then-else式で行います。使い方は次のとおりです。

if someCondition || (someOtherCondition && anotherCondition) then
    doSomething
else
    doSomethingElse

説明

この演習では、友人が開発している新しいRPGゲームのクエストのロジックを実装します。ゲームの主人公はAnnalyn。勇敢な女の子で、獰猛で忠実な飼い犬を連れています。ところが不幸にも、森で木の実を探していた親友が誘拐されてしまいました。Annalynは親友を見つけて解放しようとし、このクエストには飼い犬を連れていくこともできます。

親友の足跡をたどった末に、Annalynは親友が囚われている野営地を見つけます。誘拐犯は二人いました。強力な騎士と、ずる賢い射手です。

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

  • 速攻攻撃:騎士が眠っていれば速攻攻撃を行えます。騎士が鎧を着るには時間がかかるため、無防備になるからです。
  • ステルス攻撃:眠っている騎士に気づかれずに近づくことができれば、ステルス攻撃で12のダメージを与えられます。そうでなければ、騎士に与えるダメージは7だけです。
  • スパイ:三人のうち少なくとも一人が起きていれば、一行をスパイできます。そうでなければ、スパイは時間の無駄です。
  • 囚人への合図:囚人が起きていて射手が眠っていれば、鳥の鳴き声を使って囚人に合図を送れます。射手は鳥による合図を訓練されているので、メッセージを傍受されてしまうからです。
  • 囚人の解放:Annalynは囚人を解放するために、野営地に忍び込むことを試みられます。 これは危険な行動で、成功するのは次の二つの場合だけです:
    • Annalynが飼い犬を連れている場合、射手が眠っていれば囚人を救出できます。 騎士は犬を怖がり、射手が準備をする前にAnnalynと囚人は逃げ出すことができます。
    • Annalynが飼い犬を連れていない場合は、Annalynと囚人のかくれ方がとてもうまくなければなりません! 囚人が起きていて、騎士と射手の両方が眠っていれば囚人を解放できますが、囚人が眠っていると救出できません。囚人はAnnalynが突然現れたことに驚いて、騎士と射手を起こしてしまうからです。

取り組むタスクは5つです。森で見つけた3人の登場人物の状態と、Annalynが飼い犬を連れているかどうかに基づいて、上記の行動が可能かどうかを判断するロジックを実装します。

1. 速攻攻撃ができるかを確認する

騎士が起きているかどうかを示す真偽値を受け取るcanFastAttack関数を実装しましょう。この関数は、騎士の状態に基づいて速攻攻撃ができる場合にTrueを返します。そうでなければFalseを返します:

knightIsAwake = True

canFastAttack knightIsAwake
    --> False

2. 一行をスパイできるかを確認する

騎士、射手、囚人がそれぞれ起きているかどうかを示す3つの真偽値を受け取るcanSpy関数を実装しましょう。この関数は、3人の登場人物の状態に基づいて一行をスパイできる場合にTrueを返します。そうでなければFalseを返します:

knightIsAwake = False
archerIsAwake = True
prisonerIsAwake = False

canSpy knightIsAwake archerIsAwake prisonerIsAwake
    --> True

3. 囚人に合図を送れるかを確認する

射手と囚人がそれぞれ起きているかどうかを示す2つの真偽値を受け取るcanSignalPrisoner関数を実装しましょう。この関数は、2人の登場人物の状態に基づいて囚人に合図を送れる場合にTrueを返します。そうでなければFalseを返します:

archerIsAwake = False
prisonerIsAwake = True

canSignalPrisoner archerIsAwake prisonerIsAwake
    --> True

4. 囚人を解放できるかを確認する

4つの真偽値を受け取るcanFreePrisoner関数を実装しましょう。最初の3つの仮引数は、騎士、射手、囚人がそれぞれ起きているかどうかを示します。最後の仮引数は、Annalynが飼い犬を連れているかどうかを示します。この関数は、3人の登場人物の状態とAnnalynが飼い犬を連れているかどうかに基づいて囚人を解放できる場合にTrueを返します。そうでなければFalseを返します:

knightIsAwake = False
archerIsAwake = True
prisonerIsAwake = False
petDogIsPresent = False

canFreePrisoner knightIsAwake archerIsAwake prisonerIsAwake petDogIsPresent
    --> False

5. ステルス攻撃で与えられるダメージを計算する

Annalynに見つかったかどうかを示す真偽値を受け取るstealthAttackDamage関数を実装しましょう。この関数は、見つかった場合は7を返し、そうでなければ12を返します。

annalynIsDetected = True

stealthAttackDamage annalynIsDetected
    --> 7
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Elm Exercism

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

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