PythonでゲームやGUIアプリを開発していると、最初は数個しかなかったファイルが、気付けば何十個にも増えていることがあります。
私も現在開発している麻雀CPUで、まさに同じ経験をしました。
最初は
- main.py
- gui.py
- detect.py
くらいのシンプルな構成でした。
しかし、新しい機能を追加するたびにファイルが増え、
「この処理はどこに書いたっけ?」
と探す時間が少しずつ増えていきました。
そこで現在は、役割ごとにフォルダを分ける構成で開発しています。
今回は、現在の麻雀CPUのディレクトリ構成を例に、私がどんな考えでフォルダを整理しているのか紹介します。
私は最初からフォルダを分けません
前回の記事でも紹介しましたが、私は最初から完璧な設計を考えるタイプではありません。
まずは動くものを作ります。
そして、
「最近コードを探す時間が増えてきたな」
「どこへ追加すればいいか迷うな」
と感じたタイミングで整理します。
ディレクトリ構成も同じです。
最初から細かくフォルダを作るのではなく、
必要になったら分ける
という考え方で開発しています。
現在のディレクトリ構成
現在の麻雀CPUでは、役割ごとにフォルダを分けています。
※開発途中なので今後も変わると思いますが、現時点では次のような構成になっています。

開発当初からこの構成だったわけではありません。
機能が増えるたびに
「この処理はまとめた方が分かりやすそうだ」
と思ったタイミングで整理し、少しずつ現在の形になりました。
detectフォルダ
detectフォルダでは、牌の検出・分類を担当しています。
CameraWorkerではカメラから映像を取得し、
HaiDetectionでは取得した画像から牌を検出・分類します。
つまり、
「牌を認識する」
という役割だけをまとめています。
画像認識を修正したい場合は、このフォルダだけを見れば済むようになっています。
guiフォルダ
ここにはGUIに関する処理をまとめています。
例えば、
- メイン画面
- ゲーム画面
- 設定画面
- ボタン
などです。
GUIは画面を表示し、ユーザーの操作を受け付けることだけを担当しています。
CPUが何を切るか考えたり、画像認識を行ったりする処理はここには書いていません。
役割を限定することで、画面だけを修正したいときに迷わなくなりました。
mj_utilsフォルダ
このフォルダは、麻雀CPUの思考部分です。
例えば、
- 捨て牌候補の生成
- 手牌の評価
- CPUレベル
- 最終的な捨て牌の選択
などをまとめています。
最初はMahjongDecisionだけでしたが、
機能が増えてきたため、評価処理や候補生成などを別ファイルへ分割しました。
現在でも、一番開発頻度が高いフォルダです。
modelsフォルダ
ここにはAIモデルを保存しています。
現在は、
- YOLOの物体検出モデル
- 画像分類モデル
などです。
推論処理とは分けて管理しているため、モデルを更新するときも、このフォルダだけを確認すれば済みます。
utilsフォルダ
utilsには、小さなオブジェクトや共通で利用するクラスをまとめています。
例えば、
- Hai
- Player
- Kyoku
- Enum
などです。
GUIでもCPUでも利用するため、
どこか一つの機能だけに属さない共通部品として管理しています。
私は、
「どこへ置くか迷ったらutils」
ではなく、
複数の場所から利用するものだけ
を置くようにしています。
GameManagerだけはルートに置いています
一つだけ例外があります。
それが
game_manager.py
です。
GameManagerは
- GUI
- 麻雀CPU
- 画像認識
すべてをつなぐ司令塔です。
どこか一つのフォルダへ所属するというより、
プロジェクト全体を管理するクラスなので、ルートへ配置しています。
一番大切にしていること
私は、
「きれいなディレクトリ構成」
を目指しているわけではありません。
一番大切にしているのは、
“どこを修正すればいいか迷わないこと”
です。
例えば、
CPUを改善したいなら → 「mj_utils」
GUIを変更したいなら → 「gui」
画像認識なら → 「detect」
を見るだけです。
数週間ぶりにコードを書くこともありますが、
「まずどのフォルダを開けばいいか」
が分かるだけで、開発のしやすさは大きく変わります。
私にとってディレクトリ構成は、
未来の自分が迷わないための整理術
だと考えています。
まとめ
ディレクトリ構成・フォルダ構成に正解はありません。
フォルダ構成は、人に見せるためではなく、未来の自分が「どこを開けばいいか」で迷わないために整理しています。
開発を続けていると構成は必ず変わります。
だから私は、最初から完璧を目指すのではなく、その時の自分が一番開発しやすい形へ少しずつ育てていくことを大切にしています。
もし最近、
「コードを探す時間が増えてきた」
「どこへ機能を追加すればいいか迷う」
と感じているなら、一度役割ごとにフォルダを整理してみると、開発しやすくなるかもしれません。
関連記事
現在開発中の麻雀CPUでは、今回紹介したディレクトリ構成で開発を進めています。
興味のある方は、こちらの記事もぜひご覧ください。



コメント