ようやくコードを書く。
ところで、たまに 「何も考えなくてもコーディングできるぐらいに、事前にしっかり考えておくことが必要」 なんて言う人がいるが、そーゆーのって無理だよな。 いや、そんなんことを言う人には出来るのかもしれないが、俺には無理。 ついでに言うと、そんなことを出来ると思っている人のほとんどには、もっと無理。 実際にやってみたら違うってことは、どんな分野でだってありふれてるし当たり前のことなのだ。
と、自分で自分に言い訳をして。
いつものことだが、見えるところから手をつける。 まずはフィールド表示のテーブル…と考えて、いきなり止まる。
テトリミノの回転とか移動とか、やったと仮定した結果がフィールドに収まっているかどうかで、実際に回転や移動が出来ることを判定する。 こんなときによくやるのは、はみ出しに対しても画素を用意しておいて、その画素を使用不可(今回なら固定ブロック)に設定しておくこと。 そうすると、そこに画素が存在するかどうかをチェックしなくてすむので楽なのだ。
で、今回もそうしようと思ったのだが、よくよく考えてみると、これをやって楽なのってはみ出しの判定だけだよな。 行が固定ブロックで埋まったことの判定は、どっちでも変わらない。 面倒そうなのは、その後に続く、埋まった行を消して上をずらす処理。 「対象行に一つ上の行をコピーするのを、一つ上の行が空行になるまで繰り返す」 とするのが簡単そうだが、この 「一つ上の行が空行になる」 の判定で、はみ出し判定用の固定ブロックが邪魔になりそう。
それでも一応、と、はみ出し部分の画素有りでテーブルを表示してみたら、なんかちょっと不細工だった。
これが決定打で却下。
やっぱり見た目は大事だし。
で、テーブルはフィールド用の画素だけで構成して、
id = "field"
としておく。
あと、
id = "start"
として開始ボタンと、
id = "score"
として得点表示用のオブジェクトも。
で、JavaScriptの方。
// まだ何もしないし出来ない
function Tetrimino( offset, initialPattern ) {
var offset;
var pattern;
this.cells = function () {};
this.move = function ( addOffset ) {}; // return new Tetrimino();
this.turn = function () {}; // return new Tetrimino();
}
function Cell() {
var td;
this.setState = function () {};
this.getState = function () {};
this.setColor = function () {};
this.getColor = function () {};
};
function Field( controller ) {
var field;
var tetrimino = null;
this.init = function () {};
this.turn = function () {};
this.left = function () {};
this.right = function () {};
this.down = function () {};
this.drop = function () {};
};
function Score() {
var score = 0;
this.init = function () {};
this.countUp = function ( count ) {};
}
function Controller() {
var field = new Field( this );
var score = new Score();
var started = false;
this.start = function () {};
this.stop = function () {};
this.report = function ( count ) {};
}
window.onload = function () {
var controller = new Controller();
document.getElementById( 'start' ).onclick = controller.start;
};
必要だろう内部オブジェクトとインターフェースだけの、まだ何もしないし出来ないコード。 流石にシンプルで見通しがいいな。 このまま一気に作ってしまいたいところだけど、今日はもう遅いので、続きはまた明日。