この連載は、同人誌『PythonとPygameで作る レトロ風RPG 全コード』を一部抜粋して編集したものです。
同人誌本編には、ゲーム本体のソースコードや、各種のサンプルコード、Windowsで実行できるEXEファイルが付属しています。PDFで290ページの本になります。ぜひ、こちらもご購入ください。
(2024-03-28:ver1.0.4 に更新、2024-03-10:ver1.0.3 に更新)
「src/mymod/scene_battle/battle/my.py」の説明です。戦闘の計算をおこなうモジュールです。
自分が攻撃側の場合の計算です。おこなっていることは、次のとおりです。
import randomfrom ... import datafrom . import util
# 実行 自分def exec(action: str) -> data.battle.Res: res = data.battle.Res(action) a = data.action
# 逃走 if action == a.ESCAPE: res.is_escape = True res.success_escape = random.randrange(2) == 0 # 1/2 return res
# その他の行動 m = data.game.data e = data.enemy.enemy_now
mp = pow = df = 0 if action == a.SWORD: pow = m.at df = e.df if action == a.FIRE: res.se = data.audio.MAGIC n = m.items.fire.count mp = n * 30 pow = 25 + n * 25 df = e.df // 4 if action == a.HEAL: res.se = data.audio.HEAL n = m.items.fire.count mp = n * 20 pow = 100 + n * 50
# MPが足りているか確認して終了/消費 if m.mp < mp: return res res.success_mp = True m.mp -= mp
# 回復の場合 if action == data.action.HEAL: heal = random.randrange(pow // 2, pow) m.hp = min(m.hp_max, m.hp + heal) res.res_num = heal return res
# ダメージの場合 damage = util.calc_damage(pow, df) e.hp = max(0, e.hp - damage) res.res_num = damage return res
まずは、インポート部分を示します。
import randomfrom ... import datafrom . import util
data
game
パッケージを読み込みます。
また、同じ階層のutil
モジュールを読み込みます。
自分側の行動をおこなうexec()
関数です。まずは冒頭だけを示します。
# 実行 自分def exec(action: str) -> data.battle.Res: res = data.battle.Res(action) a = data.action
action
を引数にして、Res
クラスのインスタンスを作成して、変数res
に代入します。この変数res
に、このあとの処理で戦闘結果を格納します。
またdata.action
モジュールの参照を、変数a
に格納します。変数a
は、このあとのプログラムを短く書くために使います。
メニューで選んだ行動が逃走ESCAPE
の場合は、逃走の正否を判定します。
# 逃走 if action == a.ESCAPE: res.is_escape = True res.success_escape = random.randrange(2) == 0 # 1/2 return res
逃走ESCAPE
以外の行動を選んだときの処理です。選んだ行動に応じて、計算に使う値を設定します。
# その他の行動 m = data.game.data e = data.enemy.enemy_now
mp = pow = df = 0 if action == a.SWORD: pow = m.at df = e.df if action == a.FIRE: res.se = data.audio.MAGIC n = m.items.fire.count mp = n * 30 pow = 25 + n * 25 df = e.df // 4 if action == a.HEAL: res.se = data.audio.HEAL n = m.items.fire.count mp = n * 20 pow = 100 + n * 50
MPが足りているか確認します。足りていない場合は処理を打ち切ります。
# MPが足りているか確認して終了/消費 if m.mp < mp: return res res.success_mp = True m.mp -= mp
選んだ行動が回復HEAL
の場合の処理です。
# 回復の場合 if action == data.action.HEAL: heal = random.randrange(pow // 2, pow) m.hp = min(m.hp_max, m.hp + heal) res.res_num = heal return res
HPを回復して、MPを減らします。そして処理を終了します。
ダメージの計算をして、結果を返します。ダメージの計算はutil.calc_damage()
関数でおこないます。
# ダメージの場合 damage = util.calc_damage(pow, df) e.hp = max(0, e.hp - damage) res.res_num = damage return res
次の内容については省略します。こちらは同人誌をご覧ください。
この連載は、同人誌『PythonとPygameで作る レトロ風RPG 全コード』を一部抜粋して編集したものです。
同人誌本編には、ゲーム本体のソースコードや、各種のサンプルコード、Windowsで実行できるEXEファイルが付属しています。PDFで290ページの本になります。ぜひ、こちらもご購入ください。
(2024-03-28:ver1.0.4 に更新、2024-03-10:ver1.0.3 に更新)