色が異なる三つの扉があります。
三つの扉は開くためにそれぞれ異なった鍵が必要です。
赤い扉を開けるためには赤い鍵が必要。
青い扉を開けるためには青い鍵が
緑の扉を開くためには緑の鍵が
二進数を使わない場合
これはブーリアンと条件分岐を使って簡単に実装はできます。
ただし扉と鍵の数が少ない場合は簡単ですが、多くなればなるほど複雑になります。
二進数を使わないで作る場合、各鍵を持っている時の状態をフラグ化して、以下のようにインスタンス変数を定義します。
RedKey = false; BlueKey = false; GreenKey = false;
そして鍵を入手した時に各フラグを true
にして
扉を開くイベントが発生したときに
if (RedKey == true) OpenTheDoor(); else if (BlueKey == true) OpenTheDoor(); else if (GreenKey == true) OpenTheDoor();
しかしこの方法の問題点は、扉の数が多くなればなるほどフラグ判定用の変数がたくさん必要になる点。もちろん if 条件分岐もその分増えていきます。いかにも面倒くさいです。
ビット積を使った場合
最初にフラグ判定用のインスタンス変数を一つ用意します。
TheKeys = 0;
ではここから各扉と各鍵に「二の累乗(Power Of 2 = POW2)値」を与えます。
二の累乗は
1 , 2 , 4 , 8 , 16 , 32 , 64 , 128, , , ,
こうですが、今回は扉に対応する鍵が三つなので
1 , 2 , 4
これを使って各扉と各鍵でそれぞれ共通した数値を与えます。
今回は 赤=1 / 青=2 / 緑=4、このように割り当ててください。
var a = 二の累乗; Key.Color = a; TheDoor.Color = a; ※例えば、赤い扉と赤い鍵が必ず同じPOW2値を持つようにしてください
そして鍵を入手した時のイベントとして
- if 鍵を入手した時 Thekeys += 鍵の色に応じたPOW2値
TheKeys という変数に対して鍵の色に応じた POW2 値を加算していきます。
赤い鍵を入手した時 TheKeys の値は 1 となり、
赤い鍵を入手して青い鍵も入手した時 TheKeys の値は 1+2 = 3 となります。
全ての鍵を手に入れた時は TheKeys の値は (1+2)+4 = 7 となります。
鍵を入手した時のパターンを考え、これを二進数へ変換してみましょう。
0001 = 1 ・・・赤 0010 = 2 ・・・青 0011 = 3 ・・・赤+青 0100 = 4 ・・・緑 0101 = 5 ・・・赤+緑 0110 = 6 ・・・青+緑 0111 = 7 ・・・赤+青+緑
POW2 を使った足し算の結果は、どの鍵を入手したかについて表していることが分かります。
そしてビット積を使うことによって、条件式も単純化できます。
if ((TheKeys & TheDoor.Color) != 0) OpenTheDoor();
TheKeys の値が 6 の時は、青+緑の鍵を入手しているということです。
この時赤い扉を開こうとしたらどうなるかで考えてみましょう。
0110 = 6 ・・・青+緑(入手した鍵)
0001 = 1 ・・・赤(開こうとしている扉の色)
(TheKeys & TheDoor.Color)
の部分は
0110 & 0001 ______ 0000
つまり
if ((TheKeys & TheDoor.Color) != 0)
この条件と一致しないので赤い扉は開かない、こうなります。
まとめ
二進数とPOW2とビット積を利用すれば、フラグために用意する変数を一つにまとめ、更に条件式も単純化することができます。