見出し画像

6-6 補助的な関数群1 成長

同人誌について

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

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


説明と全体コード

 「src/mymod/data/growth.py」の説明です。経験値や能力の計算をおこなうモジュールです。

 ここでは、経験値の獲得とレベルアップ判定、能力値の計算をおこないます。

from . import game  # 型ヒント用

# 経験値追加
def add_exp(d: "game.Game", exp: int) -> bool:
    d.exp = min(d.exp + exp, 999)
    need = [0, 10, 20, 40, 60, 80, 100, 125, 150, 175, 200,
        250, 300, 350, 400, 500, 600, 700, 800, 900]   # 1~20
    level = 0
    for i, n in enumerate(need):    # 経験値からレベルを計算
        if d.exp >= n: level = i + 1

    is_up = d.level != level  # レベルアップ判定
    if is_up:
        d.level = level
        hp_loss = d.hp_max - d.hp
        mp_loss = d.mp_max - d.mp
        calc_ability(d)     # 能力値の計算
        d.hp = d.hp_max - hp_loss   # HP回復
        d.mp = d.mp_max - mp_loss   # MP回復
    return is_up

# 能力値の計算
def calc_ability(d: "game.Game"):
    # アイテム
    i_at = (d.items.sword.count  -1) * 20
    i_df = (d.items.shield.count -1) * 20

    # 基本値の計算
    d.at = min(10 + (d.level - 1) * 5 + i_at, 999)  # 攻撃力
    d.df = min(10 + (d.level - 1) * 5 + i_df, 999)  # 防御力
    d.hp_max = min(100 + (d.level - 1) * 25, 999)   # 最大HP
    d.mp_max = min(100 + (d.level - 1) * 25, 999)   # 最大MP

インポート部分

 まずはインポート部分です。

from . import game  # 型ヒント用

 型ヒント用に`game`をインポートします。

経験値の獲得とレベルアップ判定

 経験値の獲得とレベルアップ判定をおこなう関数です。

# 経験値追加
def add_exp(d: "game.Game", exp: int) -> bool:
    d.exp = min(d.exp + exp, 999)
    need = [0, 10, 20, 40, 60, 80, 100, 125, 150, 175, 200,
        250, 300, 350, 400, 500, 600, 700, 800, 900]   # 1~20
    level = 0
    for i, n in enumerate(need):    # 経験値からレベルを計算
        if d.exp >= n: level = i + 1

    is_up = d.level != level  # レベルアップ判定
    if is_up:
        d.level = level
        hp_loss = d.hp_max - d.hp
        mp_loss = d.mp_max - d.mp
        calc_ability(d)     # 能力値の計算
        d.hp = d.hp_max - hp_loss   # HP回復
        d.mp = d.mp_max - mp_loss   # MP回復
    return is_up

 前半は、経験値のリストをもとに、レベルアップの判定をおこないます。

 後半は、レベルアップしているときの処理です。減っているHP、MPを記録したあと、能力値を上昇させます。そして、記録したHPとMPの減少値を反映します。

能力値の計算

 次は、能力値の計算をおこなう関数です。

# 能力値の計算
def calc_ability(d: "game.Game"):
    # アイテム
    i_at = (d.items.sword.count  -1) * 20
    i_df = (d.items.shield.count -1) * 20

    # 基本値の計算
    d.at = min(10 + (d.level - 1) * 5 + i_at, 999)  # 攻撃力
    d.df = min(10 + (d.level - 1) * 5 + i_df, 999)  # 防御力
    d.hp_max = min(100 + (d.level - 1) * 25, 999)   # 最大HP
    d.mp_max = min(100 + (d.level - 1) * 25, 999)   # 最大MP

 アイテムの所持やレベルによって、能力値を計算して更新します。

 能力値の上限は`999`にします。数字の桁数が変わるとレイアウトが変わるために、3桁で最も大きな数値`999`を上限にしています。


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

  • 6-7 補助的な関数群2 ゲーム 入出力

  • 6-8 保存しないデータ1 アクション


同人誌について

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

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

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

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


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