シェルスクリプトでRPG風ゲームを作ってみる【後編】

だしまき
2025-06-06
2025-06-06

はじめに

最近、鼻中隔湾曲症の手術をしました!
まだ術後2週間なので完全体には程遠いですが、
呼吸が楽になる事を考えると非常に楽しみな毎日です。

どうもだしまきです。

シェルスクリプトでRPG作ってみた【前編】
前回記事の続きです!シェルスクリプトのお勉強という事で、
簡単なrpgゲームを作ってみました。今回は後半の振り返りです。

RPGを作ってみました

改めてこちらが出来上がりの物になります。

#!/bin/bash

# プレイヤーのステータス
player_hp=100
player_max_hp=100

# 敵のステータス
enemy_hp=100

echo "========================"
echo "=== バトルスタート! ==="
echo "========================"

while [ $player_hp -gt 0 ]; do
  echo
  echo "あなたのHP: $player_hp / $player_max_hp "
  echo "モンスターのHP: $enemy_hp"
  echo "1: 攻撃  2: 回復"
  read -p "→ 行動を選んでください: " action

  if [ "$action" = "1" ]; then
    damage=$((RANDOM % 41))  # 0〜40のダメージ
    echo "あなたの攻撃!モンスターに $damage ダメージ!"
    enemy_hp=$((enemy_hp - damage))
  elif [ "$action" = "2" ]; then
    heal=$((RANDOM % 31 + 10))  # 10〜40HPを回復
    player_hp=$((player_hp + heal))
    [ "$player_hp" -gt "$player_max_hp" ] && player_hp=$player_max_hp
    echo "あなたは $heal 回復した!"
  else
    echo "無効な入力"
    continue
  fi

  # モンスターが倒された際の処理
  if [ $enemy_hp -le 0 ]; then
    echo "モンスターを倒した!"
    enemy_hp=$((RANDOM % 50 + 100))  # 新しい敵
    echo "新たなモンスターが現れた!(HP: $enemy_hp)"
    continue
  fi

  # 敵の攻撃ターン
  enemy_damage=$((RANDOM % 31))  # 0〜30のダメージ
  echo "敵の攻撃!あなたに $enemy_damage ダメージ!"
  player_hp=$((player_hp - enemy_damage))

  if [ $player_hp -le 0 ]; then
    echo "あなたは倒れた… ゲームオーバー"
    break
  fi
done

前回はプレイヤーサイドの行動パターンまで振り返りましたので、
今回はその後の処理の解説です!

解説(後編)

それでは振り返っていきたいと思います。
前回プレイヤー側の行動処理まで見ましたので、
次は敵側の行動処理を書いて行きたいところなのですが
その前に確認が必要なものがあります。

  # モンスターが倒された際の処理
  if [ $enemy_hp -le 0 ]; then
    echo "モンスターを倒した!"
    enemy_hp=$((RANDOM % 50 + 100))  # 新しい敵
    echo "新たなモンスターが現れた!(HP: $enemy_hp)"
    continue
  fi

プレイヤーの攻撃で敵が倒された際の処理です!
if文で最初に敵のHPが0以下になった時の処理を記述しています。
-le は「less than or equal(以下)」を意味する比較演算子です。
敵のHPがHP0以下になった際には、倒したというメッセージの表示と新たな敵を登場させています。

新しいモンスターのHPはRANDOM % 50 で0〜49の数値をランダムに生成し+100する事で
HP(100~149)までの敵がランダムに出てくるようにしています。
ここは登場モンスターの種類を増やして、モンスターごとにHPの下限上限値を変えても面白いなと思っています。

最後にcontinueを入れて、新たなモンスターを登場させた後は以降の処理をスキップし、
プレイヤー側の行動ターンに戻すようにしています。
敵が出てきて毎回相手の行動から始まるのはなかなか理不尽なので・・・
ここも素早さ等の要素を入れて素早さの値が高い方から行動するシステムを入れてみたいですね。

という事で、敵が倒された後の処理はひとまず完了です。

ここからはプレイヤーの行動が終わった後、敵のHPが0以下になっていない時の処理です。
敵の行動処理を記述していきます。

  # 敵の攻撃ターン
  enemy_damage=$((RANDOM % 31))  # 0〜30のダメージ
  echo "敵の攻撃!あなたに $enemy_damage ダメージ!"
  player_hp=$((player_hp - enemy_damage))

RANDOM % 31で毎ターン0~30までのダメージをプレイヤーに与えるようにしています。
ここもモンスターの種類を増やして、ダメージの下限上限値等をそれぞれ設定したいのと、
攻撃だけでなく、敵側も回復等の別行動をランダムで選択するよう設定する事も面白そうです!

敵の行動が終わったのでプレイヤーの行動に戻りたいところですが・・・

  if [ $player_hp -le 0 ]; then
    echo "あなたは倒れた… ゲームオーバー"
    break
  fi

そうですプレイヤー側もHPが0以下になっていないかの確認が必要です!
記述内容としては敵側のチェックとほぼ変わらないですね。
プレイヤーのHPが0以下になっていた場合、
「あなたは倒れた...ゲームーオーバー」という文字を表示します。
最後にbreakを入れる事で、ループを強制的に終了させています。

再度開始する時は、もう一度シェルを実行してスタートですね。
これで一通りの処理が完成しました!

作ってみた感想

改めて、簡単なシェルではありましたが思ったより作るのが楽しく今後の拡張性も含めて今もワクワクしております。

モンスターの種類追加だけでなく、レベルアップ要素、他ステータスの追加、アイテムドロップ、複数マップの追加等...

やりたい事がかなり多いです、出来ることから拡張してみたいと思います!
次回も拡張したシェルの記事をお届けしたいなと思います、それでは!!