CODE Python RPG

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

更新日:

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

前回は呪文攻撃でモンスターグループや全体に攻撃できるようにしました。

今回は補助系の呪文を追加します。
今までは回復系や攻撃系の呪文でしたが
攻撃力をアップしたり防御力をアップするなど
補助系の呪文を追加します。

目次

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

呪文シート

今回は防御力をアップする呪文の
「スカラ」を追加します。

呪文シートにスカラを追加します。

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

補助系の呪文で上限・下限は
成功率に使います。

ただ、スカラは味方に使う為
成功率は100%にします。
※スカラでは上限・下限を
 使いません。

 

あと、テストをするときには
最初から使えると便利なので
レベル1でスカラを覚えるように
したりしています。(^_^;)

※勇者のシート(レベル1で覚える呪文)

 

シートは以上です。

 

 

charaの変更

chara.pyを変更します。

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

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

        self.x = 0 # プレイヤーのx座標
        self.y = 0 # プレイヤーのy座標
        self.d = 0 # プレイヤーの向き 0:上 1:下 2:左 3:右
        self.a = 0 # imgPlayerの添字
        self.turn_sukara = 0 # スカラの有効ターン
        self.dfs_up = [1, 1] # dfs_up[0]:ぼうぎょ効果,dfs_up[1]:呪文効果 

 

以下の2つを追加しました。

self.turn_sukara = 0 # スカラの有効ターン
self.dfs_up = [1, 1] # dfs_up[0]:ぼうぎょ効果,dfs_up[1]:呪文効果 

 

turn_sukaraにはスカラの
有効ターンを格納します。

スカラを使った後、
防御力が上がりっぱなしではなく
何ターンかすると元に戻すので
その有効ターンの値を持っておきます。

 

dfs_upは防御効果(倍率)を格納します。
リストにして
dfs_up[0]:コマンド「ぼうぎょ」の効果
dfs_up[1]:スカラの効果
です。

コマンド「ぼうぎょ」を使った時は
dfs_up[0]=2
にして防御力を2倍のようにします。
dfs_up[1]も同様です。

 

次にスカラのメソッドです。

変更前

class Chara():
(省略)

    def confirm_spell(self, str_spell):
        if self.mp < spell_usemp_dict[str_spell]:
            return False
        else:
            self.mp -= spell_usemp_dict[str_spell] # 消費mp
            return True
    def use_spell(self, str_spell, num):
        dmg = []
        for _ in range(num):
            dmg.append(random.randint(spell_lo_dict[str_spell], spell_up_dict[str_spell]))
        return dmg

変更後

class Chara():
(省略)

    def check_mp(self, str_spell):
        if self.mp < spell_usemp_dict[str_spell]:
            return False
        else:
            self.mp -= spell_usemp_dict[str_spell] # 消費mp
            return True
    def use_spell(self, str_spell, num, target=""):
        if str_spell == "スカラ":
            self.sukara(target)
            return -1
        dmg = []
        for _ in range(num):
            dmg.append(random.randint(spell_lo_dict[str_spell], spell_up_dict[str_spell]))
        return dmg
    def sukara(self, target):
        target.turn_sukara = random.randint(3, 4)
        target.dfs = int(1.5 * target.dfs) # 現在の防御力に1.5倍
        target.dfs_up[1] = 1.5 * target.dfs_up[1] # 現在のスカラの効果
    def invalid_sukara(self):
        self.dfs_up[1] = 1
    

 

最初に・・
残りMPや消費MPを確認する
メソッドの名前を
何となく変更しました。

変更前:confirm_spell
変更後:check_mp

 

use_spellメソッドは
誰に使うかを指定する引数を
一つ増やしました。

def use_spell(self, str_spell, num, target=""):

デフォルトで「""」を
指定しています。

呪文の相手が味方単体の時は
誰に使うかを指定します。

味方はプレイヤー自身しかいないので
無くても良いですけど・・(^_^;)

使う呪文が「スカラ」の時は
メソッドsukaraを使って
スカラ効果を付与します。
その後に-1を返します。
※-1ではない時は
 回復呪文の回復量を返します。

if str_spell == "スカラ":
    self.sukara(target)
    return -1

 

メソッドsukaraです。
有効ターンを決めます。

target.turn_sukara = random.randint(3, 4)

ランダムで3ターンか4ターンとします。
randintの詳細はこちら

そして防御力を1.5倍にします。

target.dfs = int(1.5 * target.dfs)
target.dfs_up[1] = 1.5 * target.dfs_up[1] # 現在のスカラの効果

現在の防御力を1.5倍にして
スカラ効果(dfs_up)も1.5倍にします。

スカラ効果が残っている時に
さらにスカラを使うと
1.5 * 1.5 で 2.25倍になります。

単純にdfsに倍率を掛けるだけにせずに
スカラ効果を保持しておくのは
コマンド「ぼうぎょ」だけの
効果を消しやすいからです。

 

最後にinvalid_sukaraメソッドで
スカラの効果を消します。

