【テトリスを作る②】基本機能の実装

「テトリスを作る」第2回は、SRSシステムやスコア計算を除く基本機能の実装です。

前回の記事はこちら

具体的には、

  • Tetrominoクラス
  • PlayFieldクラス
  • Tetrionクラス
  • Canvasクラス(GUI用)
  • EventHandlerクラス(キー入力管理)
  • Applicationクラス(GUI起動)

を作成します。なお、当初はC++での実装を考えていましたが、GUI作成の手間を考えてPythonで実装することにしました。(後でテトリスの動作に直接関係する部分だけC++に書き換える可能性もあります。)今回はこちらの記事を参考に、Tkinterを用いてGUIを作成します。

テトリスのコア機能

Tetrominoクラス

今回、Tetrominoクラスに保持させる情報は以下の通りです。

  • 色(GUI用)
  • Tetrominoの座標 (色々な用途)
  • Tetrominoの形状(SRSシステム用)
  • 回転した回数(SRSシステム用)
  • 通常の回転における中心点

また、移動・回転による座標計算もTetrominoクラスで行います。後にPlayFieldクラスで実装する、移動可能 / 回転可能 判定を容易にするために、Tetrominoインスタンスをコピーするための関数も作成します。ソースコードはこちら。(リポジトリ公開したらリンク貼ります。)

PlayFieldクラス

今回はテトリスの盤面をnumpyの二次元配列で表現します。GUIの色塗りを考えなければビットマップで十分ですが、今回はTetrominoの種類を区別するために0から7の整数値を使用します。

PlayFieldクラスが持つ情報は、

  • 盤面の横幅
  • 盤面の高さ
  • 盤面の状態

です。また、PlayFieldクラスは以下の操作を行います。

  • ゲームオーバーの判定
  • 移動可能判定
  • 回転可能判定
  • 横一列Tetrominoが揃った際の削除
    • テトリスの判定もここで行う(未実装)
  • Tetrominoを盤面に固定

ソースコードはこちら。(リポジトリ公開したらリンク貼ります。)

Tetrionクラス

Tetrionクラスはテトリスの制御を担当します。Tetrionクラスは以下の情報を持ちます。

  • 盤面(PlayFieldインスタンス)
  • 現在操作可能なTetromino
  • Tetromino生成器
  • ホールドされたTetromino(未実装)
  • 描写用クラス(Canvasクラス)

Tetrionクラスが担当する操作は以下の2つです。

  • ゲームの開始・終了
  • ユーザー操作の反映(回転・移動)

回転・移動の判定はPlayFieldクラス、回転・移動に伴う座標の計算はTetrominoクラスで行ったため、Tetrionクラスでする必要があるのは、適切な回転軸の設定および移動ができない場合の処理です。

回転軸の設定はSuper Rotation System(SRS)に従って行います。場合わけが多く煩雑なため、この実装は次回以降に行います。

Tetrominoの生成は、7種類のTetrominoを1巡ずつするようにランダムに行います。つまり、7種類のTetrominoのランダムな順列を連続して出力していきます。

ソースコードはこちら。(リポジトリ公開したらリンク貼ります。)

GUI及びアプリケーション起動に関する機能

これらの機能についてはあまり本質ではないと考えるため、簡単に触れるに留めます。

Canvasクラス

盤面を色を付けて描写するためのクラスで、TkinterのCanvasを継承して作ります。絵を描くための紙みたいなものかなーと思ってます。

盤面、Tetromino共に正方形の塊として描写しています。盤面の状態が変化した際は変化した部分(差分)のみを描写する仕様です。

ソースコードはこちら。(リポジトリ公開したらリンク貼ります。)

EventHandlerクラス

このクラスではあるキーを押した際の動作を決定します。例えば、左矢印でTetrominoを左に動かす、などの操作です。キーと動作の対応付けはTkinterで提供されているbind関数を用いて行います。

ソースコードはこちら。(リポジトリ公開したらリンク貼ります。)

Applicationクラス

これまで作成してきたテトリスを実行するためだけのクラスです。TkinterのTkを継承して作ります。

ソースコードはこちら。(リポジトリ公開したらリンク貼ります。)

この記事は役に立ちましたか?

もし参考になりましたら、下記のボタンで教えてください。

関連記事

コメント

この記事へのコメントはありません。

CAPTCHA