テーブルをもっと効率よくしよう †ここでふと気づいたことがある. ぷよぷよってのは重力のせいで(?)必ず下にブロックがたまる. 現状ではテーブルとしてすべてのマス目を用意してそこにブロックを配置しているが, 上の方の何も無い部分が無駄になるし,操作ブロックの落下地点判定の際にもある列をeachでなめなければならない. しかし,次の様なテーブルにすることで,無駄がなくなるし落下地点判定はある列の長さを取得すれば済む. さらに,列の長さに上限がないので,フィールド上部の見えない部分につまれたブロックも簡単に表現できる. この部分はコネクション判定に含まれないが,これは列の高さを@line_sで保持しているのでこの値より高い位置のブロックは弾けば良い. table = [ [b, b], [b, r, r], [], [], [b], [] ] 上の例はちょうど以下のようなテーブルを表す. | | | r | |br | |bb b | -------- さて,このようなテーブルにすると上記の通り落下地点判定が楽になりそうな気がする. というか落下させるだけならtable[r].push blockでよい. また,rubyでは配列の範囲外を参照したときはnilを返し,エラーにならないのでコネクションチェックの修正は必要ない. ついでに †ついでにスキマスイッチの処理について割と馬鹿なことやってた事にも気づいた. rubyでは配列のnilの要素を削除して配列をコンパクトにするメソッドcompactがあるのでこれを使えば一気にスキマスイッチを排除できる, def falldown_line(r) return unless @table[r].compact! @fallen = true @table[r].each.with_index do |block, l| block.line = l end end スキマスイッチを排除したら,コンパクトになったテーブルの列をなめてブロック自身の位置情報を更新しておく. |