CODE Python RPG

独学でPythonでRPGを作成する(第17回)親クラスを追加

更新日:

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

前回はパラメータに素早さを追加して、行動順を素早さの高い順に変更しました。

今回は親クラスであるCharaクラスを作り、
それに攻撃のメソッドと防御のメソッドを追加します。
元々あったBraveクラスとMonsterクラスはCharaクラスを継承します。

 

目次

  1. Charaクラスの作成
  2. Charaクラスを継承
  3. 残作業
  4. 最後に

Charaクラスの作成

それではまず、Charaクラスを作成します。
その中に攻撃のattackメソッド、防御のdefenseメソッドを作ります。
ファイルはchara.pyです。

class Chara():
    def attack(self, obj):
        base_dmg = self.atk/2 - obj.dfs/4
        if base_dmg <= 0:
            return 0
        width_dmg = base_dmg/16 + 1
        min_dmg = int(base_dmg - width_dmg)
        max_dmg = int(base_dmg + width_dmg)
        return random.randint(min_dmg, max_dmg)
    def defense(self):
        self.dfs *= 2 # 防御力を2倍にする

attackメソッドはone_hour_dungeon.pyで作成したbattle_cal関数ですが
同じ機能をCharaクラスに持たせました。
後ほど、battle_cal関数は削除します。

理由は何となくですが、、
キャラの行動はクラスに持たせようと思ったからです。。

ちなみにメソッドと関数の違いはこちら
ググって最初に出てきたサイトを参照させて頂きました。

また、defenseメソッドは戦闘コマンドで「ぼうぎょ」を
選択した時に呼び出して、防御力を2倍にします。
こちらで作成したメソッドです。
※この時は「メソッド」を誤って「関数」と記載しておりました。。(修正しました)
 他にもたくさんある気がしますが、予めご了承願います。

元々defenseメソッドはBraveクラスにありましたが
親クラスに持たせることにします。

 

 

Charaクラスを継承

BraveクラスとMonsterクラスは、先ほど作成したCharaクラスを継承します。
継承についてはこちら

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

class Monster(Chara):
    def __init__(self, num):
        self.num = num # 追加
        self.img = pygame.image.load("image/enemy"+str(num)+".png")
(省略)
        self.dfs = int(mon_dfs[num])
(省略)
    def re_defense(self): # 防御力を元に戻す
        self.dfs = int(mon_dfs[self.num])

Charaクラスを継承することで、BraveクラスもMonsterクラスも
attackメソッドやdefenseメソッドを使えます。

また、Monsterクラスには防御力を元に戻すメソッドが
無かったので追加しました。(Braveクラスにはありました)

この為、元の防御力を取得する為に、
モンスター種別の引数numの値もself.numに格納します。
元に戻す時にself.numを使ってそのモンスターの
防御力を取得しています。
self.dfsを2で割っても同じですが、何となくこの方法にしました。

 

 

残作業

残りの作業として、先ほども記載しましたが、
battle_cal関数の削除です。

attackメソッドに同じ機能を持たせたのでこちらは削除します。
one_hour_dungeon.pyファイルです。

(全て削除)
def battle_cal(obj1, obj2): # 攻撃のダメージ計算
    base_dmg = obj1.atk/2 - obj2.dfs/4
    if base_dmg <= 0:
        return 0
    width_dmg = base_dmg/16 + 1
    min_dmg = int(base_dmg - width_dmg)
    max_dmg = int(base_dmg + width_dmg)
    return random.randint(min_dmg, max_dmg)

 

battle_cal関数を削除したので、利用する箇所も
attackメソッドに変更します

def main():
(省略)
        elif idx == 12: # プレイヤーの攻撃
            draw_battle(screen, fontS, turn_obj)
            if tmr == 1:
                set_message(turn_obj.name + " の攻撃!")
                # dmg = battle_cal(turn_obj, monster[btl_enemy]) # 変更前(削除する)
                dmg = player.attack(monster[btl_enemy]) # 追加
(省略)
        elif idx == 13: # 敵のターン、敵の攻撃
            draw_battle(screen, fontS, turn_obj)
            if tmr == 5:
                set_message(turn_obj.name + " の攻撃!")
                emy_step = 30
            if tmr == 9:
                # dmg = battle_cal(turn_obj, player) # 変更前(削除する)
                dmg = turn_obj.attack(player) # 追加

 

あと他にもう一つ、最初のタイトル画面からスペースを押下すると
ゲームが始まりますが、この時にモンスターオブジェクトを
空にしておきます(削除しておきます)。

理由は全滅した後もこのタイトル画面に戻って再スタートとなりますが
モンスターオブジェクトを削除しておかないと、全滅させられた時の
モンスターが残ってしまい、次の戦闘に影響が出てしまう為です。

全滅

再開した後の戦闘

 

というわけで以下の追加です。

def main():
(省略)
            if key[K_SPACE] == 1:
                make_dungeon()
                put_event()
                player.reset()
                monster.clear() # 追加
                dead_monster.clear() # 追加

 

他にも色々バグがあるんだろうなと思いつつ、
今回は以上です!(`・ω・´)

 

 

最後に

今回は親クラスのCharaクラスを作り、
それに攻撃のメソッドと防御のメソッドを追加しました。
そして、元々あったBraveクラスとMonsterクラスに
Charaクラスを継承させました。

今後、キャラの行動(メソッド)は
クラスに追加していこうと思っています。

例えば、いつになるか分かりませんが、
「じゅもん」とか「どうぐ」とかです。

次回はレベルアップを追加・修正していこうと思っています。

まとめサイトへ

 

 

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

 

 

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

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