Crystalには、Boolという型があります。
これはtrueとfalseという値を表します。
Crystalには!、||、&&の3つの論理演算子があり、真偽値を組み合わせて、別の値を生み出す式を作ります。
&&)CrystalのAND演算子は&&で表され、両方の値がtrueならtrueを返し、そうでなければfalseを返します。
AND演算子を使うときは、&&の右側に一方の真偽値を、左側にもう一方の真偽値を置きます。
true && true
# => true
true && false
# => false
||)CrystalのOR演算子は||で表され、与えられた値のうち少なくとも1つがtrueならtrueを返します。
両方の値がfalseなら、falseを返します。
OR演算子を使うときは、||の右側に一方の真偽値を、左側にもう一方の真偽値を置きます。
true || true
# => true
true || false
# => true
false || false
# => false
!)CrystalのNOT演算子は!で表され、与えられた真偽値がfalseならtrueを返し、trueならfalseを返します。
NOT演算子を使うときは、演算子(!)のあとに真偽値を1つ置きます。
!true
# => false
!false
# => true
())を使う真偽値を扱うときは、括弧を使って、どの真偽値から先に評価するかを決められます。 括弧の使い方によって、結果が変わることがあります。 Crystalでは、括弧の中が先に評価されます。
true && false && false || true
# => true
true && false && (false || true)
# => false
括弧の中が先に評価されるので、次の例では、NOT演算子は括弧の中の式に適用されます。
!true && false
# => false
!(true && false)
# => true
括弧は、結果に影響するときだけ使いましょう。そうでない場合は省略します。
現在、高い評価を得ている新作ゲームCrystal Hunterを開発しているところです。 ゲームでは、動き回ってクリスタルを集めるキャラクターを操作します。 プレイヤーは、すべてのクリスタルを拾い集めると勝利します。 プレイヤーが盗賊に接触すると、持っているクリスタルをすべて失い、ゲームにも敗北します。 ただし例外があります。プレイヤーは、盗賊から姿が見えなくなるパワーアップを有効にすることができます。
ここでの目標は、ゲームで使われるいくつかのルールを書くことです。
ゲームでは、パワーアップを有効にしている状態で盗賊に触れると、キャラクターはボーナスポイントを獲得します。
Rules#bonus_points?メソッドを定義します。このメソッドは2つの引数(キャラクターがパワーアップを有効にしているか、キャラクターが盗賊に触れているか)を取り、キャラクターがボーナスポイントを獲得するかどうかを示す真偽値を返します。
このメソッドは、キャラクターがパワーアップを有効にしていて、かつ盗賊に触れている場合にのみtrueを返し、それ以外の場合はfalseを返す必要があります。
Rules.new.bonus_points?(false, true)
# => false
ゲームでは、プレイヤーはクリスタルかパワーアップを拾うとポイントを獲得します。
Rules#score?メソッドを定義します。このメソッドは2つの引数(キャラクターがパワーアップに触れているか、キャラクターがクリスタルに触れているか)を取り、キャラクターが得点したかどうかを示す真偽値を返します。
このメソッドは、キャラクターがパワーアップまたはクリスタルに触れた場合にtrueを返し、それ以外の場合はfalseを返す必要があります。
Rules.new.score?(true, true)
# => true
Rules#lose?メソッドを定義します。このメソッドは2つの引数(キャラクターがパワーアップを有効にしているか、キャラクターが盗賊に触れているか)を取り、キャラクターが負けるかどうかを示す真偽値を返します。
このメソッドは、キャラクターが盗賊に触れていて、かつパワーアップを有効にしていない場合にtrueを返し、それ以外の場合はfalseを返す必要があります。
Rules.new.lose?(false, true)
# => true
Rules#win?メソッドを定義します。このメソッドは3つの引数(キャラクターがすべてのクリスタルを拾い集めたか、キャラクターがパワーアップを有効にしているか、キャラクターが盗賊に触れているか)を取り、キャラクターが勝つかどうかを示す真偽値を返します。
このメソッドは、キャラクターがすべてのクリスタルを集めていて、かつ3番で定義した引数に基づいて負けていない場合にtrueを返し、それ以外の場合はfalseを返す必要があります。
Rules.new.win?(false, true, false)
# => false