テトリスのデータ

昨日アップしたサンプルでは、わかりやすいように4×4の2次元配列でブロックを表現するようにしている。
単純にそれを右回転させることで回しているわけだ。
がんばって自分で計算してるけど、Rubyの配列だからその機能を使って、全体をtransposeして行ごとにreverseすれば90度右回転できる。
回転の状態を0〜3であらわして、基準の状態から毎回その回数だけ回転させるから、左回転は必要ない。


回転の仕方が標準とは違って違和感があるかもしれない。
単純に回すだけでは、標準仕様どおりにならないようになっているからだ。
これをなんとかするには、ブロックごとに全パターンをデータで持つとか、四角と長い棒以外は回転を右上9マスに限定して、長い棒は例外的に2パターンとするとか、そんな感じになるんじゃないかと思う。
このあたりは、たとえば配列を4×4に限定しない、など、データ構造から見なおせばもっと色々な可能性が見えてくる。
でもそうすると回転ロジックも根本的に作り直すことにもなる。


フィールドのデータは枠も普通にブロック扱いになっている。
そうすることで、はみ出したチェックや、一番下に落ちたチェックが省けるからだ。
フィールドは12×21の2次元配列で、nilが何もないところになっていて、index(nil)とすればその行が埋まっているかどうかが一発でわかる。
埋まってたらdelete_atで消して、unshiftで先頭に枠のみの行を追加すれば、行を消すことができる。
Rubyの配列は便利だと思う。


落ちたブロックは、ブロックの種類の番号0〜6をフィールドに書き込んでいる。
ブロック番号を1〜7にして、フィールドの何も無いところを0にして、ブロックのデータのブロック部分を1固定じゃなくてブロック番号にしてやれば、判定なしの単純足し算でいけるかもしれない。


テトリスモドキを作るためには、データ構造をまず設計する必要がある。
アルゴリズムはすべてそこからスタートするわけで、そうならざるを得ない。
これは極端なほどにData Oriented Approachの考え方であって、一般的なゲームの作り方ではない。