CODE Python RPG

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

投稿日:

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

前回は補助系の呪文を修正していきました。

今回はルカニを追加します。
前回追加したスカラとは逆に相手の守備力を下げます。

目次

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

呪文シート

相手の防御力を下げる「ルカニ」を
追加します。

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

スカラは味方に使う為
成功率は100%にしているので
上限・下限は使いませんでした。
参考

相手に使う呪文では
成功率を設けます。
ルカニは上限を75にして、
成功率を75%にします。
※下限は使いません。

 

シートは以上です。

 

 

charaの変更

基本的には前回のスカラと
同じようなことをします。

chara.pyから変更します。

変数を追加します。

class Brave(Chara):
(省略)

        self.use_defense = False # 防御を使っているか
        self.turn_sukara = 0 # スカラの有効ターン
        self.num_sukara = 0 # スカラを使った回数
        self.turn_rukani = 0 # ルカニの有効ターン (追加)
        self.num_rukani = 0 # ルカニが効いた回数 (追加)

 

スカラと同じです。

self.turn_rukani = 0 # ルカニの有効ターン
self.num_rukani = 0 # ルカニが効いた回数

 

ルカニの有効ターンと
有効ターン内にルカニを何回使ったかです。
有効ターンが終わると、何回使っていても
0回に戻ります。

 

 

防御力の計算

前回、変更したメソッドcheck_dfsを
使います。

class Chara():
(省略)

    def check_dfs(self): # 防御力計算
        self.dfs = self.get_dfs() # 元に戻す
        # 元々の守備力*0.5を足したり、引いたりする
        self.dfs += int(0.5 * self.get_dfs()) * self.num_sukara # スカラ効果 アップした数字をメッセージに出す為、アップする数字にint
        self.dfs -= int(0.5 * self.get_dfs()) * self.num_rukani # ルカニ効果 アップした数字をメッセージに出す為、アップする数字にint
        tmp = self.dfs
        if self.use_defense:
            self.dfs *= 2
        if self.dfs > 999:
            self.dfs = 999
        if self.dfs < 0:
            self.dfs = 0
        return tmp # ぼうぎょする前の防御力を返す(ぼうぎょする前の防御力で1000未満か判定)

 

ルカニ効果を防御力に付与します。

self.dfs -= int(0.5 * self.get_dfs()) * self.num_rukani

 

ルカニを1回使うごとに元の防御力の
半分を削減していきます。
※1回使う:0.5倍(1 - 0.5*1)
 2回使う:0倍(1 - 0.5*2)
※どんなに防御力が高くても
 2回で0になるのは
 やり過ぎかもしれません(^_^;)

 

何回使ってもマイナスには
ならないようにします。

if self.dfs < 0:
    self.dfs = 0

 

後述しますが、
戦闘メッセージで
防御力が0になったか
分かるようにします。

 

防御力の計算は以上です。

 

 

ルカニの追加

ルカニを使った時のメソッドrukaniと
ルカニ効果を消すメソッドinvalid_rukaniを
追加します。

class Chara():
(省略)

    def rukani(self, target):
        if random.randint(0, 99) < spell_up_dict["ルカニ"]: # 呪文の上限値が成功率
            target.num_rukani += 1
        else:
            return -1
        target.turn_rukani = random.randint(4, 5) # 効果の残りターン
        tmp = target.check_dfs()
        return tmp
    def invalid_rukani(self):
        self.turn_rukani = 0
        self.num_rukani = 0
(省略)

class Brave(Chara):
(省略)

    def reset(self):
        self.maxhp = int(chara1_maxhp[1])
        self.hp = self.maxhp
        self.mp = self.maxmp
        self.invalid_sukara()
        self.invalid_rukani() # 追加

 

やることはスカラと同じです。
使った回数を増やし、
有効ターンを確認します。
※invalid_rukaniでは
 どちらも0を格納する。

一つ違うのは
成功率があることです。
失敗した時は-1を返します。

if random.randint(0, 99) < spell_up_dict["ルカニ"]: # 呪文の上限値が成功率
    target.num_rukani += 1
else:
    return -1

 

 

呪文を使う

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

class Chara():
(省略)

    def use_spell(self, str_spell, target, spell_target_no):
        # 戻り値が-1は状態変化の呪文
        if str_spell == "スカラ":
(省略)

        elif str_spell == "ルカニ":
            tmp_dfs = self.rukani(target)
            if tmp_dfs == -1:
                message = target.name + " には きかなかった!"
            else:
                if target.dfs > 0:
                    message = target.name + " の しゅびりょくを " + str(int(0.5 * target.get_dfs())) + "さげた!"
                else:
                    message = target.name + " の しゅびりょくが 0になった!"
            return -1, message
(省略)

        return point, message

 

使った呪文がルカニの場合を
追加しています。

スカラと同じで
メソッドrukaniを使い、
あとは結果によって
戦闘メッセージを変えています。

rukaniの戻り値が-1の時は
失敗した時です。

if tmp_dfs == -1:
    message = target.name + " には きかなかった!"

 

また、防御力はマイナスにはなりませんので
以下のメッセージとなった場合は
これ以上はルカニを何回使っても
防御力は下がらなくなります。

message = target.name + " の しゅびりょくが 0になった!"

 

なお、rukaniメソッドでは
毎回、有効ターンを確認しているので
防御力が0になると
これ以上は下がりませんが
有効ターンはリセットされます。
※4もしくは5になります。

target.turn_rukani = random.randint(4, 5) # 効果の残りターン

 

chara.pyは以上です。

 

 

battleの変更

battle.pyを変更します。

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

        elif idx == 22: # 戦闘終了
(省略)
            player.invalid_sukara()
            player.invalid_rukani() # 追加
            return 1

(省略)
        elif idx == 24: # ターン確認
            tmr = 0
            turn_obj, idx = get_battle_turn(player)
            if turn_obj is not None: # ターンが終わっていないオブジェクトがある

                if turn_obj.turn_sukara != 0:
                    turn_obj.turn_sukara -= 1
                    if turn_obj.turn_sukara == 0:
                        set_message(turn_obj.name + " のしゅびりょくが戻った!")
                        turn_obj.invalid_sukara() # スカラ効果を消す
                        turn_obj.check_dfs()
                if turn_obj.turn_rukani != 0:
                    turn_obj.turn_rukani -= 1
                    if turn_obj.turn_rukani == 0:
                        set_message(turn_obj.name + " のしゅびりょくが戻った!")
                        turn_obj.invalid_rukani() # ルカニ効果を消す
                        turn_obj.check_dfs()

 

戦闘が終わったら(idx = 22)
ルカニ効果を消します。

 

また、有効ターンが0になったら
防御力を元に戻します。
これは前回のスカラの時にも
必要でしたが忘れていました(^_^;)

 

戦闘の中でターンが回ってきたら
有効ターンを確認します。

有効ターンが0の時は
スカラ・ルカニ効果はない為
スルーします。

有効ターンが0でない時は
1ずつ減らし、
有効ターンが0になると
防御力を元に戻します。

この時、メソッドinvalid_rukaniを
使って効果を消して、
メソッドcheck_dfsで
防御力を元に戻します。

 

あとは前回と変更はありません。

 

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

 

 

最後に

今回は相手に使う補助系の呪文ルカニを追加しました。

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

まとめサイトへ

 

 

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

 

 

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

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