「テトリスを作る」第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を継承して作ります。
ソースコードはこちら。(リポジトリ公開したらリンク貼ります。)
この記事は役に立ちましたか?
もし参考になりましたら、下記のボタンで教えてください。
コメント