現在の見出し:2.2節:勝敗判定の作成
見出し一覧
- 2.2節:勝敗判定の作成
- - 比較演算子による勝敗条件判定機能の実装
- - 論理演算子による複合戦闘状態判定機能の実装
【PR】『Python』を学べる企業・個人向けのプログラミングコース
比較演算子による勝敗条件判定機能の実装
前節(第2章2.1節)で作成したダメージ計算システムを基盤として、戦闘の勝敗を判定する機能を実装します。比較演算子<=
を使ってHP0以下の状態を検出し、ifif文はプログラムで条件分岐を行うための命令文です。-elif文による分岐処理で適切な結果メッセージを表示する勝敗判定システムを構築します。
この実装では、まずプレイヤーのHP <= 0を条件としてif文で敗北判定を行い、次に敵のHP <= 0をelif文で勝利判定を実装します。どちらの条件にも該当しない場合は戦闘継続として処理され、各判定結果では勝利・敗北メッセージと最終的な戦闘統計を表示します。
戦闘結果の表示では、両者の最終HP状況と与えたダメージの合計を数値で確認でき、攻撃・防御・HP管理の戦略的要素が明確化されたRPG戦闘システムの基盤が完成します。
# コード
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
# 敵データ自動計算
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}")
# 攻撃順序の判定とダメージ計算処理
if player_attack > enemy_attack:
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}")
print(f"\n【後攻】{enemy_name}の攻撃!")
enemy_damage = enemy_attack - player_defense
enemy_damage = 1 if enemy_damage < 1 else enemy_damage
player_hp -= enemy_damage
print(f"{enemy_name}が{player_name}に{enemy_damage}のダメージを与えた!")
print(f"{player_name}のHP: {player_hp}/{max_player_hp}")
elif enemy_attack > player_attack:
print(f"\n【先攻】{enemy_name}の攻撃!")
enemy_damage = enemy_attack - player_defense
enemy_damage = 1 if enemy_damage < 1 else enemy_damage
player_hp -= enemy_damage
print(f"{enemy_name}が{player_name}に{enemy_damage}のダメージを与えた!")
print(f"{player_name}のHP: {player_hp}/{max_player_hp}")
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}")
else:
print(f"\n【攻撃力同値のためプレイヤー先攻】")
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}")
print(f"\n【後攻】{enemy_name}の攻撃!")
enemy_damage = enemy_attack - player_defense
enemy_damage = 1 if enemy_damage < 1 else enemy_damage
player_hp -= enemy_damage
print(f"{enemy_name}が{player_name}に{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}")
# 勝敗条件の判定
if 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}")
else:
print(f"\n【戦闘継続】まだ決着がついていません")
print(f"両者ともまだ戦闘可能な状態です")
print(f"戦闘処理完了!")
行数 | 種別 | コード | 解説 |
---|---|---|---|
84行目 | 新規 | if player_hp <= 0: |
プレイヤーのHPが0以下かを比較演算子で判定する敗北条件 |
85行目 | 新規 | print(f"\n【敗北】{player_name}は力尽きた...") |
敗北時のメッセージをプレイヤー名と共に表示 |
86行目 | 新規 | print(f"{enemy_name}に敗北しました。") |
敗北した相手の名前を明記した敗北確定メッセージ |
87行目 | 新規 | print(f"与えたダメージ: {enemy_max_hp - enemy_hp}") |
敗北時でも与えたダメージの合計を減算で計算し表示 |
88行目 | 新規 | elif enemy_hp <= 0: |
敵のHPが0以下かを比較演算子で判定する勝利条件 |
89行目 | 新規 | print(f"\n【勝利】{enemy_name}を倒した!") |
勝利時のメッセージを倒した敵の名前と共に表示 |
90行目 | 新規 | print(f"{player_name}の勝利です!") |
プレイヤー名を含む勝利確定メッセージの表示 |
91行目 | 新規 | print(f"受けたダメージ: {max_player_hp - player_hp}") |
勝利時に受けたダメージの合計を減算で計算し表示 |
92行目 | 新規 | else: |
勝利・敗北以外の戦闘継続状態を処理するelse文 |
93行目 | 新規 | print(f"\n【戦闘継続】まだ決着がついていません") |
勝敗が決まっていない場合の戦闘継続メッセージ |
94行目 | 新規 | print(f"両者ともまだ戦闘可能な状態です") |
戦闘継続の理由を説明する補足メッセージ |