シェルスクリプト:簡易RPGバトルゲーム

 シェルスクリプトは、システム管理だけでなく、テキストベースのゲーム作成にも活用できる強力なツールです。ここでは、シェルスクリプトを使って「簡易RPGバトルゲーム」を作成し、その手順と詳細な解説を行います。この演習を通じて、シェルスクリプトの基本的な構文、関数の定義と利用、条件分岐、ループ、ユーザー入力の処理などの知識を総合的に学ぶことができます。

簡易RPGバトルゲームの概要

ゲームの目的

  • プレイヤーは敵と戦い、勝利を目指します。

ゲームのルール

  • ゲームの進行
    ・プレイヤーと敵キャラクターの両方にHP(体力)があります。
    ・プレイヤーは以下の行動を選択できます。
     ・攻撃:敵にダメージを与えます。
     ・防御:次のターンの敵からのダメージを軽減します。
     ・回復:自分のHPを回復します。
    ・敵はランダムな行動を取ります。
  • 勝利条件
    ・敵のHPを0にすると勝利。
    ・プレイヤーのHPが0になると敗北。

ゲームの流れ

  • プレイヤーと敵のHPを初期化します。
  • プレイヤーのターンで行動を選択します。
  • 敵のターンではランダムな行動を行います。
  • これを繰り返し、どちらかのHPが0になるとゲーム終了です。

rpg_battle.shの作成から実行までの手順と解説

ステップ1:スクリプトファイルの作成

ターミナルで以下のコマンドを実行し、新しいスクリプトファイル rpg_battle.sh を作成します。

user01@ubuntu:~$ nano rpg_battle.sh

ステップ2:スクリプトの内容を記述

エディタが開いたら、以下のコードをコピーして貼り付けます。

#!/bin/bash

# プレイヤーと敵のステータスを初期化
player_hp=100
enemy_hp=80
player_defense=false

# ゲーム開始のメッセージ
echo "=== RPGバトルゲームへようこそ! ==="
echo "あなたは敵と戦わなければなりません。"

# メインループ
while true; do
    echo
    echo "あなたのHP: $player_hp"
    echo "敵のHP: $enemy_hp"
    echo "1. 攻撃"
    echo "2. 防御"
    echo "3. 回復"
    read -p "行動を選択してください(1〜3): " choice

    case "$choice" in
        1)
            # 攻撃
            damage=$((RANDOM % 20 + 10))
            echo "あなたは敵に $damage のダメージを与えた!"
            enemy_hp=$((enemy_hp - damage))
            if [ $enemy_hp -le 0 ]; then
                echo "敵を倒しました!あなたの勝利です!"
                exit
            fi
            ;;
        2)
            # 防御
            echo "あなたは防御の体勢をとった!次の敵の攻撃を軽減します。"
            player_defense=true
            ;;
        3)
            # 回復
            heal=$((RANDOM % 15 + 10))
            player_hp=$((player_hp + heal))
            if [ $player_hp -gt 100 ]; then
                player_hp=100
            fi
            echo "あなたは $heal 回復した!現在のHP: $player_hp"
            ;;
        *)
            echo "無効な入力です。もう一度選択してください。"
            continue
            ;;
    esac

    # 敵のターン
    echo
    echo "敵のターン!"
    enemy_action=$((RANDOM % 2 + 1))
    case "$enemy_action" in
        1)
            # 敵の攻撃
            damage=$((RANDOM % 15 + 5))
            if [ "$player_defense" = true ]; then
                damage=$((damage / 2))
                player_defense=false
                echo "敵の攻撃!しかしあなたは防御している。ダメージが半減された!"
            else
                echo "敵の攻撃!"
            fi
            echo "あなたは $damage のダメージを受けた!"
            player_hp=$((player_hp - damage))
            if [ $player_hp -le 0 ]; then
                echo "あなたは倒れてしまった...ゲームオーバー。"
                exit
            fi
            ;;
        2)
            # 敵の回復
            heal=$((RANDOM % 10 + 5))
            enemy_hp=$((enemy_hp + heal))
            if [ $enemy_hp -gt 80 ]; then
                enemy_hp=80
            fi
            echo "敵は $heal 回復した!敵のHP: $enemy_hp"
            ;;
    esac
done

ステップ3:スクリプトの内容の解説

1.シェバン行

#!/bin/bash
  • スクリプトが Bash シェルで実行されることを指定します。

2.プレイヤーと敵のステータスを初期化

player_hp=100
enemy_hp=80
player_defense=false
  • 目的:プレイヤーと敵のHPを設定し、防御状態を管理する変数を初期化します。

3.ゲーム開始のメッセージ

echo "=== RPGバトルゲームへようこそ! ==="
echo "あなたは敵と戦わなければなりません。"
  • ゲーム開始の挨拶を表示します。

4.メインループ

while true; do
    # 省略
done
  • 目的:ゲームが終了するまで繰り返されるループです。

5.プレイヤーのターン

echo
echo "あなたのHP: $player_hp"
echo "敵のHP: $enemy_hp"
echo "1. 攻撃"
echo "2. 防御"
echo "3. 回復"
read -p "行動を選択してください(1〜3): " choice

解説

  • プレイヤーのHPと敵のHPを表示します。
  • プレイヤーに行動の選択肢を提示します。

6.プレイヤーの行動処理

