【GameTips】レベルアップ計算

どうもです、タドスケです。

ゲーム開発で使えそうな部品を提供するこのシリーズ。

今回はRPGのレベルアップ計算機能を作ってみました。

この記事内で公開しているコードは全て自作なので、個人/商用問わずご自由に流用いただいて構いません。
ただしコードを利用して損害が出た場合でも、その責任は負いかねます。
目次

実行例

今回のプログラムを実行すると、以下のような出力が得られます。

[レベルアップ計算サンプル]
Hoge: LV=1, EXP=0
Hoge は 5 の経験値を得た。
Hoge: LV=1, EXP=5
Hoge は 80 の経験値を得た。
Hoge はレベル2に上がった!
Hoge はレベル3に上がった!
Hoge はレベル4に上がった!
Hoge: LV=4, EXP=85

実装方法

実行例のような動作をするためにどのようなプログラムを書けばよいでしょうか。

クラスごとに説明します。

Calculator クラス

class Calculator:
    """レベルアップ計算機.

    :param exps: レベルごとの経験値
    """

    def __init__(
            self,
            exps: tp.Sequence[int]) -> None:
        assert exps
        self._exps = tuple(exps)

    def calc(self, exp: int) -> int:
        """経験値に対応するレベルを計算します.

        :param exp: 経験値
        :return: レベル
        """
        assert 0 <= exp

        for lv, e in enumerate(self._exps):
            if exp < e:
                return lv
        return self.get_max_level()

    def get_max_level(self) -> int:
        """最大レベルを得ます.

        :return: 最大レベル
        """
        return len(self._exps)

レベルアップ計算を行うクラスです。

init 関数で経験値テーブルを渡し、calc 関数に経験値を渡すと対応するレベルが得られます。

最大レベルに達したあとは、どんなに経験値を得てもレベルは変わりません。

Character クラス

class Character:
    """キャラクター.

    :param calculator: レベル計算オブジェクト
    :param exp: 初期経験値
    """

    def __init__(
            self,
            calculator: Calculator,
            exp: int = 0,
            name: str = '') -> None:
        assert 0 <= exp

        self._calculator = calculator
        self._name = name
        self._exp = exp
        self._level = 0

        self._update_level()

    @property
    def exp(self) -> int:
        """経験値."""
        return self._exp

    @property
    def name(self) -> str:
        """名前."""
        return self._name

    @property
    def level(self) -> int:
        """レベル."""
        return self._level

    def add_exp(self, exp: int) -> int:
        """経験値を加算します.

        :param exp: 経験値
        :return: レベルの上昇量
        """
        assert 0 <= exp
        self._exp += exp
        diff = self._update_level()

        return diff

    def _update_level(self) -> int:
        """レベルを計算し直す.

        :return レベルの上昇量
        """
        before = self._level
        self._level = self._calculator.calc(self._exp)
        return self.level - before

    def __str__(self) -> str:
        return f'{self.name}: LV={self.level}, EXP={self.exp}'

キャラクターを表すクラスです。

現在の経験値やレベルなどのパラメータを持ち、add_exp で経験値を与えるとレベルが上がります。

コード

コード全文は以下の場所にアップしてあります。

実装

GitHub
gametips/src/levelup/levelup.py at master · tadosuke/gametips ゲームで使えそうな処理. Contribute to tadosuke/gametips development by creating an account on GitHub.

テスト

GitHub
gametips/tests/levelup/test_levelup.py at master · tadosuke/gametips ゲームで使えそうな処理. Contribute to tadosuke/gametips development by creating an account on GitHub.

拡張のアイデア

キャラごとに経験値テーブルを用意する

複数のキャラクターを入れる場合、キャラごとに違う経験値テーブルを使うのも面白いかもしれません。

レベルが上がりにくい大器晩成キャラ、サクサクレベルが上がるが最大レベルが低い早熟キャラ、などが作れます。

経験値倍率

「特定のアクセサリを付けていたら経験値が2倍もらえる」という要素を入れたい場合は、Calculator クラスのメンバーに「倍率」を加えてみましょう。

パラメータ上昇も入れる

今回はレベルのみ扱いましたが、実際のゲームではHPや攻撃力などのパラメータも上がります。

レベルに対応するパラメータのテーブルを用意しておけば簡単に計算できます。

その際、レベルアップによる基本パラメータと、「力の種」などのアイテムによる上昇値は分けておくのがよいでしょう。
そうしないと、レベルが上がった際にアイテムの上昇効果が上書きされてしまいます。

以上、レベルアップ計算機能の説明でした!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次