プログラミング教室 Tetrisの実装 - K0me-Lab

Minoのブロック配置の
データ構造
K.Yonezawa
MinoBlocksクラスの必要性


MinoクラスのインスタンスはMinoのブロック並びを管理し、
TetrisFieldインスタンスにそのブロック並びが有効(置ける)
かを問い合わせる
「Minoのブロック並び」を保持するクラスがあると、一度に複
数ブロック座標をまとめてTetrisFieldに渡すことが出来て楽
MinoBlocksクラスの要件

N個(Create時に指定)のブロック座標と状態(色)が保持
できること



TetrisFieldオブジェクトが、MinoBlocksで表せるMinoと
ぶつからないか判別できること
移動が簡単に出来ること


出来れば、無駄なメモリが不要なようにしたい
上下左右
回転させることが出来ること

将来的に複雑なMinoを実装する場合、回転出来ると便利
(TetraMinoの場合はあまり重要ではないが…)
MinoBlocksの表現法

ベース座標とそこからの相対座標(ベクトル)により表す
(0, -1)
Base
(1, -1)
(1, 0)
(1, 1)
Block(i)の絶対座標
= Baseの絶対座標 + Block(i)の相対座標
MinoBlockの移動

Base座標にのみ移動分を加えればよい
(0, -1)
(1, -1)
Base
(1, 0)
offset (2, -2)
(1, 1)
Base
(OLD)
Base += offset (2次元ベクトル)
MinoBlockの回転

Base座標を中心とした回転なら、各相対座標の
単純計算だけで事足りる
90度
A
(0, -1)
B
(1, -1)
Base
C
(1, 0)
D
(1, 1)
90度回転
回転後x = - 回転前y
回転後y = 回転前x
270度回転
回転後x = 回転前y
回転後y = -回転前x
D
(-1, 1)
Base
A
(1, 0)
C
(0, 1)
B
(1, 1)