はじめに
Pythonを学び始めたばかりの方でも、簡単なゲームを作ってみたいと思ったことはありませんか?今回は、Pythonを使ってシンプルなRPGのバトルシステムを作成します。
この記事でわかること
- randomモジュールを使ったランダム要素の実装
- ターン制の処理
🎯 今回作成するコードのざっくりとした流れ
- バトルシステムの概要
- 必要なPythonの基礎知識
- コードの全体像
- コードの詳細解説
- 実行してみよう!
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の常時表示に成功しました!
これでターンごとの状況がわかりやすくなりました。

コメント