現在の見出し:3.2節:防御・回復機能の作成
見出し一覧
- 3.2節:防御・回復機能の作成
- - 算術演算子による防御効果計算機能の実装
- - 三項演算子による回復上限制限機能の実装
【PR】『Python』を学べる企業・個人向けのプログラミングコース
算術演算子による防御効果計算機能の実装
前節(第3章3.1節)で作成した行動分岐処理機能を基盤として、算術演算子を使った防御効果計算システムを実装します。プレイヤーが防御を選択した時に敵から受けるダメージを半分に減らし、防御力を一時的に10ポイント上げる機能を追加することで、攻撃以外の選択肢も戦略的に意味のある行動として成立させます。
防御効果の仕組みは、敵の攻撃ダメージを//演算子演算子は数値や文字列などのデータを扱う際に使用される記号や記述方法です。で2で割って半分にし、プレイヤーの基本防御力に+演算子で10を加算して強化するという2段階の処理で構成されます。防御状態はis_defendingというブール変数変数はデータを一時的に記憶しておく場所です。で管理し、防御を選択したターンの次に敵が攻撃してきた時、自動的に防御効果が発動するシステムです。
この実装によって、プレイヤーは毎ターン攻撃するだけではなく、防御を選択してダメージを軽減するという戦術的な判断ができるようになります。防御時には計算過程と効果が数値で表示されるため、プレイヤーは防御行動がどれだけ有効だったかを具体的に確認できます。
# コード
print("=== RPGゲーム開始 ===")
player_name = input("プレイヤー名を入力してください: ")
player_hp = int(input("初期HPを入力してください: "))
player_attack = int(input("攻撃力を入力してください: "))
# 初期データ管理変数の設定
max_player_hp = player_hp
player_defense = 5
battle_count = 0
game_active = True
is_defending = False
# 敵データ自動計算
enemy_name = "ゴブリン"
enemy_max_hp = int(player_hp * 1.2) + (battle_count * 10)
enemy_hp = enemy_max_hp
enemy_attack = int(player_attack * 0.8) + (battle_count * 2)
enemy_defense = 3 + battle_count
print(f"\n【プレイヤー情報】")
print(f"名前: {player_name}")
print(f"HP: {player_hp}/{max_player_hp}")
print(f"攻撃力: {player_attack}")
print(f"防御力: {player_defense}")
print("プレイヤー作成完了!")
print(f"\n【敵ステータス計算過程】")
print(f"基本HP: {player_hp} × 1.2 + {battle_count} × 10 = {enemy_max_hp}")
print(f"基本攻撃力: {player_attack} × 0.8 + {battle_count} × 2 = {enemy_attack}")
print(f"基本防御力: 3 + {battle_count} = {enemy_defense}")
print(f"\n【敵情報】")
print(f"名前: {enemy_name}")
print(f"HP: {enemy_hp}/{enemy_max_hp}")
print(f"攻撃力: {enemy_attack}")
print(f"防御力: {enemy_defense}")
print("敵データ自動生成完了!")
print(f"\n=== 戦闘開始 ===")
print(f"{player_name} vs {enemy_name}")
# 行動選択システムの実装
print(f"\n=== {player_name}のターン ===")
print("行動を選択してください:")
print("1. 攻撃 (1/攻撃/ATTACK/A)")
print("2. 防御 (2/防御/DEFENSE/D)")
print("3. 回復 (3/回復/HEAL/H)")
action = input("行動選択: ").upper()
# 行動分岐処理機能の実装
if action in ["1", "攻撃", "ATTACK", "A"]:
print(f"\n【攻撃選択】{player_name}が攻撃を選択しました!")
player_damage = player_attack - enemy_defense
player_damage = 1 if player_damage < 1 else player_damage
enemy_hp -= player_damage
print(f"{player_name}が{enemy_name}に{player_damage}のダメージを与えた!")
print(f"{enemy_name}のHP: {enemy_hp}/{enemy_max_hp}")
elif action in ["2", "防御", "DEFENSE", "D"]:
print(f"\n【防御選択】{player_name}が防御を選択しました!")
is_defending = True
temp_defense_boost = 10
total_defense = player_defense + temp_defense_boost
print(f"{player_name}は身を守る構えを取った!")
print(f"防御力が一時的に {player_defense} → {total_defense} に向上!")
print(f"次に受けるダメージが半減されます")
elif action in ["3", "回復", "HEAL", "H"]:
print(f"\n【回復選択】{player_name}が回復を選択しました!")
print(f"{player_name}は回復行動を取った!")
print(f"回復効果の詳細実装は次の項目で行います")
else:
print(f"\n【エラー】無効な選択です: {action}")
print("有効な選択肢: 1/攻撃/ATTACK/A, 2/防御/DEFENSE/D, 3/回復/HEAL/H")
# 攻撃順序判定とターン制戦闘処理
if player_attack > enemy_attack:
print(f"\n【先攻】{player_name}の攻撃!")
if action in ["1", "攻撃", "ATTACK", "A"]:
print(f"既に攻撃処理済み")
else:
player_damage = player_attack - enemy_defense
player_damage = 1 if player_damage < 1 else player_damage
enemy_hp -= player_damage
print(f"{player_name}が{enemy_name}に{player_damage}のダメージを与えた!")
print(f"{enemy_name}のHP: {enemy_hp}/{enemy_max_hp}")
print(f"\n【後攻】{enemy_name}の攻撃!")
base_enemy_damage = enemy_attack - player_defense
base_enemy_damage = 1 if base_enemy_damage < 1 else base_enemy_damage
if is_defending:
temp_defense_boost = 10
enhanced_defense = player_defense + temp_defense_boost
enhanced_enemy_damage = enemy_attack - enhanced_defense
enhanced_enemy_damage = 1 if enhanced_enemy_damage < 1 else enhanced_enemy_damage
final_enemy_damage = enhanced_enemy_damage // 2
final_enemy_damage = 1 if final_enemy_damage < 1 else final_enemy_damage
print(f"【防御効果発動】")
print(f"基本ダメージ: {enemy_attack} - {enhanced_defense} = {enhanced_enemy_damage}")
print(f"防御により半減: {enhanced_enemy_damage} ÷ 2 = {final_enemy_damage}")
player_hp -= final_enemy_damage
print(f"{enemy_name}の攻撃を防御! {final_enemy_damage}のダメージ!")
is_defending = False
else:
final_enemy_damage = base_enemy_damage
player_hp -= final_enemy_damage
print(f"{enemy_name}が{player_name}に{final_enemy_damage}のダメージを与えた!")
print(f"{player_name}のHP: {player_hp}/{max_player_hp}")
elif enemy_attack > player_attack:
print(f"\n【先攻】{enemy_name}の攻撃!")
base_enemy_damage = enemy_attack - player_defense
base_enemy_damage = 1 if base_enemy_damage < 1 else base_enemy_damage
if is_defending:
temp_defense_boost = 10
enhanced_defense = player_defense + temp_defense_boost
enhanced_enemy_damage = enemy_attack - enhanced_defense
enhanced_enemy_damage = 1 if enhanced_enemy_damage < 1 else enhanced_enemy_damage
final_enemy_damage = enhanced_enemy_damage // 2
final_enemy_damage = 1 if final_enemy_damage < 1 else final_enemy_damage
print(f"【防御効果発動】")
print(f"基本ダメージ: {enemy_attack} - {enhanced_defense} = {enhanced_enemy_damage}")
print(f"防御により半減: {enhanced_enemy_damage} ÷ 2 = {final_enemy_damage}")
player_hp -= final_enemy_damage
print(f"{enemy_name}の攻撃を防御! {final_enemy_damage}のダメージ!")
is_defending = False
else:
final_enemy_damage = base_enemy_damage
player_hp -= final_enemy_damage
print(f"{enemy_name}が{player_name}に{final_enemy_damage}のダメージを与えた!")
print(f"{player_name}のHP: {player_hp}/{max_player_hp}")
print(f"\n【後攻】{player_name}の攻撃!")
if action in ["1", "攻撃", "ATTACK", "A"]:
print(f"既に攻撃処理済み")
else:
player_damage = player_attack - enemy_defense
player_damage = 1 if player_damage < 1 else player_damage
enemy_hp -= player_damage
print(f"{player_name}が{enemy_name}に{player_damage}のダメージを与えた!")
print(f"{enemy_name}のHP: {enemy_hp}/{enemy_max_hp}")
else:
print(f"\n【攻撃力同値のためプレイヤー先攻】")
print(f"\n【先攻】{player_name}の攻撃!")
if action in ["1", "攻撃", "ATTACK", "A"]:
print(f"既に攻撃処理済み")
else:
player_damage = player_attack - enemy_defense
player_damage = 1 if player_damage < 1 else player_damage
enemy_hp -= player_damage
print(f"{player_name}が{enemy_name}に{player_damage}のダメージを与えた!")
print(f"{enemy_name}のHP: {enemy_hp}/{enemy_max_hp}")
print(f"\n【後攻】{enemy_name}の攻撃!")
base_enemy_damage = enemy_attack - player_defense
base_enemy_damage = 1 if base_enemy_damage < 1 else base_enemy_damage
if is_defending:
temp_defense_boost = 10
enhanced_defense = player_defense + temp_defense_boost
enhanced_enemy_damage = enemy_attack - enhanced_defense
enhanced_enemy_damage = 1 if enhanced_enemy_damage < 1 else enhanced_enemy_damage
final_enemy_damage = enhanced_enemy_damage // 2
final_enemy_damage = 1 if final_enemy_damage < 1 else final_enemy_damage
print(f"【防御効果発動】")
print(f"基本ダメージ: {enemy_attack} - {enhanced_defense} = {enhanced_enemy_damage}")
print(f"防御により半減: {enhanced_enemy_damage} ÷ 2 = {final_enemy_damage}")
player_hp -= final_enemy_damage
print(f"{enemy_name}の攻撃を防御! {final_enemy_damage}のダメージ!")
is_defending = False
else:
final_enemy_damage = base_enemy_damage
player_hp -= final_enemy_damage
print(f"{enemy_name}が{player_name}に{final_enemy_damage}のダメージを与えた!")
print(f"{player_name}のHP: {player_hp}/{max_player_hp}")
print(f"\n=== 戦闘結果 ===")
print(f"{player_name} HP: {player_hp}/{max_player_hp}")
print(f"{enemy_name} HP: {enemy_hp}/{enemy_max_hp}")
# 複合戦闘状態判定
player_hp_rate = (player_hp / max_player_hp) * 100
enemy_hp_rate = (enemy_hp / enemy_max_hp) * 100
print(f"\n=== 複合戦闘状態分析 ===")
print(f"{player_name}のHP残量: {player_hp_rate:.1f}%")
print(f"{enemy_name}のHP残量: {enemy_hp_rate:.1f}%")
# and演算子による戦闘継続条件の判定
if player_hp > 0 and enemy_hp > 0:
print(f"\n【戦闘継続中】両者とも戦闘可能です")
# or演算子による危険状態の判定
if player_hp_rate <= 30 or enemy_hp_rate <= 30:
print(f"【警告】どちらかが危険状態です!")
if player_hp_rate <= 30:
print(f" - {player_name}が危険状態(HP {player_hp_rate:.1f}%)")
if enemy_hp_rate <= 30:
print(f" - {enemy_name}が危険状態(HP {enemy_hp_rate:.1f}%)")
# not演算子による安全状態の判定
if not (player_hp_rate <= 50 or enemy_hp_rate <= 50):
print(f"【安全】両者とも余裕があります")
# 戦闘優劣の判定
if player_hp_rate > enemy_hp_rate and player_attack > enemy_attack:
print(f"【優勢】{player_name}が有利です")
elif enemy_hp_rate > player_hp_rate and enemy_attack > player_attack:
print(f"【劣勢】{enemy_name}が有利です")
else:
print(f"【互角】戦況は拮抗しています")
# 基本的な勝敗判定
elif player_hp <= 0:
print(f"\n【敗北】{player_name}は力尽きた...")
print(f"{enemy_name}に敗北しました。")
print(f"与えたダメージ: {enemy_max_hp - enemy_hp}")
elif enemy_hp <= 0:
print(f"\n【勝利】{enemy_name}を倒した!")
print(f"{player_name}の勝利です!")
print(f"受けたダメージ: {max_player_hp - player_hp}")
print(f"\n戦闘処理完了!")
行数 | 種別 | コード | 解説 |
---|---|---|---|
11行目 | 新規 | is_defending = False |
プレイヤーの防御状態を管理するブール変数を初期化 |
49行目 | 変更 | is_defending = True |
防御選択時に防御状態フラグをTrueに設定 |
50行目 | 新規 | temp_defense_boost = 10 |
防御時の一時的な防御力向上値を定義 |
51行目 | 新規 | total_defense = player_defense + temp_defense_boost |
基本防御力に一時的向上値を加算して総防御力を計算 |
53行目 | 変更 | print(f"防御力が一時的に {player_defense} → {total_defense} に向上!") |
防御力向上の具体的数値を表示 |
54行目 | 新規 | print(f"次に受けるダメージが半減されます") |
防御効果の詳細説明を表示 |
73行目 | 新規 | base_enemy_damage = enemy_attack - player_defense |
防御効果適用前の基本敵ダメージを計算 |
74行目 | 新規 | base_enemy_damage = 1 if base_enemy_damage < 1 else base_enemy_damage |
基本ダメージの最小値を1に保証 |
76行目 | 新規 | if is_defending: |
防御状態の場合の特殊処理分岐 |
77行目 | 新規 | temp_defense_boost = 10 |
防御効果発動時の防御力向上値を再定義 |
78行目 | 新規 | enhanced_defense = player_defense + temp_defense_boost |
強化された防御力を計算 |
79行目 | 新規 | enhanced_enemy_damage = enemy_attack - enhanced_defense |
強化防御力を考慮した敵ダメージを計算 |
80行目 | 新規 | enhanced_enemy_damage = 1 if enhanced_enemy_damage < 1 else enhanced_enemy_damage |
強化ダメージの最小値を1に保証 |
81行目 | 新規 | final_enemy_damage = enhanced_enemy_damage // 2 |
防御効果により敵ダメージを整数除算で半減 |
82行目 | 新規 | final_enemy_damage = 1 if final_enemy_damage < 1 else final_enemy_damage |
最終ダメージの最小値を1に保証 |
84行目 | 新規 | print(f"【防御効果発動】") |
防御効果が発動したことを明示 |
85行目 | 新規 | print(f"基本ダメージ: {enemy_attack} - {enhanced_defense} = {enhanced_enemy_damage}") |
防御効果適用時の基本ダメージ計算過程を表示 |
86行目 | 新規 | print(f"防御により半減: {enhanced_enemy_damage} ÷ 2 = {final_enemy_damage}") |
ダメージ半減効果の計算過程を表示 |
88行目 | 新規 | print(f"{enemy_name}の攻撃を防御! {final_enemy_damage}のダメージ!") |
防御成功時の特殊メッセージを表示 |
89行目 | 新規 | is_defending = False |
防御効果使用後に防御状態をリセットリセットはシステムやプログラムの状態を初期状態に戻す操作で、エラー復旧やデバッグ、テスト実行などで重要です。 |
90行目 | 新規 | else: |
防御状態でない場合の通常ダメージ処理 |
91行目 | 新規 | final_enemy_damage = base_enemy_damage |
防御効果なしの場合は基本ダメージをそのまま使用 |