デジタルこどもBASEのロゴ 特定非営利活動法人デジタルこどもBASE 📚 目次
第90回 Lv4 ⏱ 20〜25分

ターン制バトルを作ろう

🎯 きょうのミッション

RPGの本物の戦闘。while ループで「自分のターン→敵のターン」を交互にくりかえし、どちらかのHPが0になったら終了。

🧠 できるようになること

  • ターン制バトルの基本構造が書ける
  • while と if で勝敗判定できる
  • 本格RPGの戦闘システムが完成する

🧰 用意するもの

  • パソコン
  • ブラウザ(Chrome / Edge / Safari)
  • インターネット接続
  • このページの「▶ このページで実行」ボタン(コードをそのまま動かせます)
  • Trinket(予備の実行サイト:https://trinket.io/python)

🖼 できあがり

HPがあるあいだ、お互いに攻撃しあいます。先にHPが0になった方が負け。

📺 実行結果
⚔ ターン1
あなたの攻撃!スライムに20ダメージ
敵のHP: 10
スライムの攻撃!あなたに8ダメージ
あなたのHP: 92
⚔ ターン2
あなたの攻撃!スライムに20ダメージ
敵のHP: -10
🎉 スライムを倒した!

🚀 やりかた

  1. while player_hp > 0 and enemy_hp > 0: で両方生きてる間。
  2. ターン番号を表示。
  3. プレイヤーの攻撃→敵HP表示。
  4. 敵HP > 0 なら敵の攻撃→プレイヤーHP表示。
  5. ループ後、勝者を判定して表示。

🐍 きょうのコード

Python main.py
player_hp = 100
player_atk = 20

enemy_name = "スライム"
enemy_hp = 30
enemy_atk = 8

turn = 1

while player_hp > 0 and enemy_hp > 0:
    print(f"⚔ ターン{turn}")
    enemy_hp -= player_atk
    print(f"あなたの攻撃!{enemy_name}に{player_atk}ダメージ")
    print(f"敵のHP: {enemy_hp}")
    if enemy_hp <= 0:
        break
    player_hp -= enemy_atk
    print(f"{enemy_name}の攻撃!あなたに{enemy_atk}ダメージ")
    print(f"あなたのHP: {player_hp}")
    turn += 1

print()
if player_hp > 0:
    print(f"🎉 {enemy_name}を倒した!")
else:
    print(f"💀 あなたは{enemy_name}に倒された…")
▶ Trinketを開いて動かす

このページの「▶ このページで実行」でそのまま動きます。Trinketを使うときは、上のコードをコピーして左のエリアに貼り付け、Runボタン(▶)を押します。

💡 きょうのポイント

while player_hp > 0 and enemy_hp > 0: で両者生存中を表現。break で敵を倒した瞬間にループを抜けます。これがターン制バトルの王道パターン。

🎮 チャレンジ

  • もっと強い敵(HP100, ATK20)と戦って負けるパターンを作ろう
  • ターンの間に time.sleep(1) で間を空けてドラマチックに
  • 毎ターン残りHPを「█████░░░░░」のバーで表示しよう

🔁 ふりかえり

  • ターン制の戦闘は楽しい?
  • プレイヤーと敵の強さのバランス、どう取る?
  • 次回はプレイヤーが行動を選べるようにする

👨‍👩‍👧 おうちの人・先生へ

  • 準備:HPの数字を小さくして、短い時間で勝敗まで確認できるようにしてから試すと理解しやすいです。
  • つまずきポイント:ループの中での break位置。「敵を倒したら、敵の攻撃が来ないように」するため、敵HPを確認してから敵の攻撃へ進む順番が大事です。
  • 声かけ例:「ターン制は、処理の順番を決めるゲーム」と伝えると、ループと条件分岐の役割が見えやすくなります。