ぴよまるの雑多な技術所

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

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

今回は後編として、実装したコードについて書きます。 前回の記事は以下です。

let-piyomaru.hatenablog.com

リポジトリは以下です。

github.com

実装する際にどういう手順で取り掛かるかも悩んだので、私が実際に考えた順に記事を書きます。内容としてはクラス設計、実装を悩んだ箇所の調査、実際の実装という順番です。 ちなみにまだリポジトリのコードは動きません。とりあえず動いたら追記します。

クラス設計

ゲームクラス

  • フィールド
    • スクリーン
    • テトリミノ
    • 次に落下するテトリミノ
  • メソッド
    • 初期化
    • テトリミノの衝突判定(衝突していたら固定)
    • 1行埋まったかの判定
    • 次に落下するテトリミノの生成(種類・回転をランダムに決定)
    • ゲームオーバー判定(次に落下するテトリミノが入りきらない時)
    • メインからゲームループの中で呼ばれる処理(ゲームの流れの管理)
    • スクリーンの描画処理

テトリミノクラス

  • フィールド
    • x座標
    • y座標
    • 回転の種類
    • テトリミノの種類
  • メソッド
    • テトリミノの左右移動
    • テトリミノの下移動

シーケンス設計

初期化

  • スクリーンの初期化
  • テトリミノの初期化
  • スクリーンの表示
  • 次に落下するテトリミノの生成(種類・回転をランダムに決定)
  • 左右と回転

ゲームループの中

  • テトリミノの衝突判定
    • 衝突していたら次に落下するテトリミノの生成
    • していなければテトリミノのy座標を1つ落とす
  • キー入力があれば動かせるか判定してテトリミノの操作
  • ゲームオーバー判定
  • スクリーンの描画処理

詰まった実装

Pythonでキー入力を受け取る

  • pip install readchar
import readchar
while True:
    kb = readchar.readchar()
    if kb == "q":
        break
    else:
        print(kb)

(注意)上記の実装だとキー入力があるまでループが止まります

キー入力で待たない

こちらの記事のコードをお借りしました。

Pythonでキー入力待ちをしないキー入力 - Qiita

(だいたい)1秒ごとに描画ループ

import time
while True:
    # 何か処理
    time.sleep(1)