CODE Python RPG

独学でPythonでRPGを作成する(第38回)補助系の呪文を追加(3)

更新日:

こんにちは。
「Pythonでつくる ゲーム開発 入門講座」の
Chapter11,12(本格RPGを作ろう!全編・後編)を基にRPGを作っていきます。

前回は補助系の呪文のバイキルトを追加していきました。

今回も同じく補助系の呪文のヘナトスを追加します。
他に少し細かいところを変えます。

目次

  1. 呪文シート
  2. charaの変更
  3. battleの変更
  4. 最後に

呪文シート

「ヘナトス」は
相手の攻撃力を下げます。

以下のページを参考にさせて頂きました。
呪文の効果はこちら
呪文の説明はこちら

ヘナトスは相手に使う為
成功率を設けます。
成功率を75%(上限値を75)にします。
※下限は使いません。
※補助系の場合、上限・下限は
 成功率に使います。

 

シートは以上です。

 

 

charaの変更

最初に変数を追加します。

有効ターン数を格納する変数です。
なお、回数を格納する変数は
用意しません。

後述しますが、攻撃力を確認する
方法を変更する為です。

関連して前回追加したバイキルトも
回数を格納する変数を削除しました。

class Chara():
    def __init__(self):
(省略)
        self.turn_rukani = 0 # ルカニの有効ターン
        self.num_rukani = 0 # ルカニが効いた回数
        self.turn_baikiruto = 0 # バイキルトの有効ターン
        # self.num_baikiruto = 0 # バイキルトが効いた回数 (削除)
        self.turn_henatos = 0 # ヘナトスの有効ターン

 

 

攻撃力の計算

次に攻撃力の計算です。

先程、記載した通り確認方法を
変えるので、check_atkメソッドを
消します。

class Chara():
    def __init__(self):
(省略)

(削除)
    # def check_atk(self): # 攻撃力計算
    #     tmp_atk = self.atk # 現在の攻撃力
    #     self.atk = self.get_atk() # 元に戻す
    #     rate = self.num_baikiruto*2 # 何倍にするか確認(攻撃力を下げる呪文の回数はここでひく) バイキルトは2倍
    #     if rate >= 2:
    #         self.atk += self.get_atk() # 元々の攻撃力を足す(2倍)
    #     elif rate == 1:
    #         self.atk += int(0.5 * self.get_atk()) # 元々の攻撃力の半分を足す(1.5倍)
    #     elif rate == 0:
    #         self.atk = self.get_atk() # 変わらない
    #     elif rate <= -1:
    #         self.atk -= int(0.5 * self.get_atk()) # 元々の攻撃力の半分を引く(0.5倍)
    #     tmp_atk = self.atk - tmp_atk
    #     return tmp_atk # 変更後から変更前を引いた値

 

baikirutoメソッドと
henatosメソッドで
攻撃力を計算します。

baikiruto
→本来の攻撃力を足す
 最大値:本来の攻撃力の2倍

henatos
→本来の攻撃力の半分を引く
 最小値:本来の攻撃力の半分

 

いくつかパターンを記載します。

baikiruto ×1回(何回でも同じ)
→攻撃力は2倍

henatos ×1回(何回でも同じ)
→攻撃力は半分

baikiruto ×1回 の後に henatos ×1回
→攻撃力は1.5倍

baikiruto ×1回 + henatos ×1回 の後に baikiruto ×1回
→攻撃力は2倍(最大値)

baikiruto ×2回 の後に henatos ×1回
→攻撃力は1.5倍

henatos ×1回 の後に baikiruto ×1回
→攻撃力は1.5倍(最小値に本来の攻撃力を足す)

という感じにします。

変更前

class Chara():
(省略)

    def baikiruto(self, target): # バイキルト
        target.num_baikiruto += 1 # バイキルト継続中に使った回数
        target.turn_baikiruto = random.randint(4, 5) # 効果の残りターン
        tmp = target.check_atk()
        return tmp
    def invalid_baikiruto(self):
        self.turn_baikiruto = 0
        self.num_baikiruto = 0

変更後

class Chara():
(省略)

    def baikiruto(self, target): # バイキルト
        tmp_atk = target.atk # 現在の攻撃力
        target.atk += target.get_atk() # 本来の攻撃力を足す
        if target.atk > target.get_atk()*2: # 本来の攻撃力の2倍より大きいなら、2倍にする
            target.atk = target.get_atk()*2
        tmp_atk = target.atk - tmp_atk
        target.turn_baikiruto = random.randint(4, 5) # 効果の残りターン
        return tmp_atk # 変更後から変更前を引いた値(増えた攻撃力の数値)
    def invalid_baikiruto(self): # バイキルト効果が消えたら
        # ヘナトスは半分にするので奇数の時にズレる可能性がある
        self.atk -= self.get_atk() # 本来の攻撃力を引く
        if self.atk < self.get_atk(): # 本来の攻撃力より小さいなら
            self.atk = int(0.5 * self.get_atk()) # 半分にする(どんなに小さくても半分まで)

    def henatos(self, target): # ヘナトス
        if random.randint(0, 99) > spell_up_dict["ヘナトス"]: # 呪文の上限値が成功率
            return 1 # 効かなかった
        tmp_atk = target.atk # 現在の攻撃力
        if target.atk >= target.get_atk(): # 本来の攻撃力以上なら
            target.atk -= int(0.5 * target.get_atk()) # 本来の攻撃力の半分をひく
        # 既に本来の攻撃力より小さいなら変えない(どんなに小さくても半分まで)
        tmp_atk = target.atk - tmp_atk
        target.turn_henatos = random.randint(4, 5) # 効果の残りターン
        return tmp_atk # 変更前から変更後を引いた値(減った攻撃力の数値)
    def invalid_henatos(self): # ヘナトス効果が消えたら
        if self.atk < self.get_atk(): # 元より小さいなら
            self.atk = self.get_atk() # 元に戻す
        elif self.atk == self.get_atk(): # 元と同じなら
            self.atk += int(0.5 * self.get_atk()) # 1.5倍
        else: # 元より大きいなら
            self.atk = 2 * self.get_atk() # 2倍(どんなに大きくても2倍まで)

 

