現在の見出し:3.1節:行動選択の作成
見出し一覧
- 3.1節:行動選択の作成
- - input()・upper()による多様な行動入力システムの実装
- - if-elif-else文による攻撃処理分岐機能の実装
【PR】『Python』を学べる企業・個人向けのプログラミングコース
input()・upper()による多様な行動入力システムの実装
前節(第2章2.2節)で作成した複合戦闘状態判定システムを基盤として、プレイヤーが戦闘中に攻撃・防御・回復の3つの行動から選択できる多様な入力システムを実装します。input()関数関数は一定の処理をまとめたプログラムの塊です。でプレイヤーの行動選択を取得し、upper()メソッドメソッドは特定の処理をまとめたプログラムの塊です。で大文字小文字の違いを統一することで、「攻撃」「ATTACK」「A」「1」など様々な入力形式に対応可能な柔軟な行動選択システムを構築します。
この実装では、upper()メソッドで入力文字列文字列は文字の並びを表現するデータ型で、テキストデータを扱うための基本的な構造として広く使用されています。を大文字に変換後、in演算子演算子は数値や文字列などのデータを扱う際に使用される記号や記述方法です。を使って複数の入力パターンに対応し、プレイヤーは数字・日本語・英語・略語のいずれでも同じ行動を実行できます。無効な入力の場合はエラーメッセージを表示することで、プレイヤーが自分の好みに応じて操作方法を選択できる戦略的で快適な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}")
# 行動選択システムの実装
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}が防御を選択しました!")
print(f"{player_name}は身を守る構えを取った!")
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")
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戦闘処理完了!")
行数 | 種別 | コード | 解説 |
---|---|---|---|
37行目 | 新規 | print(f"\n=== {player_name}のターン ===") |
プレイヤーのターン開始を示すセクション見出しの表示 |
38行目 | 新規 | print("行動を選択してください:") |
行動選択の指示メッセージを表示 |
39行目 | 新規 | print("1. 攻撃 (1/攻撃/ATTACK/A)") |
攻撃選択肢と対応する入力パターンを表示 |
40行目 | 新規 | print("2. 防御 (2/防御/DEFENSE/D)") |
防御選択肢と対応する入力パターンを表示 |
41行目 | 新規 | print("3. 回復 (3/回復/HEAL/H)") |
回復選択肢と対応する入力パターンを表示 |
43行目 | 新規 | action = input("行動選択: ").upper() |
input()で行動選択を取得し、upper()で大文字に統一 |
45行目 | 新規 | if action in ["1", "攻撃", "ATTACK", "A"]: |
in演算子で攻撃に対応する複数の入力パターンを判定 |
46行目 | 新規 | print(f"\n【攻撃選択】{player_name}が攻撃を選択しました!") |
攻撃選択時の確認メッセージをプレイヤー名と共に表示 |
47行目 | 新規 | player_damage = player_attack - enemy_defense |
プレイヤーの攻撃力から敵の防御力を減算してダメージ計算 |
48行目 | 新規 | player_damage = 1 if player_damage < 1 else player_damage |
三項演算子三項演算子は条件分岐を簡潔に記述するための構文で、1つの式で条件式と2つの結果を表現し、if-else文の省略形として機能します。でダメージが1未満の場合に最小ダメージ1を保証 |
49行目 | 新規 | enemy_hp -= player_damage |
計算されたダメージを敵のHPから減算 |
50行目 | 新規 | print(f"{player_name}が{enemy_name}に{player_damage}のダメージを与えた!") |
攻撃結果をプレイヤー名・敵名・ダメージ数値と共に表示 |
51行目 | 新規 | print(f"{enemy_name}のHP: {enemy_hp}/{enemy_max_hp}") |
攻撃後の敵のHP状況を現在値と最大値で表示 |
52行目 | 新規 | elif action in ["2", "防御", "DEFENSE", "D"]: |
in演算子で防御に対応する複数の入力パターンを判定 |
53行目 | 新規 | print(f"\n【防御選択】{player_name}が防御を選択しました!") |
防御選択時の確認メッセージをプレイヤー名と共に表示 |
54行目 | 新規 | print(f"{player_name}は身を守る構えを取った!") |
防御行動の基本的な描写メッセージを表示 |
55行目 | 新規 | print(f"防御効果の詳細実装は次節で行います") |
防御効果の詳細実装が次節で行われることを明示 |
56行目 | 新規 | elif action in ["3", "回復", "HEAL", "H"]: |
in演算子で回復に対応する複数の入力パターンを判定 |
57行目 | 新規 | print(f"\n【回復選択】{player_name}が回復を選択しました!") |
回復選択時の確認メッセージをプレイヤー名と共に表示 |
58行目 | 新規 | print(f"{player_name}は回復行動を取った!") |
回復行動の基本的な描写メッセージを表示 |
59行目 | 新規 | print(f"回復効果の詳細実装は次節で行います") |
回復効果の詳細実装が次節で行われることを明示 |
60行目 | 新規 | else: |
無効な入力時の処理を行うelse文 |
61行目 | 新規 | print(f"\n【エラー】無効な選択です: {action}") |
無効な入力値を含むエラーメッセージを表示 |
62行目 | 新規 | print("有効な選択肢: 1/攻撃/ATTACK/A, 2/防御/DEFENSE/D, 3/回復/HEAL/H") |
有効な入力パターンの一覧を表示してユーザーを誘導 |