self.dfs_up[1] = 1

防御力を1倍(元の防御力)にします。

 

あと、ぼうぎょ関連のメソッドを
変えます。

変更前

class Chara():
(省略)
    def attack(self, obj):
(省略)

    def defense(self):
        self.dfs *= 2

変更後

class Chara():
(省略)
    
    def attack(self, obj):
(省略)

    def defense(self): # ぼうぎょ
        self.dfs_up[0] *= 2
        self.dfs *= self.dfs_up[0]
    def invalid_defense(self): # ぼうぎょ無効(ターン終了)
        self.dfs_up[0] = 1
    def check_dfs(self): # 防御力計算
        self.re_defense()
        for i in self.dfs_up:
            self.dfs *= i
        self.dfs = int(self.dfs)
        if self.dfs > 999:
            self.dfs = 999

 

defenseメソッドで
ぼうぎょ効果を2倍にします。

invalid_defenseメソッドで
ぼうぎょ効果を
1倍(元の防御力)にします。

check_dfsメソッドで
ぼうぎょ効果とスカラ効果を
考慮した現在の防御力を計算します。

re_defenseメソッドで
元の防御力に戻して
ぼうぎょ効果とスカラ効果の
倍率を掛けてます。

for i in self.dfs_up:
    self.dfs *= i

「i」はインデックスではなく
dfs_upの値(倍率)です。

倍率を掛けた後にint(self.dfs)にして
防御力を整数にしています。

 

スカラに必要なメソッドは以上です。

 

 

battleの変更

chara.pyで追加したり変更した
メソッドを使って、防御力を
変えていきます。

まず、コマンドの入力になった時に
防御力を確認します。

変更前

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

        elif idx == 11: # プレイヤーのターン(入力待ち)
            btl_enemy = 0
            player.re_defense() # ぼうぎょを元に戻す(ぼうぎょ効果を消す)

変更後

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

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

 

コマンド「ぼうぎょ」効果を
消して(1倍にして)
check_dfsメソッドで
防御力を計算します。

 

そして、コマンドを入力して
ターンが回ってきた時に
スカラ効果を確認します。

変更前

        elif idx == 24: # ターン確認
            tmr = 0
            turn_obj, idx = get_battle_turn(player)

変更後

        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()

 

turn_obj.turn_sukara -= 1
if turn_obj.turn_sukara == 0: # スカラ効果が無くなったら

スカラ効果の有効ターンを
減らして(デクリメントして)
有効ターンが0になったら
スカラ効果を消します。

turn_obj.invalid_sukara() # スカラ効果を消す
turn_obj.check_dfs()

スカラ効果を消して(1倍にして)
check_dfsメソッドで防御力を
計算します。

 

最後に呪文スカラを使います。

        elif idx == 26: # 呪文発動
(省略)
            if tmr == 8:
                if turn_obj.check_mp(turn_obj.mas_spell[sel_spell_i]): # mpが足りていたら
                    spell_target_no = turn_obj.get_spell_target(turn_obj.mas_spell[sel_spell_i])
                    if spell_target_no == 0: # 呪文の対象が味方単体
                        spell_dmg = turn_obj.use_spell(turn_obj.mas_spell[sel_spell_i], 1, player)
                        if spell_dmg != -1:
                            player.hp += spell_dmg[0] # 単体なので添字は0
                            if player.hp > player.maxhp:
                                player.hp = player.maxhp
                            set_message(player.name + " の キズが かいふくした!")
                        else:
                            set_message(player.name + " の 守備力が上がった!")
                    elif spell_target_no == 1: # 呪文の対象が味方全体
                        pass
                    elif spell_target_no == 2: # 呪文の対象がモンスター単体
(省略)
                    elif spell_target_no == 3: # 呪文の対象がモンスターグループ
(省略)
                    elif spell_target_no == 4: # 呪文の対象がモンスター全体
(省略)
                else:
                    set_message("しかし MPがたりない!")
           

最初にスカラと関係ないですが
呪文の対象の確認は変数に入れました。

spell_target_no = turn_obj.get_spell_target(turn_obj.mas_spell[sel_spell_i])

 

変更前

if turn_obj.get_spell_target(turn_obj.mas_spell[sel_spell_i]) == 0: 

 

変更後

if spell_target_no == 0:

 

何となくスッキリしました(^_^)

で、スカラを使います。
use_spellの戻り値が-1の時、
スカラを使ったことになります。

スカラ効果はuse_spellで
追加しているので
ここではメッセージを追加するのみです。

spell_dmg = turn_obj.use_spell(turn_obj.mas_spell[sel_spell_i], 1, player)
    if spell_dmg != -1:
(省略)
    else:
        set_message(player.name + " の 守備力が上がった!")

 

少し強引になりましたが、、
兎にも角にもこれで
スカラを追加できました(^_^)

 

 

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

 

 

最後に

今回は補助系の呪文を追加しました。

次回も補助系の呪文に手を加えたいと思います。

まとめサイトへ

 

 

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

 

 

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

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