case "$choice" in
    1)
        # 攻撃
        damage=$((RANDOM % 20 + 10))
        echo "あなたは敵に $damage のダメージを与えた!"
        enemy_hp=$((enemy_hp - damage))
        if [ $enemy_hp -le 0 ]; then
            echo "敵を倒しました!あなたの勝利です!"
            exit
        fi
        ;;
    2)
        # 防御
        echo "あなたは防御の体勢をとった!次の敵の攻撃を軽減します。"
        player_defense=true
        ;;
    3)
        # 回復
        heal=$((RANDOM % 15 + 10))
        player_hp=$((player_hp + heal))
        if [ $player_hp -gt 100 ]; then
            player_hp=100
        fi
        echo "あなたは $heal 回復した!現在のHP: $player_hp"
        ;;
    *)
        echo "無効な入力です。もう一度選択してください。"
        continue
        ;;
esac

解説

case 文でプレイヤーの選択した行動を処理します。

  • 攻撃
    ・ランダムなダメージを計算し、敵のHPを減らします。
    ・敵のHPが0以下になったら勝利です。
  • 防御
    ・防御状態を true に設定します。
  • 回復
    ・ランダムな量を回復し、最大HPを超えないようにします。

7.敵のターン

echo
echo "敵のターン!"
enemy_action=$((RANDOM % 2 + 1))
case "$enemy_action" in
    1)
        # 敵の攻撃
        damage=$((RANDOM % 15 + 5))
        if [ "$player_defense" = true ]; then
            damage=$((damage / 2))
            player_defense=false
            echo "敵の攻撃!しかしあなたは防御している。ダメージが半減された!"
        else
            echo "敵の攻撃!"
        fi
        echo "あなたは $damage のダメージを受けた!"
        player_hp=$((player_hp - damage))
        if [ $player_hp -le 0 ]; then
            echo "あなたは倒れてしまった...ゲームオーバー。"
            exit
        fi
        ;;
    2)
        # 敵の回復
        heal=$((RANDOM % 10 + 5))
        enemy_hp=$((enemy_hp + heal))
        if [ $enemy_hp -gt 80 ]; then
            enemy_hp=80
        fi
        echo "敵は $heal 回復した!敵のHP: $enemy_hp"
        ;;
esac

解説

敵の行動をランダムに決定します。

  • 攻撃
    ・ランダムなダメージを計算し、プレイヤーのHPを減らします。
    ・プレイヤーが防御している場合、ダメージを半減します。
    ・プレイヤーのHPが0以下になったら敗北です。
  • 回復
    ・敵がランダムな量を回復し、最大HPを超えないようにします。

ステップ4:スクリプトに実行権限を付与

スクリプトを保存してエディタを終了したら、実行権限を付与します。

user01@ubuntu:~$ chmod +x rpg_battle.sh

ステップ5:スクリプトの実行

スクリプトを実行して、RPGバトルゲームを開始します。

user01@ubuntu:~$ ./rpg_battle.sh

実行例

=== RPGバトルゲームへようこそ! ===
あなたは敵と戦わなければなりません。

あなたのHP: 100
敵のHP: 80
1. 攻撃
2. 防御
3. 回復
行動を選択してください(1〜3): 1
あなたは敵に 24 のダメージを与えた!

敵のターン!
敵の攻撃!
あなたは 17 のダメージを受けた!

あなたのHP: 83
敵のHP: 56
1. 攻撃
2. 防御
3. 回復
行動を選択してください(1〜3): 2
あなたは防御の体勢をとった!次の敵の攻撃を軽減します。

敵のターン!
敵の攻撃!しかしあなたは防御している。ダメージが半減された!
あなたは 7 のダメージを受けた!

あなたのHP: 76
敵のHP: 56
1. 攻撃
2. 防御
3. 回復
行動を選択してください(1〜3): 1
あなたは敵に 19 のダメージを与えた!

敵のターン!
敵は 13 回復した!敵のHP: 50

(中略)

敵を倒しました!あなたの勝利です!

解説

  • プレイヤーと敵が交互に行動します。
  • プレイヤーは行動を選択し、その結果に応じて敵のHPが減少します。
  • 敵はランダムに攻撃または回復を行います。
  • 敵のHPが0以下になるとプレイヤーの勝利、プレイヤーのHPが0以下になるとゲームオーバーです。

ここで作成したファイルの削除

ゲームのテストが終了したら、作成した rpg_battle.sh ファイルを削除します。

user01@ubuntu:~$ rm rpg_battle.sh

まとめ

  • シェルスクリプトの応用:簡易RPGバトルゲームを通じて、シェルスクリプトでのゲーム作成方法を学びました。
  • 変数の活用:プレイヤーと敵のステータスを変数で管理し、ゲーム内の状態変化を追跡しました。
  • ランダム性の導入$RANDOM 変数を使用して、攻撃や回復の値にランダム性を持たせました。
  • 条件分岐とループif 文や case 文、while ループを使って、ゲームの進行とロジックを制御しました。
  • ユーザー入力の処理read コマンドを使用してユーザーの入力を受け取りました。
  • 関数の定義と利用:今回は関数を使用していませんが、ゲームを拡張する際には関数を活用することでコードの再利用性を高めることができます。

 シェルスクリプトは、システム管理以外にも多くの用途で活用できます。今回の簡易RPGバトルゲームを基に、敵の種類を増やしたり、アイテムやスキルの要素を追加したりして、さらなる機能拡張に挑戦してみてください。