【Python入門】RPGのバトルシステムを作ってみよう!

IT関連

はじめに

Pythonを学び始めたばかりの方でも、簡単なゲームを作ってみたいと思ったことはありませんか?今回は、Pythonを使ってシンプルなRPGのバトルシステムを作成します。

この記事でわかること

  • randomモジュールを使ったランダム要素の実装
  • ターン制の処理

🎯 今回作成するコードのざっくりとした流れ

  1. バトルシステムの概要
  2. 必要なPythonの基礎知識
  3. コードの全体像
  4. コードの詳細解説
  5. 実行してみよう!

1. バトルシステムの概要

  • 今回作成するバトルシステムは、以下の要件を満たします。
  • HPが0になった時点で勝敗を表示。
  • プレイヤーとモンスターが1対1で戦う。
  • それぞれのHP(体力)と攻撃力を設定。
  • 攻撃のダメージは乱数で決定。
  • 先攻後攻はランダムで決定。

2. 必要なPythonの基礎知識

以下のPythonの基礎知識を使います。

  • 入力input()関数でユーザーからの入力を受け取る。
  • 変数: データを保存するための箱。
  • 条件分岐if文を使って条件に応じた処理を行う。
  • ループwhile文を使って繰り返し処理を行う。
  • 乱数randomモジュールを使ってランダムな値を生成する。

3. コードの全体像

以下が完成版のコードです。次のセクションで詳しく解説します。

import random

# プレイヤーとモンスターの初期設定
player_hp = 100
monster_hp = 100
player_min_damage = 10
player_max_damage = 20
monster_min_damage = 5
monster_max_damage = 15

# 先攻後攻をランダムで決定
turn = random.choice(["player", "monster"])
print(f"バトル開始!先攻は {turn} です。")

# バトルループ
while player_hp > 0 and monster_hp > 0:
    input("次のターンに進むにはEnterキーを押してください...")
    
    if turn == "player":
        # プレイヤーの攻撃
        damage = random.randint(player_min_damage, player_max_damage)
        monster_hp -= damage
        print(f"プレイヤーの攻撃!モンスターに {damage} のダメージ!")
        print(f"モンスターの残りHP: {max(monster_hp, 0)}")
        turn = "monster"  # 次はモンスターのターン
    else:
        # モンスターの攻撃
        damage = random.randint(monster_min_damage, monster_max_damage)
        player_hp -= damage
        print(f"モンスターの攻撃!プレイヤーに {damage} のダメージ!")
        print(f"プレイヤーの残りHP: {max(player_hp, 0)}")
        turn = "player"  # 次はプレイヤーのターン

# 勝敗の判定
if player_hp <= 0:
    print("プレイヤーは敗北しました...")
elif monster_hp <= 0:
    print("モンスターを倒しました!勝利です!")

4. コードの詳細解説

4.1 プレイヤーとモンスターの初期設定

player_hp = 100
monster_hp = 100
player_min_damage = 10
player_max_damage = 20
monster_min_damage = 5
monster_max_damage = 15
  • HP: プレイヤーとモンスターの体力を100に設定。
  • 攻撃力: ダメージは乱数で決定され、プレイヤーは10~20、モンスターは5~15の範囲。

4.2 先攻後攻の決定

turn = random.choice(["player", "monster"])
print(f"バトル開始!先攻は {turn} です。")
  • 先攻がランダムで決まることで、ゲーム性が向上します。
  • random.choice: リストからランダムに1つ選択します。

4.3 バトルループ

while player_hp > 0 and monster_hp > 0:
    input("次のターンに進むにはEnterキーを押してください...")
  • whileループ: プレイヤーまたはモンスターのHPが0になるまで繰り返します。
  • input関数: ユーザーがEnterキーを押すことで次のターンに進みます。

4.4 攻撃の処理

if turn == "player":
    damage = random.randint(player_min_damage, player_max_damage)
    monster_hp -= damage
    print(f"プレイヤーの攻撃!モンスターに {damage} のダメージ!")
    turn = "monster"
  • random.randint: 指定した範囲内の乱数を生成します。
  • ダメージを計算し、相手のHPを減らします。

4.5 勝敗の判定

if player_hp <= 0:
    print("プレイヤーは敗北しました...")
elif monster_hp <= 0:
    print("モンスターを倒しました!勝利です!")
  • HPが0以下になった時点で勝敗を表示します。

5. 実行してみよう!

上記のコードを実行してみます。
先攻はplayerになりました。

Enterを押下してターンを進めてみます。
与えたダメージ、残りのHPの表示ができていますね。

引き続きターンを進めてみます。

無事勝利することができました。

アップデート:HPの常時表示

今回実装したい機能は問題なく完成しました。
しかし、HPの表示がないため、少しわかりにくいです。
そこで、各ターンでプレイヤーとモンスターのHPを常に表示するようにアップデートしてみましょう。

追加したコードはこちらです。
while文の中に追加します。

print(f"\nプレイヤーのHP: {player.hp} | モンスターのHP: {monster.hp}")

それでは実行してみます。

HPの常時表示に成功しました!
これでターンごとの状況がわかりやすくなりました。

コメント

PAGE TOP
タイトルとURLをコピーしました