見出し画像

【疑似3DダンジョンRPG開発日誌 06】3500行超のコードを4ファイルに分割しました

Pyxelで疑似3DダンジョンRPG「グラヴェンの傷跡」を作っています。 今回はひとつのファイルに詰め込んでいたコードを整理した記録です。


dungeon_rpg.py が3500行を超えてきた

開発を続けるうちに、最初は1ファイルで管理していた dungeon_rpg.py が どんどん膨らんでいきました。

  • マップデータ

  • ゲームの定数

  • キャラクター・スキル・アイテムなどのデータ辞書

  • ユーティリティ関数

  • Player / Party / Enemy / Battle クラス

  • DungeonRPG クラス(描画・入力・シーン管理)

全部が1ファイルに入っている状態だと、 「スキルを直したいのにどこにあるかわからない」 「敵データを変えたいのに…」 というストレスが増えてきました。


方針:役割ごとに4つに分ける

コメントで6ブロックに整理されていたので、それに沿って分割することに。

data.py        → マップ・定数・全ゲームデータ(辞書類)
utils.py       → ユーティリティ関数
models.py      → Player / Party / Enemy / Battle クラス
dungeon_rpg.py → DungeonRPG クラス(メイン)+起動の1行

ポイントは一気にやらないこと。 1ファイルずつ切り出してそのたびに動作確認する、という手順で進めました。


1.data.py を作る

マップデータ・定数・CHAR_DATA / SKILL_DATA / ENEMY_DATA などの データ辞書を全部 data.py に移動しました。

# data.py の先頭
import copy

dungeon_rpg.py 側はこの1行を追加して、元のデータ定義を削除しました。

from data import *   # ← 追加

from data import * と書くと、data.py の中身を全部取り込めます。 なのでコード上は何も変えなくていいので楽でした。


2.utils.py を作る

is_wall() / get_view_data() / to_fullwidth() / print_view_debug() の 4つの関数を utils.py に移動しました。

# utils.py の先頭
from data import *   # MAP_W、DOORS などを参照するため

utils.py は内部で data.py を参照しています。 dungeon_rpg.py 側では from utils import * を追加。


3.models.py を作る

Player / Party / Enemy / Battle の4クラスを models.py に移動しました。

# models.py の先頭
import random
from data import *   # CHAR_DATA, SKILL_DATA, ITEM_DATA などを使用
# dungeon_rpg.py 側
from models import *   # ← 追加

結果:こうなった

data.py 645行 マップ・定数・全ゲームデータ
utils.py 100行 ユーティリティ関数4つ
models.py 550行 Player / Party / Enemy / Battle
dungeon_rpg.py 約2000行 DungeonRPGクラス(描画・入力)

元の3500行超の1ファイルが、役割ごとに4分割できました。


やってみてわかったこと

4ファイル分を一気に作ってしまうと、エラーが出たときにどこが原因かわかりません。 1ファイル作るたびに「ゲームが動くか確認する」を繰り返すことで、 安心して進められました。

ファイルを分けるタイミング

1ファイルが2000行を超えてきたあたりが分割の目安だと実感しました。 それより早いと逆に管理が面倒になる気がします。もう少し早くやっておけばよかったです。


今後の構成

今のところ dungeon_rpg.py 自体はまだ2000行ありますが、 ここには「DungeonRPGクラス」という1つのクラスしか入っていないので しばらくはこのままで進める予定です。

ようやく気になっていた部分を整理できたので、今後はゲームの中身の実装に集中します!

いいなと思ったら応援しよう!

しん もし記事が参考になったり、開発を応援してもいいと思ってくれた方がいたら、noteのサポートをいただけると次の記事を書く原動力になります。もちろん読んでくれるだけで十分嬉しいです。