ぴよまるの雑多な技術所

間違えて休職中ってずっと書いていて心配されていました。全部ちょっとずつ齧って好きって思える技術を見つけたい。研究分野は数理最適化。

Pythonでテトリスを作ることでよく知らない分野の実装手順について考察する(1)設計編

今年はコーディング力向上を目標にしており、いろんなジャンルのコードを自力でゴリゴリ書こうと思っています。理由としては普段自分で考えて実装する時間が少なくコンプレックスだからです。 まずは落ちものゲームの代表であるテトリスPythonでゴリゴリ書いてみました。 前提として、私はゲーム系のプログラミングの常識を知らず、そもそもテトリスで遊んだことがありません。実装を通してよく知らない分野の実装手順について考察します。 今回は前編として、実装前の設計と事前調査部分についてまとめます。

リポジトリは以下です。

github.com

テトリスとは

上からテトリミノというブロックが落ちてきて、横一列揃うとブロックが消えるゲームです。

テトリスの仕様

ネット上で調べたところ、下記のような項目にまとめられそうでした。

  • できる操作はテトリミノの左右移動、落下速度をあげるの3つ
  • テトリミノの種類は7種類で、90°の回転でそれぞれ4パターンずつ
  • テトリミノは縦横最大4*4
  • 横1列揃ったらその行のブロックを消す
  • ゲームスクリーンは横6、縦20(一般的ではなく今回向けの仕様)

実装方針

  • ゲーム画面は配列で管理する
  • テトリミノはクラスのインスタンスとして管理する
    • 自分の座標、回転の種類、状態(非表示、移動中、停止)をもつ
  • テトリミノの管理は配列を用いる
  • 描画とできる操作は関数として定義する

まとめ:よく知らない分野の実装手順(設計編)

  1. 実装対象について実際に動かして仕様を調べてみる
  2. 実装対象の分野(今回ならゲーム)の常識を調べる(今回の例なら以下のようになる)
    • リアルタイムのゲーム系は無限ループを回しておく
    • リアルタイムのゲーム系は無限ループの中で状態更新、画面描画を繰り返す
    • ゲーム盤面やパズルパーツを配列で管理する
    • キーボード入力のとり方
  3. 実際のオブジェクトと操作を洗い出し、クラスと関数を書き出してみる
  4. 処理順序の確認をする(無限ループのなかで表示をするとか、状態更新いつするとか)