一般的なテトリスにはつぎに現れるテトリミノが表示されます。上級者はこれらをみて高得点を狙います。ところがこれまで作成してきたテトリスには次に出現するテトリミノは表示されませんでした。今回は次に現れるテトリミノを表示させます。
ではNEXTブロックはいくつ表示させればいいのでしょうか? テトリスにはガイドラインなるものが存在し、これによると最低でも2つ先まで表示することになっています。多くのソフトでは3つ先まで表示し、ソフトによっては6つ先まで表示されるものもあるそうです。
・・・ということなので、ここは平均的な3つ先まで表示させることにします。
まずデザイナで以下のようにPictureBoxを3つつくります。そしてそこに次に出現するテトリミノのイメージを表示させます。PNG形式で以下のようなものを作成しました。これをリソースに追加します。
そして次にくるテトリミノのリストを作成します。Imageのリストは最初に1回作成すれば使い回しができます。int型が格納されたリストnextsはゲーム開始時に新しくつくりなおします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public partial class Form1 : Form { List<Image> nextImages = new List<Image>(); void InitNextImages() { nextImages.Add(Properties.Resources.i); nextImages.Add(Properties.Resources.o); nextImages.Add(Properties.Resources.s); nextImages.Add(Properties.Resources.z); nextImages.Add(Properties.Resources.j); nextImages.Add(Properties.Resources.l); nextImages.Add(Properties.Resources.t); } public Form1() { InitializeComponent(); InitNextImages(); // コンストラクタ内で呼んでおけばよいかと・・・ this.Size = new Size(480, 520); Timer.Tick += Timer_Tick; labelGameOver.Visible = false; ResetScore(); } } |
ところでミノの出現方法はランダムにおこなわれると考えていたのですが、実際にはそうではありません。7つのミノ(テトリミノと書くのは面倒だから今後は「ミノ」と書くことにする)が1セットになって1セットの中でランダムに出現します。そのため同じ種類のミノが2回連続で落ちてくることはあっても3回連続するということはないということになります。
自作メソッドInitNextでランダムに落ちてくるミノの順番を決めます。最初に少なくとも7回分の順番を決める必要があります。
自作メソッドInitNextのなかで7個のランダムな整数をつくる自作メソッド GetRandom7を呼びます。得られた値をList<int>型のフィールド変数nextsに格納します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public partial class Form1 : Form { void GameStart() { ResetScore(); InitNext(); // これを追加した labelGameOver.Visible = false; ClearField(); ShowNewTetoro(); Timer.Interval = 1000; Timer.Start(); } List<int> nexts = new List<int>(); void InitNext() { nexts.Clear(); nexts.AddRange(GetRandom7()); } } |
新しいテトリミノを作成するときはnextsから先頭の値をひとつだけ取り出して使います。そしてnextsの要素数が3になったら新しく7つの乱数を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public partial class Form1 : Form { void ShowNewTetoro() { MovingTetoros.Clear(); int startX = (FIELD_INNER_WIDTH - TETORO_SIZE) / 2; Tetoro_Type = nexts[0]; // ここで今回作成するテトリミノのタイプが決まる nexts.RemoveAt(0); // 今回つかった値は取り除く pictureBoxNext1.Image = nextImages[nexts[0]]; pictureBoxNext2.Image = nextImages[nexts[1]]; pictureBoxNext3.Image = nextImages[nexts[2]]; // nextsの要素数が3以下になっていたら追加する if(nexts.Count() <= 3) nexts.AddRange(GetRandom7()); // 新しいテトリミノを作成する処理、 // ゲームオーバーかどうかの判定する処理は省略 } } |