Pythonでテトリスを作ることでよく知らない分野の実装手順について考察する(3)反省編
ブログ記事を書く際にテトリスの実装を実際にしたわけですが、かなり時間を取られました。 どうしたら早く動かないところを動かすことができるか、web系ではないときのデバッグをどうするべきか少しわかったと思うので、メモしておきます。内容としてはどうやってデバッグしてきたかと、テトリスの実装手順をまとめています。
ぶつかった壁
- なぜか全体的に動かない
- テトリスが落ちてこない / 操作しても右に行かない などなど。こういうときにコードを眺めて、変えて、動かして…を繰り返していたら夜が明けました。 その中で試してよかったことと次からこうした方がコーディングが早くなるのではと思ったことを以下にまとめます。
やったこと
(youtubeでテトリスの実装動画をみて実装手順・ロジックを確認)
どうしても動かせずにこちらの動画を視聴しました。「3.ロジックの見直し」はこの動画での実装を参考にしています。 また、実装をしていく中でどの単位で動かすかの参考と、自分の考えたロジックの答え合わせにも使いました。
(デバッグしやすい環境を整える)
VSCodeを使っているのですが、F10やF11キーを押すのがMacだとめんどくさいです。
こちらを参考にMacでもデバッグしやすい環境、つまりF11キーだけでステップイン実行できる環境を整えました。
( ロジックの見直し(テトリスが衝突したときの扱い))
テトリスが衝突したとき、メインのゲームクラスが持っているテトリミノの配列に新しいテトリミノを入れていました。テトリミノはスクリーンに即時反映します。つまり、描画処理はメインのゲームクラスが持っているスクリーンをprintするだけになります。 こうではなくて、テトリミノは常に1つだけで、壁に衝突したらスクリーンの一部にすることにしました。こうすると移動したときの描画が楽になります。ゲームクラスが持っているスクリーンとテトリミノを重ねて表示するだけなので。
反省
- 実装は1つの処理ずつ行って、実装できたらすぐ動かして確認する
- なるべく実装する手順をシンプルな単位に切り分けてから実装をする
- 設計段階ではメソッドやオブジェクトを洗い出しているので、どの順序で実装するかよく考える
- コードを目で追うのではなくデバッガで変数の中身を確認しながら追う
参考:テトリスの実装手順
(スクリーンの表示)
- スクリーンをfor文を使って描画する(配列のインデックスに注意)
- テトリミノの種類や回転をEnumなどで表現する
- スクリーンとテトリミノをコピーして描画するメソッドを作って動かしてみる
(テトリスの落下)
- 1秒ごとにテトリスが落下するメソッドを用意し、結果を描画する
(テトリスの操作)
- キーボード入力を受け付ける
- キーボード入力でテトリスの位置が移動することを確認する。この時点では壁にめり込む
(壁との衝突検知)
- テトリミノが壁に衝突したか判断するメソッドを用意し、衝突していたら移動しないようにする 実装内容としてはテトリミノの形状と、スクリーンの中でテトリミノを配置すべきところを1pxずつ確認して衝突していないか判断する
(テトリミノの固定)
- 落下させたとき、壁にぶつかったらテトリミノはスクリーンと同化する
- 同化したら次のテトリミノを生成する
(テトリミノの削除)
- テトリミノを1つずつ下に移動させて一番上の行を削除