見出し画像

11-9 戦闘1 自分の行動

同人誌について

 この連載は、同人誌『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」の説明です。戦闘の計算をおこなうモジュールです。

 自分が攻撃側の場合の計算です。おこなっていることは、次のとおりです。

  1. 選択したメニューが「ESCAPE」なら、逃走判定をおこなう。

  2. 選択したメニューがそれ以外なら、各値を設定する。

  3. MPが足りていなければ、処理を打ち切る。

  4. MPが足りていれば、行動するのでSEを鳴らす。

  5. 回復の場合は計算して結果を返す。

  6. ダメージの場合は計算して結果を返す。

import random
from ... import data
from . 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 random
from ... import data
from . import util

 `data` `game`パッケージを読み込みます。

 また、同じ階層の`util`モジュールを読み込みます。

自分側の行動の実行1 冒頭処理

 自分側の行動をおこなう`exec()`関数です。まずは冒頭だけを示します。

# 実行 自分
def exec(action: str) -> data.battle.Res:
    res = data.battle.Res(action)
    a = data.action

 `action`を引数にして、`Res`クラスのインスタンスを作成して、変数`res`に代入します。この変数`res`に、このあとの処理で戦闘結果を格納します。

 また`data.action`モジュールの参照を、変数`a`に格納します。変数`a`は、このあとのプログラムを短く書くために使います。

自分側の行動の実行2 逃走

 メニューで選んだ行動が逃走`ESCAPE`の場合は、逃走の正否を判定します。

    # 逃走
    if action == a.ESCAPE:
        res.is_escape = True
        res.success_escape = random.randrange(2) == 0    # 1/2
        return res

自分側の行動の実行3 選択メニューによる分岐

 逃走`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

自分側の行動の実行4 MP判定

 MPが足りているか確認します。足りていない場合は処理を打ち切ります。

    # MPが足りているか確認して終了/消費
    if m.mp < mp: return res
    res.success_mp = True
    m.mp -= mp

自分側の行動の実行5 回復

 選んだ行動が回復`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を減らします。そして処理を終了します。

自分側の行動の実行6 ダメージ

 ダメージの計算をして、結果を返します。ダメージの計算は`util.calc_damage()`関数でおこないます。

    # ダメージの場合
    damage = util.calc_damage(pow, df)
    e.hp = max(0, e.hp - damage)
    res.res_num = damage
    return res

 次の内容については省略します。こちらは同人誌をご覧ください。

  • 11-10 戦闘2 敵側の行動

  • 11-11 戦闘3 ユーティリティ

  • 11-12 エフェクト1 管理

  • 11-13 エフェクト2 行動用

  • 11-14 エフェクト3 その他


同人誌について

 この連載は、同人誌『PythonとPygameで作る レトロ風RPG 全コード』を一部抜粋して編集したものです。

 同人誌本編には、ゲーム本体のソースコードや、各種のサンプルコード、Windowsで実行できるEXEファイルが付属しています。PDFで290ページの本になります。ぜひ、こちらもご購入ください。

(2024-03-28:ver1.0.4 に更新、2024-03-10:ver1.0.3 に更新)

 このnoteの記事と、Webページに一部抜粋版を掲載しています。

 技術系同人誌など まとめページ


この記事が気に入ったらサポートをしてみませんか?