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