2010 07 19

テトリスを作り直すの3

まだテトリスの続き。

フィールドや壁のサイズを定義したのだから、表示も固定じゃなくて定義値を使うべきだろう。 という訳で、フィールドのHTMLをloadイベントの中でやるように変更した。

// 初期処理 window.onload = function () { document.getElementById( 'field' ).innerHTML = ( function () { var wallCell = ''.tag( 'div' ).tag( 'th' ); var bodyCell = ''.tag( 'div' ).tag( 'td' ); var wallLine = wallCell.times( C.WIDTH ).tag( 'tr' ); var bodyLine = ( wallCell.times( C.H_WALL ) + bodyCell.times( C.WIDTH - C.H_WALL * 2 ) + wallCell.times( C.H_WALL ) ).tag( 'tr' ); return wallLine.times( C.V_WALL ) + bodyLine.times( C.HEIGHT - C.V_WALL * 2 ) + wallLine.times( C.V_WALL ); } )(); document.getElementById( 'start' ).onclick = ( new Controller() ).start; };

唐突に出てくるメソッド tag と times は、文字列用のユーティリティとして作ったもの。 tag は指定のタグで囲った文字列を返す。 times は指定回数繰り返した文字列を返す。

// 文字列用ユーティリティ String.prototype.tag = function ( tagName ) { return '<' + tagName + '>' + this + '</' + tagName + '>'; }; String.prototype.times = function ( n ) { for ( var s = '', i = 0; i < n; i++ ) { s += this; } return s; };

仕事だと、組み込みオブジェクトのprototypeにメソッドを勝手に追加するなんてまず許されないのだが、個人でやる分にはやりたい放題なのがいいね。

さて、作り直した結果が前回と全く同じってのも芸が無いので、昨日思いついた 「4×4の領域内からランダムに4つ選んだ特殊テトリミノが不定期に混ざる」 を実装してみた。

これ、単に邪魔な要素でしかないので、混ざり過ぎるとゲームにならない。 ということで、以下の仕様とする。

変更したのは、新しいテトリミノを取得する部分。

// 変更部分 TETRIMINOS.get = function () { if ( !document.getElementById( 'randomize' ).checked || Math.random() * 100 > 5 ) { // 95% return this[ Math.floor( Math.random() * TETRIMINOS.length ) ]; } else { // 5% var SIZE = TETRIMINOS[ 0 ].cells.length; var tetrimino = { cells : [], color : 'gray' }; for ( var tmp = [], num = SIZE; num > 0; ) { var cell = Math.floor( Math.random() * SIZE ) * C.WIDTH + Math.floor( Math.random() * SIZE ); if ( !tmp[ cell ] ) { tmp[ cell ] = true; tetrimino.cells.push( cell - C.WIDTH - 1 ); num--; } } return tetrimino; } };

言うまでもないが、画面のHTMLに、randomizeというIDでチェックボックスを追加している。 あと、コントローラーの start と stop で、開始ボタンの操作可否を設定しているところに、チェックボックスの操作可否も併せて設定するようにした。

これ、実際に非正規を混ぜてやってみると、結構ストレスが溜まる。 程々に積み上げてI型のを待っているところに、非正規が連続して現れてぶちこわしになったり、正規のテトリミノと同じ形だと思って油断してたら回転の中心が違ってて、思わぬところに着地したり。 それが狙いではあるのだが、テストプレイはもう一人SM状態。 俺はいったい何をやってるんだ。

ところで、このソースコードって、規約とか厳しい人からすると激怒ものなんだよな。

等々。 悪いと判ってるなら止めりゃいいようなものだが、行が増えるのも嫌なんだよね。 そのくせ、if や for の後には必ずブロックだったりする矛盾。 ま、仕事じゃやれないんだから、こんな時ぐらい好きにするのだ。 あと、コメントが全く無いことについては、由緒正しい日本人として 「沈黙は金」 と言っておく。