baikiruto
→本来の攻撃力を足す
 最大値:本来の攻撃力の2倍

上の処理は以下で実施します。

target.atk += target.get_atk() # 本来の攻撃力を足す
if target.atk > target.get_atk()*2: # 本来の攻撃力の2倍より大きいなら、2倍にする
    target.atk = target.get_atk()*2

 

元に戻すときは逆のことを実施します。

self.atk -= self.get_atk() # 本来の攻撃力を引く
if self.atk < self.get_atk(): # 本来の攻撃力より小さいなら
    self.atk = int(0.5 * self.get_atk()) # 半分にする(どんなに小さくても半分まで)

 

henatos
→本来の攻撃力の半分を引く
 最小値:本来の攻撃力の半分

上の処理は以下で実施します。

if target.atk >= target.get_atk(): # 本来の攻撃力以上なら
    target.atk -= int(0.5 * target.get_atk()) # 本来の攻撃力の半分をひく

 

元に戻す時ですが、
何回ヘナトスがかかっていても
戻すのは1回分にしています。

また、ヘナトスは相手に使う呪文の為
成功・失敗を最初に確認します。
※上限値が成功率です。

if random.randint(0, 99) > spell_up_dict["ヘナトス"]: # 呪文の上限値が成功率
    return 1 # 効かなかった

 

あと、戦闘終了時に使う
spell_resetメソッドで
効果を全て消します。

class Chara():
(省略)

    def spell_reset(self):
        self.invalid_sukara()
        self.invalid_rukani()
        self.check_dfs()
        self.turn_baikiruto = 0 # バイキルトの残りターン
        self.turn_henatos = 0 # ヘナトスの残りターン
        self.atk = self.get_atk() # 攻撃力を元に戻す

invalid_baikiruto、invalid_henatosでは
効果は消えない(攻撃力が元に戻るとは限らない)ので、
上記のようにしました。

また、self.check_dfs()を
追加しています。

スカラやルカニの効果は消えますが
防御力を再計算していないので
本来の防御力に戻らない為です。

battle.pyでは以下のように
戦闘コマンド入力の時に
check_dfsを実行しています。

elif idx == 11: # プレイヤーのターン(入力待ち)
    btl_enemy = 0
    player.use_defense = False
    player.check_dfs()

 

ただ、不意打ちとなった場合、
idx11に来ない為、本来の防御力でない状態で
攻撃を受けることになってしまいます。

なので、spell_resetメソッドに
self.check_dfs()を追加しました。

 

 

呪文を使う

呪文を使う時のメソッドuse_spellを
変更します。

class Chara():
(省略)

    def use_spell(self, str_spell, target, spell_target_no):
 (省略)

        elif str_spell == "ヘナトス":
            tmp_atk = self.henatos(target)
            if tmp_atk == 1:
                message = target.name + " には きかなかった!"
            elif tmp_atk < 0:
                message = target.name + " の こうげきりょくを " + str(-tmp_atk) + "さげた!"
            elif tmp_atk == 0: # 効果はなくても残りターンは増える
                message = target.name + " には こうかが なかった!"
            # 増えることは無いので、elseは省略
            return -1, message
(省略)

 

使った呪文がヘナトスの場合を
追加しました。

バイキルトなどの時と
似たようなことをしています。

 

chara.pyは以上です。

 

 

battleの変更

battle.pyを変更します。

補助呪文の残りターンを確認する
check_spell_effect関数に
ヘナトスを追加します。

def check_spell_effect(player):
(省略)

        if obj.turn_henatos != 0:
            obj.turn_henatos -= 1
            if obj.turn_henatos == 0:
                check_message.append(obj.name + " のヘナトス効果が消えた!")
                obj.invalid_henatos() # ヘナトス効果を消す
    return check_message

ヘナトスの効果が消えたら(turn_henatos=0)
invalid_henatosで効果を消します。

 

もう一つ、check_atkを
無くしたので、削除します。

def main(screen, clock, font, fontS, player, area):
(省略)

        elif idx == 11: # プレイヤーのターン(入力待ち)
            btl_enemy = 0
            player.use_defense = False # ぼうぎょを元に戻す(ぼうぎょ効果を消す)(呪文効果が残っているか確認)
            player.check_dfs()
            # player.check_atk() # 削除

 

 

という感じで、今回は以上です!(`・ω・´)

 

 

最後に

今回は相手に使う補助系の呪文ヘナトスを追加しました。

次回ももう少し補助系呪文に手をつけていきたいと思います。

まとめサイトへ

 

 

【ご注意】
プログラムやデータなどは著作権法により保護されています。
著作者の許諾を得ずに、プログラムおよびデータそのものまたは改変したものを
配布したり販売したりすることはできません。
また、これらを利用して発生した損害などに関して、著作者は一切責任を負いません。

 

 

-CODE, Python, RPG
-, , , , , , , ,

Copyright© kerublog , 2021 All Rights Reserved Powered by STINGER.