テトリスの作り方

投稿者: | 2012年5月22日

1.はじめに

ここでは、テトリスの作成方法について説明します。テトリスは、説明するまでもないですが落ちゲーの代名詞ですね。テトリスが出た後の数年間は落ちゲーブームを作り、今や定番のジャンルとなっています。

何が新しかったかというと、下に落下するまでの時間内に考える、というリアルタイム性を導入したことで、シンプルなルールでも、奥深いゲームを表現することが可能になった…、という、当時としては革新的なゲームでした。

落ちゲーの元祖であるテトリスの作り方を知っておくことで、他の落ちゲーを作るときに、色々と役に立つと思います。

2.データ領域を作成する

テトリスは、通常「10×20」の領域にブロックを配置します。

ということで、「10×20」の2次元配列のデータ領域が必要となります。


壁を作成する

ただし、単純に「10×20」ですと、ブロックを左右または下に動かした場合、

ブロックを回転をした場合などに、領域を超えてしまうことがあります。

それを防ぐために、「12×21」の領域を確保し、左右と下に「壁」を作成します。

例では、「0」を何もない状態、「1」を壁としています。こうすることにより、ブロックが画面の端からはみ出ないように制御することが容易になります。

3.ブロックパターンを作成する

次に落下するブロックのパターンを作成します。実は、ここがテトリスを作るうえで一番大変な部分です。ブロックのパターンの作成方法により、後の処理方法が決まってしまうからです。

とりあえず、普通のテトリスは、以下の7種類のブロックがあります。

この7種類のパターンをデータで表現するには、例えば以下の方法があります。

  1. 「4×4」の領域を確保する
  2. ブロックのある座標を保持する

1の場合は、以下のようにデータを保持することとなります。(「0」が何もない部分。「2」がブロックの部分)

「4×4」の領域が必要となるのは、テトリス棒(■■■■)が「4」の長さであるためです。

ただ、こうすると無駄なデータが多くなってしまいます(「0」の部分が多い)。そこで、2の方法を用いれば、データが少なくてすみます。

2の方法の考え方としては、テトリスのブロックは、すべて「4ブロック」から構成されているということを利用します。つまり、X座標とY座標を持つ構造体を用意し、配列要素を「4」することで、パターンを保持します。例えば、以下のようなブロックであった場合、

2の方法を用いると、(x ,y) = (0, 0), (0, 1), (0, 2), (1, 2) といった形でデータを表現できます。

シンプルなデータ構造となりますが、移動、回転などの処理が多少複雑になります。

ここまで、ブロックのデータの持ち方の説明をしましたが、これを、

  • 各種ブロックごと
  • 回転角度ごと

に作成することが必要になります。

つまり、「各種ブロック」という配列があり、その中に「ブロックの回転角度」という配列があり、さらにその中に、「ブロックパターン」配列が存在することとなります。

…なんだか、三次元配列となってしまいますが、この方法が一番効率が良いようです。

4.各種処理を作成する

移動/回転処理

ブロックを表示する場合、表示の開始座標を別に管理しておきます。その開始座標をもって、先ほど用意してブロックパターンを表示します。例えば、「4×4」の領域でブロックパターンを確保した場合は次のようになります。

開始座標が○です。ここを基点として、ブロックを表示します。また、X座標/Y座標でブロックパターンを保持した場合は、基点(○)から見て、どの座標になるかを計算して、表示を行います。移動する場合には、○を動かして、壁にぶつかった場合は移動をさせない、という処理を行います。回転時には、ブロックパターンを遷移して壁に埋まるようなら、回転をさせない、という制御を行います。

消滅処理

消滅処理は「ダルマ落とし」です。

例えば、1, 3, 4段目が消滅するとします。

その場合には、まず1段目を消して、2段目を「1つ」下にずらします。

その後、3・4段目を消し、5・6・7段目を「3つ」下にずらします。

ゲームオーバー判定処理

ゲームオーバーの判定は、新しいブロックが出現したときに、重なる部分(下の灰色で1の部分)が存在した場合がゲームオーバーです。

ブロックパターンを作成するところと、そのパターンを用いて、はみ出さないように処理をする部分が、テトリス作成のキモであると思います。

あとはブロックがどのタイミングで下に移動するか、という部分をうまく作れればテトリスは完成です。