高校の数学では集合と論理が用意されていますが、現在は数学Cに移動しています。この中で使用する論理演算は、プログラミング言語でも使用するので、 【 判定 】 を使用する際に実装することになります。
これはどのプログラミング言語でも使用することが出来ますが、基本となるのは
■ 論理積 : AND
■ 論理和 : OR
■ 論理否定 : NOT
になります。SPI3や適正試験などで明大などと一緒に論理が出ることがありますが、この時の記述は論理の記号である
■ 論理積 : AND(∧)
■ 論理和 : OR (∨)
■ 論理否定 : NOT(¬)
ではなく、
■ 論理積 : AND(・)
■ 論理和 : OR (+)
■ 論理否定 : NOT( ̄)
で構成されています。なので、
■ A・B : A∧B
■ A+B : A∨B
のような意味で
_ ¬
■ A・B : A∧B
_ ¬
■ A+B : A∨B
のような意味になります。
このように論理についても数式の形で登場することもありますが、この判定は
■ 直列回路 : AND
■ 並列回路 : OR
■ 反 転 : NOT
になります。ANDとORについては、小学校理科で登場する2つの電池を使った
■ 直流
■ 交流
と同じ状態になります。この時の
■ 電池の状態
■ 豆電球の点灯の有無
の関係性が論理ゲートの真理値と全く同じなので、これらがANDとORであることが確認できます。
ちなみに
【 直流 】
00:0
10:0
01:0
00:1
【 交流 】
00:0
10:1
01:1
00:1
なので、直流はANDで交流はORになりますが、電池で豆電球が点灯する経怒りを作り、その回路を直列と並列になるようにして、その間に2つのスイッチを配置した場合、電池の有無と全く同じ状態になりますから、
【 直列 】
00:0
10:0
01:0
00:1
【 並列 】
00:0
10:1
01:1
00:1
のようになります。これをタクトスイッチやトグルスイッチで行った場合には操作による論理ゲートとして使用できますが、これをトランジスタに変更した場合、電流の流れによる切り替えが可能になるので、回路内に論理ゲートを実装できるようになります。この辺りは、高校の物理の 【 半導体 】 の分野の延長線上の話になりますが、物理的に実装するときにはスイッチを使用しますが、内部処理の場合にはトランジスタを使用します。
これは判定を行うものになるので、プログラミング言語の分岐に相当する部分になりますが、この時にスイッチやトランジスタを使うことになります。
ブロックを使ったプログラミング言語だと判定を行う際に
■ イベントハンドラ(キーやマウスのイベント)
■ 条件分岐(処理の流れ中で発生する判定)
を使い分けることになりますが、電気工作に置き換えると、前者が操作なのでスイッチの処理になり、後者が内部処理なのでトランジスタの処理になります。
ただし、実際に電気工作を行う場合には、ロジックICが販売されているので、目的の判定が行える物を用意して使用すると回路を簡素化して少電力な状態で運用できます。
当然、ロジックICの処理は論理ゲートでしかないので、マイコン(マイクロコントローラー)でコードを書いて処理をさせる時の機能の一部でしかありませんから、複雑な処理を行う場合だとマイコンを使用することになります。
スイッチを使った場合、ANDとORは
のようになりますが、このスイッチの部分をトランジスタに置き換えると内部処理で動作させることができるようになります。NOTの場合だと
のようになりますから回路だけで論理ゲートを付くことも出来ます。
記号の特徴
回路図で使用する記号ですが、特徴があるのでそれを覚えておくと難易度が下がります。
接続するものだと、バッファーを基準に覚えると覚えやすいのですが、
【 バッファー 】
━▷
のような形になっているのがバッファーです。これは何も処理をせずに繋がっている状態になりますが、ダイオードの場合だと、
【 ダイオード 】
━▷┃
のようになります。ちなみに発光ダイオードの場合、【 ↗↗ 】の記号が付与された形になります。
これがダイオードになりますが、これをそのまま使用した場合にはバッファー同様に
【 バッファーの挙動 】
入力 : 0 → 出力 : 0
入力 : 1 → 出力 : 1
のように0を入力すると0になり、1を入力すると1になります。
これを反転させるときにはインバーターを使用しますが、論理ゲートだとNOT回路(論理否定)がインバーターになります。インバーターを使用すると
【 インバーターの挙動 】
入力 : 0 → 出力 : 1
入力 : 1 → 出力 : 0
のように信号が反転します。インバーターの回路図は、バッファーの前に 【⚪】を追加した形になっているので、
【 NOT回路(インバーター) 】
━▷○
のようになっています。ちなみに、インバーターの逆の処理をするのがコンバーターになります。
【 インバーター 】
直流電流(DC)を交流電流(AC)に変換する回路
【 コンバーター 】
交流電流(AC)を直流電流(DC)に変換する回路
回路図内の記号は【 ○ 】を付与することで反転するので、
■ AND
■ OR
■ XOR
の記号の前に 【 ○ 】 をつけると
■ NAND
■ NOR
■ XNOR
になります。ANDとORについては前述の鳥ですが、XOR(排他的論理和)は
【 XOR(排他的論理和) 】
00:0
01:1
10:1
11:0
の用になります。これは、廊下や階段で用意されているスイッチの仕組みになります。こうしたスイッチは
●
■ ■
□ □
━━━━━━━━━━━━━━━
のように両端に用意されていますが、
消 灯
オフ ○ オフ
□ □
■ ■
━━━━━━━━━━━━━━━
発 光
オン ● オフ
■ 〃 □
□ ■
━━━━━━━━━━━━━━━
発 光
オフ ● オン
□ 〃 ■
■ □
━━━━━━━━━━━━━━━
消 灯
オン ○ オン
■ ■
□ □
━━━━━━━━━━━━━━━
のようになります。つまり、片方の場所で操作した後に反対側にあるスイッチを使うことでライトの状態に変化を与えることができるようになっています。
こういった挙動をするものを作る場合だと
■ ブレッドボード
■ ジャンパケーブル
■ トグルスイッチ
■ LED
■ 抵抗
■ 電池ボックス
■ 電池
■ XORのロジックIC
を用意するだけで作れるのですが、LEDが点灯する閉回路を作った後にXORの判定が入るような仕組みにしておいてトグルスイッチの通電の有無をXORで判定をかけると全く同じ挙動のものを作ることが出来ます。
記号については、
■ XOR : 【 OR 】 + 【 ) 】
■ NAND : 【 AND 】 + 【 ○ 】
となっていますが、ANDとORの記号の変化がバッファーとインバーターの記号の変化と全く同じになっています。当然、XORの記号についても○を付けると反転するのでXNORが出来上がりますが、これはXORの反転ですから、
【 XNOR 】
00=1
01=0
10=0
00=1
のようになります。
義務教育の場合だと電気について深く踏み込んでいないので、電気の流れの向きなどはあまり触れらていないのですが、こうした判定についても高校のカリキュラムで学ぶことになります。
電気を使う場合の基礎知識は
■ オームの法則
■ 電磁力
になりますが、ここに
■ エネルギー保存の法則
■ ジュール熱
などによる仕事の効率や回路をどう支えた時に発生しそうな熱量について考えることになります。
ちなみに、回路は 【 熱が出るほど抵抗値が高くなる 】 傾向があるので、放熱は回路内のパーツの破損だけでなく、性能の低下にも直結しているので、適正に運用しようと思うと冷却することも考える必要がでてきます。
この場合、 【 発熱や熱の伝達 】 について学習することになりますが、これが空間内を温める時に必要なエネルギーの計算であったり、物体自体を温める時に必要になる熱量で考えることができるわけです。ジュール熱は電力のW(ワット)で考えることになりますから、電力がどのように変化するのかを考えることが出来ます。この時の筐体内の温度は環境の温度ですからこれが高いほど熱量の上昇率は高くなります。
熱伝導率が同じ場合、体積が小さいほど熱の上昇速度は速くなりますから小さな筐体で冷却性能を上げようと思うとそれ相応の仕組みを作る必要がでてくるわけです。
こうしたことを考える上での基礎知識は義務教育の中で登場しますが、それをより深堀した電気の流れやコントロールをする方法については高校の物理の知識が必要になります。
中学校までの知識でも判断をするための方法は学習しますが、しっかりとした判断をするための方法は高校移行のカリキュラムで登場します。
論理絵ゲートと式
論理ゲートは式の形で示す事ができるのですが、
【 AND 】
■ A・B : A∧B
【 OR 】
■ A+B : A∨B
【 NOT 】
_ ¬
■ A・B : A∧B
_ ¬
■ A+B : A∨B
のような事が出来ます。論理ゲートは組み合わせで回路を作るので、判定も複雑なものが存在しますが、基本となるものは、
【 NAND 】
_ _ _ _
■ Q = A・B = A+B
【 XOR 】
_ _
■ Q=(A・B)+(A・B)= A⊕B
【 XNOR 】
_ _
■ Q=(A・B)+(A・B)
のような表記になります。
レッドストーン回路
マインクラフトでは地下を掘るとレッドストーンがでてくるので、これを
■ 電源
■ 電線
のようにして使用することで離れた距離の場所にレッドストーン信号を伝達することができるようになっています。
レッドストーンは地下 【 -54 】 辺りを掘る事でより多く取得できるのですが、ダイヤモンドと同様に深層部まで掘り進んでから採掘を行わないと入手できません。レッドストーン信号については、
■ レバー
■ ボタン
■ 感知板
■ 感圧版
で出力可能で、
■ ドア
■ トラップドア
■ フェンスゲート
をコントロールすることが出来ます。MOBやエンティティでは、
■ レバー
■ ボタン
の操作は出来ないので、これを使うとプレイヤーのみが操作することが出来R状態になります。
先程のブロックはレッドストーン信号で動くものになりますが、
【 トグルスイッチ 】
■ レバー
【 パルスの発生 】
■ ボタン
【 タクトスイッチ 】
■ 感知板
■ 感圧版
と同じ状態になりますから入力の選択をすることが出来ます。
このブロックがサバイバルの序盤から作れる 【 入力装置 】 になります。
入力装置が存在した場合、出力を用意しないと動作の確認が出来ませんから、電気の場合だと豆電球などを使用することによって 【 通電の有無 】 で状態の変化を確認することになります。
サバイバルモードの序盤だと
■ ドア
■ トラップドア
■ フェンスゲート
を豆電球の代わりに使用することができるようになっています。
と言っても、序盤だと 【 ブロックに信号を送る 】 ことしか出来ませんから、フェンスゲートなどのブロックも 【 ブロックに隣接させて使用する 】 ことになります。
レッドストーン信号の特性として
【 ブロックに信号を送ると全ての面に信号が出る 】
と言う特性がありますが、序盤にクラフトできるものについては、信号を送ると対象の不透過ブロックがレッドストーンブロックのような状態になるので、そこに配置したトラップドアやフェンスゲートは動作しますし、ドアについても動作します。
序盤にできることはこれだけですから、
■ レバーでトラップドアなどを固定する
■ ボタンなどでドアの開閉を行う
などになります。この状態でもブロックの側面に複数のトラップドアなどを配置できるので、並列回路のような動作は可能ですが、ブロックに隣接させるて必要があります。
また、一つのブロックに複数のレバーを配置できるので 【 OR回路 】 を実装することも出来ます。
と言っても、ブロックにレバーを2つ配置して片方のレバーで開いたり開いた状態だと反対側のレバーが効かなくなると言う構造物になるので用途がよくわからないものが出来上がりますが、この段階だと
■ 併設
■ 用途不明のOR回路
を作ることが出来ます。
レッドストーンを使う
レッドストーンを掘るとレッドストーンになりますが、これは、
【 フルブロックの上のみ配置できる 】
仕様になっているので、透過ブロックなどには配置できません。また、JAVA版と統合版でレッドストーンの仕様が異なるので、通常の不透過ブロックで下に信号が下がるのは統合版の特徴なので、JAVA版では信号が切れてしまいます。また、光源ブロックやガラスなどの上でも信号が通るのは統合版だけなので、JAVA版だと信号が通りません。
その為、 【 エディションによって信号の伝達の仕様が異なる 】 ので細かいことに気をつける必要がありますが、通常の草ブロックや土だったり、石や丸石だと極当たり前に信号は伝達されるので、ブロックの上にレッドストーンを配置して信号を流すと15ブロック先まで信号を流すことが出来ます。
レッドストーン信号は 【 0〜15 】 までなので十六進数の1桁分を距離で扱うことができるようになっていますが、この距離であればレッドストーンで動作するものを動かすことが出来ます。
ただし、レッドストーンだけだと 【 距離の延長 】 しか出来ないので、クラフトを行うことで、レッドストーンで動作するブロックを作ることになります。
レッドストーントーチ
レッドストーンと言うと最初に登場したこのパーツを使うことになりますが、このパーツは、
■ レッドストーン信号(強度15)を出力
■ レッドストーン信号で切れる
と言う特性を持っています。つまり、
■ 0→1
■ 1→0
になるので、このブロックは 【 NOT回路 】 として扱うことが出来ます。ただし、そのままレッドストーンを接続すると信号の発信しかできませんから、ブロックに配置して使用することで、信号の伝達で、状態の変化を与えることが出来ます。
その為、
■ そのまま使う
■ ブロックに配置する
と言う2つの使い方ができるようになっています。そのまま使用すると 【 定数 】 になるので常に1の状態に出来ますから、信号を送った先の構造物はレッドストーン信号が常に入った状態になります。
これは、レッドストーンをブロック状にしたレッドストーンブロックと同じです。
これをブロックの側面や上部に配置するとブロック経由で信号の伝達ができるようになるので、NOT回路として機能するようになります。
この状態にすると
■ OR回路
■ NOT回路
が作れるので、NOR回路を構築することができるのですが、NORの判定が
【 NOR回路 】
■ 00→1
■ 10→1
■ 01→1
■ 11→0
のようになるので、
【 NAND回路 】
■ 00→1
■ 10→1
■ 01→1
■ 11→0
と同じになります。その為、 【 NOR ≒ NAND 】 として使用できるので、
【 NOT 】━┓
┃
【 OR 】━━
┃
【 NOT 】━┛
のようにすると、前述のような判定を作ることが出来ます。これはNANDゲートと同じなので、入力をNOTで反転させるだけでANDゲートになります。これで、論理ゲートを作る上での基本となる
■ AND
■ OR
■ NOT
の3つの判定を作ることが出来ます。ANDは
【 ANDゲート 】
【 NOT 】━┓
┃
【 OR 】━【 NOT 】━
┃
【 NOT 】━┛
なので、パーツが多いのですが
【 ORゲート 】
【 入力 】━┓
┃
┣━
┃
【 入力 】━┛
の形にすればいいので、並列回路の分岐部分が入力になったような構造になります。NOTは
【 NOTゲート 】
【 ブロック 】 + 【レッドストーントーチ】
ですから、簡単に作ることが出来ます。レッドストーントーチは、
【 レッドストーントーチ 】
■ 棒
■ レッドストーン
でできるので、すぐに作れますが、これを使う事でレッドストーンリピーターを作ることが出来ます。
これは、信号の延長ができるので、16ブロック目に配置すると信号強度を15まで回復させることが出来ます。
また、信号は一方通行になっているのでダイオードのような特徴がありますが、入力方向からの信号以外は受け付けないので、新語の向きを決める事が出来ます。また、0.1秒X3段階の遅延を追加できる機能を持っています。
これは論理ゲートには関係ありませんがレッドストーンの信号の伝達距離が長くなった時に使用するパーツになります。
先ほどの論理ゲートは、ScratchやMAKE CODEのブロックの
■ か つ : AND
■ ま た は : OR
■ ではない : NOT
と同じものなので、この組み合わせで判定を考えていくことになります。ちなみに判定用のブロックは
のような形になっており、分岐で使用するブロックで実装できるようになっています。
レ基本は2入力、1出力
倫理ゲートを使う場合には、最初から複雑にせずに
■ 2入力
■ 1出力
で考えて仕組みを作ると意図した構造にしやすくなります。
レッドストーンを使用した発光体はレッドストーンランプしかない(1.12で増えます。)ので、オーバーワールド入手できるものだと動くものを使うことになりますが、挙動を考える場合、
【 入力 】━┓
┃
【 判定 】━【 動作するもの 】
┃
【 入力 】━┛
で考えることになります。ANDを使用した際には 【 条件が揃った場合 】 で動作することになりますから、その入力をどのようにするのかを考えることになります。最初はなどで回路を作ることになりますが、この仕組みは 【 フラグの指定 】 としても使用できます。
と言ってもレッドストーン回路は 【 シミュレーション距離の範囲内でしか動作しない 】 ので、
【 プレイヤーの移動空間に制約を書けた条件 】
でしか動作しませんが、レッドストーンの場合、【 高さ方向は全て判定の範囲内 】 になりますから、MOBのスポーン条件のような形にはなっていません。
これは、野菜の成長も同じですが、平面的な円の面積を決める際の範囲がシミュレーション距離になります。これを広めにしておけば、プレイヤーの周辺の範囲でレッドストーンが動作するので、
【 シミュレーション距離の中で移動するような構造 】
で制約をかけると論理ゲートによる判定を使用することが出来ます。この場合、バリアブロックで制約をかけることができるクリエイティブモードだと有効に使えそうな気がしますが、そういった制約をワールド内に指定しておけば、 【 範囲内で発生するフラグの管理 】 を論理ゲートだけ得行うことが出来ます。
論理ゲートの3つの処理ですが、2つの条件だと
■ AとBが揃った時
■ オフ以外の条件
で動作するものを実装できます。NOTについては、 【 入力の反転 】 なので、
【 〇〇ではない 】
と言う状態で使用します。フラグの場合だと、
【 4つの条件をクリアする 】
のようなものだと
【 入力 】━┓
┃
【 AND 】┓
┃ ┃
【 入力 】━┛ ┃
┣━【 動作するもの 】
【 入力 】━┓ ┃
┃ ┃
【 AND 】┛
┃
【 入力 】━┛
のような構造になります。これが二値を使った 【 0と1 】 での判定で複数の条件の一致で成立するような仕組みになります。
この構造だと、 【 0000 】 が 【 1111 】になればいいだけなので、
■ フラグ1のクリア条件
■ フラグ2のクリア条件
■ フラグ3のクリア条件
■ フラグ4のクリア条件
を用意しておいてその判定に論理ゲートを使います。
この時に
■ クリア条件
■ 成立用の判定
を用意しておいて、それぞれの判定が成立した際に1(この場合レッドストーン信号を出す)の状態にして、最終的にフラグが立った時の処理を実行することになります。
フラグの場合、
■ 改変不可
■ 状態の維持
が必要になりますが、フラグの場合、プレイヤーが直接操作できたり、結果が割る状態だとダメなので、内部SYリで信号が出るようにする必要があります。
電気工作だと接点の操作ではなく、トランジスタで処理をするの同じ条件になります。
先程の条件だとレッドストーン信号の出るブロックだとレバーのように固定できて改変不能にしなければなりませんから、何かしらの方法でラッチを掛けて操作による改変が出来ない状態にする必要があります。
これを内部処理で実装する場合には、レッドストーンで動作するブロックをクラフトしてラッチ機構を作ることになります。RSラッチの場合、
■ セット
■ リセット
があるので、リセット側の信号の入力を除去するだけでセットのみのか色を作ることが出来ます。
この構造は簡単で、マイクラの場合だと、
【 NOT 】━┓
┃ ┃
┗━【 NOT 】
で作れます。実際の回路だとこの構成に電気抵抗を入れることになりますが、実際に使う場合だと、
【 入力 】━【 NOT 】━┳━━【 出力 】
┃ ┃
┗━【 NOT 】
のようになります。その為、
【 フラグ 】━【 ラッチ 】━【 ANDゲートへ 】
と言う流れになります。仕組みを作る場合には、
■ 条件を構成する回路の設計
■ 出力用の回路の設計
が必要になりますが、最初に
■ 入力
■ 出力
を決めておくと、始点と終点が決まるので、その間で何が発生すれば結果に至るのかを考えるだけで済みます。
複雑な条件を作ると 【 複数の処理が存在する 】 ので、
【 処理単位で分けて設計をする 】
ことになります。これは、プログラミング言語を使って処理を実装する場合も同じなので、動かすものの内容の中に存在する内容を個別に分けて役割分担をさせるように個別に小さなコードを作成します。このコードをどのような順番で動かすのかを考えていくことになりますが、レッドストーン回路も同じ用に考えると設計をしやすくなります。
レッドストーン回路の場合 【 装置 】 なので 小分けにして考える場合には、 【 処理の塊 】 である 【 モジュール 】 を作ることになりますが、これが、プログラミング言語の関数やクラスに該当するものになります。
ScratchやMAKECODEの場合、クラスは存在しないので、関数を使うと処理単位で分けることが出来ますが、目的別に分けて作成しておくとメンテナンスも行いやすくなります。関数を使うと関数の実行だけで挙動の確認ができるので、ブレークポイントを指定しなくてもデバックを行いやすくなっています。
VisualStucdioなどの統合開発環境だとコードを書いた時にブレークポイントの指定ができるようになっていますが、これが 【 処理を止める場所 】 になります。デバッグを行う際に範囲を指定して確認したい場合がありますが、その時にブレークポイントを指定することで処理の終点を指定する事が出来ます。
関数やラスの場合、実行するだけで試せるので単体での動作ができるという利点があります。単体のコードが長くなる場合だとブレークポイントが使えたほうが良いので、通常はそういったエディタを使うことになります。
レッドストーン回路を作る場合には関数レベルで分けたような処理の塊をモジュールで分けて作ることになりますが、こうしたモジュール単位で分けると単独でのテストが出来るので挙動の確認をしながら作っていくことが出来ます。そして必要なモジュールを揃えてから目的の形にまとまるよにレイアウトしていくことになります。
回路や論理ゲートについては
の中でも触れていますが、レッドストーン回路は電気と同じ伝達の有無で成立しているので、判定を行う際には二値論理を使用します。この時に、
■ 掛け算 : AND
■ 足し算 : OR
のような記述になり、入力を反転させる場合には
■ 文字の上に  ̄ を付ける : NOT
を使用することで Q=論理式 のような形で処理を書くことが出来ます。
組み合わせの回路の場合だとその構造がどのようにすれば成立するのかを考えることで式を導き出すことが出来ます。
レッドストーン回路はサバイバルモードでも実装できるのですが、ブロックの特使絵などもあるので、論理ゲートだけだと作れないものもあります。その為、
【 二値論理 + ブロックの特性 】
を使用して回路を作ることになります。