見出し画像

テトリスでプログラミングを試そう(8)

こんにちは。
プログラムを書くのは絵を描いたりするのと同じで、なかなか楽しいですよね。
今日は T ミノを表示してみましょう。

テトリミノは4つの四角形からできているので、
四角形の左上隅の x座標、y座標 の4つ(つまり8つの整数値)をまとめて扱う class を1つ作っておきましょう。
int[] _8int と書くと、_8int は整数の配列を表します、という意味になります。new int[8] とすると、_8int は _8int[0], _8int[1], … , _8int[7] という形で8つの数字をまとめて扱えるようになります。

_8int[0] と _8int[1] が1つ目の四角形の x座標、y座標を表し、
_8int[2] と _8int[3] が2つ目の四角形の x座標、y座標を表すというように考えています。

次に、ミノを担当してくれる係りを作っておきます。

L90, L91 で、_color と _px_8int_cur の2つの情報を記録できるように設定しています。null については、また後日解説します。

そして、Set() を通して、自分の _color と _px_8int_cur に情報を記録するようにします。
L93 で init_8int として、8つの整数をまとめてもらうように考えているのですが、これはピクセルの座標ではなくて、4×4マスの座標を考えています。

例えば、init_8int[0] = 1, init_8int[1] = 0 であれば、(1,0) のところに四角形がある と考えます。そのため、ピクセルの座標を設定するときには、Game.Px_BLOCK を掛け算してピクセル座標に変換しています。
L99 で、init_8int[idx] + 4 と、x座標をずらしていますが、ミノを最初に画面に表示するとき、ミノを画面の中央付近に表示したかったためです。

ピクセル座標は、_px_8int_cur の中にある _8int という配列に記録するため、
L96 で int[] dst_8int = _px_8int_cur._8int; という一手間を掛けています。

次に、class Mino に、表示する機能も付けましょう。class Mino {} の中に、下のプログラムを追加してください。

コピペしやすいように、コードを貼り付けておきますね。

class Mino
{
	Color _color = null;
	Px_8int _px_8int_cur = new Px_8int();

	public void Set(Color color, int[] init_8int)
	{
		_color = color;
		int[] dst_8int = _px_8int_cur._8int;
		for (int idx = 0; idx < 8; idx += 2)
		{
			dst_8int[idx] = (init_8int[idx] + 4) * Game.Px_BLOCK + 1;
			dst_8int[idx + 1] = init_8int[idx + 1] * Game.Px_BLOCK + 1;
		}
	}

	public void Draw(ICanvas canvas)
	{
		canvas.FillColor = _color;

		int[] px_8int = _px_8int_cur._8int;
		for (int idx = 0; idx < 8; idx += 2)
		{
			canvas.FillRectangle(px_8int[idx], px_8int[idx + 1]
					, Game.Px_INNER_BLOCK, Game.Px_INNER_BLOCK);
		}
	}
}

せっかくなので、とりあえずミノを表示させてみましょう。
class ColorField の Draw() の {} の中 に、以下の3行を追加してみてください。
Mino mino = new Mino(); で、ミノを担当する人(名前は mino)を1人作り、その人に、Set() と Draw() をするようにお願いしています。

{1, 0, 0, 1, 1, 1, 2, 1} という8つの数字が見にくいですが、(1,0) と (0,1) と (1,1) と (2,1) の4つの四角形を表しています。上の方にある4×4のマス目を考えれば、Tミノを表していると分かると思います。

この状態で F5キーを押して実行すると以下のようになります。
Tミノが画面の中央付近に表示されていますが、それはさきほど
init_8int[idx] + 4 として x座標をずらしていたからです。


備考
ミノを担当する人を作るとき、Mino mino = new Mino(); と2回も Mino と書くのが面倒だ、と考える人もいます。私もその気持は分かります。
Mino mino と書けば、mino さんは class Mino の機能を担当する人、と分かりますからね。
そのように思う人は、Mino mino = new (); と書けばオッケーです。
また、var mino = new Mino(); と書く人もいます。
どの書き方でも同じ意味になるので、好きな書き方で書きましょう^^。


この記事は1日1時間くらいを掛けて、日記の気分で書いています。
そのため、8回目になりますが、プログラムはまだ 100行程度とまだまだ全然進んでいません。
「遅くてすみません」と思っているのですが、みなさんが息抜きの時間にちょこっと読んでもらえると嬉しいです。

もし、本格的にプログラムを学ぼうと思ってらっしゃる方がいましたら、是非プログラムコードを入力して実行してみて下さい。
簡単な割に、案外理解に役立つものになっていると思いますので。
それでは。

この記事が気に入ったらサポートをしてみませんか?