ログアウト中 ログイン

学習パッケージを選択

【Python】簡易RPG作成講座 第3章3.2節「防御・回復機能の作成」




現在の見出し: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 防御効果なしの場合は基本ダメージをそのまま使用
三項演算子による回復上限制限機能の実装

第3章3.2節「三項演算子による回復上限制限機能の実装」の続きを見る


すべてのカリキュラムを無料登録で学ぶ

プログラミング・マーケティング・AI活用方法を
今すぐ無料登録すると、全てのコンテンツが視聴可能になります。