00:00
今回のエピソードでは画面を対応しています。
ポッドキャストでお聞きの方は、状況が分かりづらいところが多々あるかと思いますのでご注意ください。
お手数ですが、概要欄に貼ってある動画版で見ることをお勧めします。
テトリスで汎用的な計算機、つまりパソコンを作るこのシリーズ。
前回はテトリスで回路を作る基本的なルールを説明しました。
前回の最後でノアゲートで入力の値によってロジック部分のテトリのみの位置がおかしなことになっていることを説明しました。
今回はその理由から説明して、もう少し深くこの回路設計のルールを理解したいと思います。
このノアゲートの回路ですが、これまで無視してきたこのソースコード部分によって回路の定義がなされています。
まだ細かいところは理解していただかなくていいですが、このノアゲート5行のコードで定義されています。
3行目から5行目のところはおおむね予測数がつくかと思いますが、
入力2ビットと出力1ビットをそれぞれ定義しています。
点々みたいに書かれているのが横の開始終了位置です。
その次が高さなので、この場合だと
Aという入力をx座標-1から0のところで、y座標は0のところに配置して、
Bはx座標1で高さ0のところに配置して、出力Oはx座標-1から1のところで高さは5のところに配置します。
インとアウトはそれぞれ高さ2行分確保するので、このy座標を指定したところともう一つ上の2行を占有するというイメージになります。
これは大丈夫かと思います。
ロジック部分の定義なのですが、ここでは1行目のノットというもので定義されています。
ノットというものを横の位置、x座標を0、y座標を0のところに置いていると。
これですが、以前に定義した回路を呼び出していると思っていただければいいかと思います。
まだ説明していないノットゲートをそれを呼び出して0列のところに配置しているというイメージですね。
ではノットゲートの定義の方を見てみましょう。
ノットゲートを見てみると、インとアウトは先ほどと同じような感じなので大丈夫かと思います。
入力出力ともにx座標-4からプラス1、つまり3列分確保して、インは高さ0、アウトは高さ5のところに配置しています。
漢字のロジック部分が1行目から3行目のところですが、luojdというちょっと見慣れないものが表現されています。
2行目のoに関しては以前言った通り、2×2の手取りの実をoと表現する話をしたので、それのことだとわかるのですが、それ以外のものがluやjdという表記になっています。
03:05
またoに関しても0、4、1という風になっていて、どういう指示をしているのかがいまいちわかりません。
ここで何を定義しているのかをもう少し詳しく見ていきましょう。
luとjdが何なのかという話ですが、要は1文字目は以前言った通り、どの手取りの意味を使うかというところで、あとはその姿勢をどういう風に向けるかという話になります。
基本的にそれぞれのテトリスの出っ張っているところがどっち向きかというところで定義します。
姿勢が4種類ある場合は、左側からダウン、レフト、アップ、ライトと4種類になります。
このLであれば、短く突き出ている部分をその向いている向きと見直すことによって、その姿勢がわかるようになっています。
4種類姿勢があるものに関してはTとJも同様でして、一マスだけ突き出ている部分を姿勢の向きと捉えて、ダウン、レフト、アップ、ライトとなるので、
例えばTの上向きのやつであればTのアップなのでTU、Jの左向きのものであればJLというような表記になります。
先ほどであれば一番下にあったのがL字の上向きのテトリノミなのでLUが配置されて、一番上にはJの下向きなのでJDが配置されていたということになります。
Oに関しては姿勢がないのでOとO一文字のみの表現となります。
これが4つ姿勢があるテトリノミでTとJとLの3種類になります。
それ以外のものですと2種類の姿勢があるものがZとSとIになりますね。
ZとSはいわゆるジグザグのテトリノミですね。
Iはみんな大好きなまっすぐのテトリノミですね。
この3種類のテトリノミは細長い形状をしているので、縦向きか横向きかという形で表現を行います。
横向きの姿勢の場合はホリゾンタルであるH、縦向きの姿勢の場合はバーティカルであるVを使って表現します。
まっすぐな棒が横向きであればIH、S字のものが縦長であればSVというような表現になります。
2つ姿勢があるものでした。
最後は重複にはなりますが、Oに関しては姿勢がないのでO一文字だけで表現することになります。
ちなみに今見ている図で白い丸が表記されているのがわかるかと思いますが、
これがテトリノミをここに配置してという時に基準となる座標です。
指定した座標にこの白丸のところが来るようにテトリノミが配置されます。
06:06
基本的に白丸の位置の考え方としては回転中心のところを採用することが多いですね。
Tであれば真ん中のところですし、Jであれば長いところの真ん中ですし、
ZやSであればジグザグのところの真ん中で、横長の時だったら上側、縦長の時だったら左側に位置するところですね。
LはJと同じですね。長い棒の真ん中ですね。
Iに関しては横長であれば右から2番目のところで、縦長だったら下から2番目のところですね。
そこが配置する位置になります。
このようにしてテトリノミの種類が1文字目、姿勢が2文字目となると。
さらには座標を指定します。
その後ろに数字がいくつか来るパターンをこれまで見てきましたが、
数字が3個あるケースですが、これは意味としては、
1つ目が横の位置、2つ目が縦の位置、ここまでは良いかと思いますが、
最後がここの表記だとXHとなってますが、
これは横にどれだけずらすかというイメージになります。
ここが本当にテトリスっぽくですね、プログラミングするという概念になってきます。
どういうことかと言いますと、
これまでこの指定した座標にいきなりテトリスが現れるというような感じでイメージを表現してましたが、
実はこれ嘘です。
どういうことかというと、これ実際にテトリスをプレイするようにテトリノミを配置します。
テトリスをプレイするとはどういうことなのかというと、
まずテトリスが無限遠方の高さから降ってきます。
上から降ってくるんですけども、横の位置を事前に指定しておきますので、
それが1つ目の数値でありますX座標という形になります。
ですので1つ目の数値で指定したX座標のところから、
無限遠方の高さからテトリノミが降ってくるわけですね。
指定している数字が1つの場合であれば、そのまま下にゾーンと落ちてきてですね。
すでに入力が指定されている場合は、
その入力のテトリノミの上にこの落ちてきたテトリノミが配置されます。
ですので今見ている図ですと、
入力0と1があって、その上にiのテトリノミが縦向きで落ちてきた時に、
0であればiは1つだけ上がったところに落ち着きますし、
入力が1の時は高さが2つあるので、その高さ2つのところの上に落ち着くようになります。
このようにですね、実際にテトリスを落として回路を作っていく、そういったイメージになります。
これがですね、数値が1つだけ指定している場合ですね、
無限遠方の決められた横位置のところからゾーンと落ちてくるという形になります。
では3つの数値が指定されている場合はどうかというと、
先ほど見た通り1つ目がx座標で、2つ目がy座標でした。
この1つ目の部分は先ほど言った通り、
09:00
無限遠方からこのxの位置にテトリノミが追いかれて、それがずっと落ちてくるということですね。
じゃあ次のyと3つ目のそのxですね。
これは無限遠方からずっと落ちてくるんですけども、
この落ちてきたテトリノミがyの2番目の数値で指定しているyのところにまで来たらですね、
3番目の数値で指定している数だけ横にずらすというようなイメージになります。
なので上からずっと落ちてきて、
yで指定された座標に来たなってなった瞬間に横にこの3番目の数値の分だけずらすというようなイメージですね。
ですのでこのノットゲートの2行目におけるOの配置としては、
まずOを無限遠方上側からx座標0のところでずっと落としていきます。
落としてきた落としてきて、先ほど見た白丸の部分ですね。
Oであれば右上の部分がy座標4のところまで来たぞってなったら、
x座標1行だけずらすというような形になります。
実際にちょっと見てみるとこのような感じで、
このLが配置された後ですがこの四角ですね。
これ落ちてきて落ちてきて4まで来た時に右にずらします。
この場合ですね、先に上向きのLでありますLUを配置しています。
ですのでLの出っ張りの部分が右側に存在しています。
その状態でこのOをyの座標4のところに来た時に右側にグググッとやろうとした時にですね、
入力が0の時はですね、別にこのLが邪魔しないのでそのままススッと右側に行けるんですけれども、
入力が1の時はこのLが1行だけ上側に位置しているので、
Oを右側にやろうとしてもですね、引っかかってですね右側に行けません。
ですのでOが左側に残り続けるということになります。
あとはそのこのOが配置した後に下向きのJであるJDですね。
それをですね上からポンと落としてあげていると。
そうすることで先ほどなんでこんな形になっているのかがわからなかったこのノットゲートというものが実現されているわけですね。