こんにちは。
「Pythonでつくる ゲーム開発 入門講座」の
Chapter11,12(本格RPGを作ろう!全編・後編)を基にRPGを作っていきます。
前回は補助系の呪文のマヌーサを追加しました。
今回も同じく補助系の呪文ラリホー・ラリホーマを追加します。
(全て記載できていないので、今回と次回で追加します)
目次
呪文シート
「ラリホー」は
相手を眠り状態にします。
眠り状態ですと
攻撃などが出来なくなります。

以下のページを参考にさせて頂きました。
呪文の効果はこちら。
呪文の説明はこちら。
ラリホーは敵1グループ
ラリホーマは敵1体
が対象です。
また、ラリホーは相手に使う為
成功率を設けます。
ラリホーは成功率を75%(上限値を75)
ラリホーマは成功率を90%(上限値を90)
にします。
※下限は使いません。
※補助系の場合、上限・下限は
成功率に使います。
シートは以上です。
charaの変更
最初に変数を追加します。
有効ターン数を格納する変数です。
回数を格納する変数は用意しません。
※眠り状態の時にラリホーが効いても
有効ターンが変わるのみです。
class Chara():
def __init__(self):
(省略)
self.turn_sleep = 0 # ラリホー、ラリホーマ(眠り状態)の有効ターン
self.flag_sleep = False # ラリホー、ラリホーマにかかっているか(眠り状態か)
ラリホーもラリホーマも
眠り状態は同じなので
同じ変数を使います。
ラリホー
ラリホーのメソッドを追加します。
ついでに前回のマヌーサのメソッドを
変えます。
特に理由はありません。。
※判定の順番を変えるだけで
やっていることは同じです。
変更前
class Chara():
(省略)
def manusa(self, target): # マヌーサ
if target.flag_manusa:
target.turn_manusa = random.randint(4, 5) # 効果の残りターン
return 1 # 既にマヌーサにかかっている
else:
if random.randint(0, 99) < spell_up_dict["マヌーサ"]: # 呪文の上限値が成功率
target.flag_manusa = True
target.turn_manusa = random.randint(4, 5) # 効果の残りターン
return 2
else: # 効かなかった
return -1
変更後
class Chara():
(省略)
def manusa(self, target): # マヌーサ
if random.randint(0, 99) < spell_up_dict["マヌーサ"]: # 呪文の上限値が成功率
target.turn_manusa = random.randint(4, 5) # 効果の残りターン
if target.flag_manusa:
return 1 # 既にマヌーサにかかっている
else:
target.flag_manusa = True
return 2
else: # 効かなかった
return -1
def invalid_manusa(self):
self.turn_manusa = 0
self.flag_manusa = False
def rariho(self, target): # ラリホー
if random.randint(0, 99) < spell_up_dict["ラリホー"]: # 呪文の上限値が成功率
target.turn_sleep = random.randint(4, 5) # 効果の残りターン
if target.flag_sleep:
return 1 # 既にラリホーにかかっている
else:
target.flag_sleep = True
return 2
else: # 効かなかった
return -1
def rarihoma(self, target): # ラリホーマ
if random.randint(0, 99) < spell_up_dict["ラリホーマ"]: # 呪文の上限値が成功率
target.turn_sleep = random.randint(4, 5) # 効果の残りターン
if target.flag_sleep:
return 1 # 既にラリホーにかかっている
else:
target.flag_sleep = True
return 2
else: # 効かなかった
return -1
def invalid_sleep(self):
self.turn_sleep = 0
self.flag_sleep = False
マヌーサもラリホーも
やっていることは同じです。
if random.randint(0, 99) < spell_up_dict["ラリホー"]:
・呪文が効いたか確認(成功率より小さい値か)
target.turn_sleep = random.randint(4, 5) # 効果の残りターン
・効いたら有効ターンを設定(更新)
if target.flag_sleep:
return 1 # 既にラリホーにかかっている
else:
target.flag_sleep = True
return 2
・flag_sleepを更新
といった感じです。
あと、invalid_sleepメソッドで
眠り状態を無効にします。
def invalid_sleep(self):
self.turn_sleep = 0
self.flag_sleep = False
そしてspell_resetメソッドで
呼び出します。
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() # 攻撃力を元に戻す
self.invalid_manusa() # マヌーサの効果を消す
self.invalid_sleep() # ラリホー、ラリホーマの効果を消す
呪文を使う
呪文を使う時のメソッドuse_spellを
変更します。
def use_spell(self, str_spell, target, spell_target_no):
# 戻り値が-1は状態変化の呪文
(省略)
elif str_spell == "ラリホー":
tmp = self.rariho(target)
if tmp == -1:
message = target.name + " には きかなかった!"
elif tmp == 1:
message = target.name + "は ねむっている!"
elif tmp == 2:
message = target.name + "を ねむらせた!"
return -1, message
elif str_spell == "ラリホーマ":
tmp = self.rarihoma(target)
if tmp == -1:
message = target.name + " には きかなかった!"
elif tmp == 1:
message = target.name + "は ねむっている!"
elif tmp == 2:
message = target.name + "を ねむらせた!"
return -1, message
chara.pyは以上です。
battleの変更
battle.pyを変更します。
補助呪文の残りターンを確認する
check_spell_effect関数に
ラリホーを追加します。
def check_spell_effect(player):
(省略)
if obj.turn_sleep != 0:
obj.turn_sleep -= 1
if obj.turn_sleep == 0:
check_message.append(obj.name + " はめをさました!")
obj.invalid_sleep() # ラリホー効果を消す
今までのメッセージは
「マヌーサの効果が消えた」
のように「〜の効果が消えた」と
していました。
が、今回は変えて
「〜はめをさました」に
しました。
かかっている呪文が
ラリホーかラリホーマか
分からないので。。(^_^;)
次に、眠り状態の相手に
攻撃をした時に、
たまに目を覚ますようにします。
変更前
def main(screen, clock, font, fontS, player, area):
(省略)
elif idx == 12: # プレイヤーの攻撃
(省略)
if tmr == 11:
btl_exp += do_attack(btl_enemy, dmg, turn_obj)
check_monster()
if tmr == 16:
init_message()
idx = 24 # ターンの確認
変更後
def main(screen, clock, font, fontS, player, area):
(省略)
elif idx == 12: # プレイヤーの攻撃
(省略)
if tmr == 11:
tmp_exp = do_attack(btl_enemy, dmg, turn_obj)
if dmg != 0 and tmp_exp == 0 and monster[btl_enemy].flag_sleep: # 攻撃した かつ 生きている かつ 眠っている
if random.randint(0, 99) < 55: # 55%以下の確率で目を覚ます
monster[btl_enemy].invalid_sleep() # 眠り状態を無効
set_message(monster[btl_enemy].name + " はめをさました!")
btl_exp += tmp_exp
check_monster()
if tmr == 16:
init_message()
idx = 24 # ターンの確認
if dmg != 0 and tmp_exp == 0 and monster[btl_enemy].flag_sleep: # 攻撃した かつ 生きている かつ 眠っている
攻撃した相手が目を覚ます条件は
・相手に攻撃が当たる
・攻撃した相手が生きている
・攻撃した相手が眠り状態
の3つをand条件にしています。
if random.randint(0, 99) < 55: # 55%以下の確率で目を覚ます
monster[btl_enemy].invalid_sleep() # 眠り状態を無効
set_message(monster[btl_enemy].name + " はめをさました!")
目を覚ます条件を満たしたら
55%以下の確率で目を覚ます
ようにしています。
また、全モンスターが
眠り状態の場合は
100%逃げられるようにします。
変更前
def main(screen, clock, font, fontS, player, area):
(省略)
elif idx == 14: # 逃げられる?
draw_battle(screen, fontS, turn_obj, player)
if tmr == 1:
set_message(player.name + " は逃げ出した!")
if tmr == 5:
if btl_start == 1 or random.randint(0, 99) < escape_rate:
idx = 22 # 戦闘終了
else:
set_message("しかし、まわりこまれてしまった!")
if tmr == 10:
init_message()
btl_start = 2 # 不意打ちと同じ状態にする
idx = 23 # ターンセット
tmr = 0
変更後
def main(screen, clock, font, fontS, player, area):
(省略)
elif idx == 14: # 逃げられる?
draw_battle(screen, fontS, turn_obj, player)
if tmr == 1:
set_message(player.name + " は逃げ出した!")
if tmr == 5:
flag_s = True
for mon in monster:
if not mon.flag_sleep:
flag_s = False
break
if flag_s or btl_start == 1 or random.randint(0, 99) < escape_rate: # 全員寝ている か 先制攻撃 は逃げられる
idx = 22 # 戦闘終了
else:
set_message("しかし、まわりこまれてしまった!")
if tmr == 10:
init_message()
btl_start = 2 # 不意打ちと同じ状態にする
idx = 23 # ターンセット
tmr = 0
flag_s = True
for mon in monster:
if not mon.flag_sleep:
flag_s = False
break
全モンスターが眠り状態か
確認しています。
if flag_s or btl_start == 1 or random.randint(0, 99) < escape_rate: # 全員寝ている か 先制攻撃 は逃げられる
idx = 22 # 戦闘終了
全モンスターが眠り状態の場合を
逃げられる条件に追加しています。
最後に、眠り状態のモンスターは
攻撃にしないようにします。
が、ちょっと今回は以上にします。。(´・ω・`)
最後に
今回は相手に使う補助系の呪文ラリホーを追加しました。
ただ、中途半端になってしまったので
残りを次回で追加します。
【ご注意】
プログラムやデータなどは著作権法により保護されています。
著作者の許諾を得ずに、プログラムおよびデータそのものまたは改変したものを
配布したり販売したりすることはできません。
また、これらを利用して発生した損害などに関して、著作者は一切責任を負いません。