大きなプログラムの記述を複数のファイルに分けて整理する
Python向けレトロゲームエンジン「Pyxel(ピクセル)」を使ってのゲーム作成を通してプログラミングを学習します。
シューティングゲームを作成する記事「Pyxel 「継承」を使って敵キャラの種類を増やす - 勉強ボックス管理者ブログ」では,ソースコードを1つのファイルに記述しました。その結果 list11_04.py は370行の大きなファイルとなり,どこに何が書いてあるのかわかりにくくなっています。
本記事では,コードを複数のファイルに分割して整理する例を紹介します。
Pythonのimport文について
メインとなるプログラムから別ファイルに書かれた自作コードを利用するために,Pythonのimport文を使ってモジュールのインポートを行います。記述方法やフォルダ指定などは下記記事を参照してください。
kinutani.hateblo.jp
分割の内容を考える
シューティングゲームのソースコードで,各クラスがインスタンスを作成したり操作したりする関係を図にすると次のようになります。(図の破線矢印部分)
※この図では,矢印の先のクラスが必要である(ないと動けない)という関係がわかります。
この関係をふまえて,関連するクラスを一つのファイルにまとめてモジュールとします。次の図はインポートするモジュールを矢印で示しました。
ファイルの構成
ファイル名から拡張子.pyを除いたものがモジュール名になります。Pythonのプログラムファイル5つとリソースファイルの構成にしてみましょう。
ソースファイルの例
effects.py,enemies.py,player.py,stages.py に各クラスのコードを分割。
ソースファイルの内容は下記を参照してください。
シューティングゲーム03 - Google ドライブ
01 モジュールのインポート(ワイルドカード)
分割が上手くできたかどうかの確認のため,Appクラスのコードを変えずに動かしてみます。
【ソースコード】はこちらのリンクから確認してください(Googleドキュメント)
stg_main.py抜粋
import pyxel from stages import * from player import * from enemies import * from effects import * ・・・ class App: def __init__(self): ・・・ self.background = Background() self.player = Player(20, pyxel.height / 2) ・・・
・stg_main.py を実行すると,シューティングゲームが起動します。
・モジュール内の要素をワイルドカード指定(*)で読み込んだので,クラスのインスタンス作成処理もそのままで行うことができます。
・インポート時に__pycache__フォルダが自動作成されます。フォルダ内にコンパイルされたモジュールのファイルが作られ,次回以降のモジュール読み込みが高速なります。
02 別名を付けてインポート
ワイルドカードでのインポートは,どのモジュールの関数や変数かがわかりにくくなるため推奨されていません。モジュールを意識したコードに変更してみます。
【ソースコード】はこちらのリンクから確認してください(Googleドキュメント)
stg_main.py抜粋
import pyxel import stages as st import player as pl import enemies as en import effects as ef ・・・ class App: def __init__(self): ・・・ self.background = st.Background() self.player = pl.Player(20, pyxel.height / 2) ・・・
・from節なしのインポートに変更しました。「モジュール名.クラス名()」での呼び出しになるのですが,asで短い別名をつけているので,「別名.クラス名()」でインスタンス作成を行っています。
・コードの変更箇所が多いですが,このような変更はエディタの「置換機能」などで行うのが確実です。
※たいていのエディタで「編集(Edit)メニュー」か「検索(Search)メニュー」で「置換(Replace)」が使えると思います。高機能な統合開発環境には,シンボル名の一括変更など便利な機能があります。使用しているエディタの操作方法等を調べてみてください。
コードを複数のファイルに分割できました。まだAppクラスの記述が長いなと思えば,関数化やクラス化で処理をまとめてすっきりさせてみましょう。
次回は作成したゲームをHTMLファイル形式に変換するPyxelの機能を紹介します。
次の記事kinutani.hateblo.jp