シェルスクリプト:テキストアドベンチャーゲーム

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

テキストアドベンチャーゲームの概要

ゲームの目的

  • プレイヤーは謎のダンジョンを探索し、宝物を見つけて脱出します。

ゲームのルール

  • ゲームの進行
    ・プレイヤーはさまざまな部屋を移動しながら、アイテムを収集したり、謎を解いたりします。
    ・部屋ごとに選択肢が提示され、プレイヤーはその中から行動を選びます。
  • 勝利条件
    ・宝物を見つけ、無事にダンジョンから脱出するとゲームクリアです。

ゲームの流れ

  • プレイヤーは最初の部屋で目覚めます。
  • 各部屋で行動を選択し、次の部屋へ進みます。
  • 特定のアイテムを集めたり、謎を解いたりしてゲームを進めます。

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

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

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

user01@ubuntu:~$ nano adventure.sh

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

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

#!/bin/bash

# プレイヤーの状態を初期化
has_key=false
has_treasure=false

# ゲームの開始
start_game() {
    echo "あなたは暗い部屋で目を覚ましました。出口を見つけて脱出してください。"
    room1
}

# 部屋1の処理
room1() {
    echo
    echo "部屋1:暗い石の部屋です。扉が一つあります。"
    echo "1. 扉を開けて進む"
    echo "2. 部屋を調べる"
    read -p "選択肢を入力してください(1または2): " choice
    case "$choice" in
        1) room2 ;;
        2)
            echo "部屋を調べると、古い鍵を見つけました。"
            has_key=true
            room1 ;;
        *)
            echo "無効な入力です。"
            room1 ;;
    esac
}

# 部屋2の処理
room2() {
    echo
    echo "部屋2:広いホールです。二つの扉があります。"
    echo "1. 左の扉を進む"
    echo "2. 右の扉を進む"
    read -p "選択肢を入力してください(1または2): " choice
    case "$choice" in
        1) room3 ;;
        2) room4 ;;
        *)
            echo "無効な入力です。"
            room2 ;;
    esac
}

# 部屋3の処理
room3() {
    echo
    echo "部屋3:宝物庫です。大きな宝箱があります。"
    if [ "$has_key" = true ]; then
        echo "鍵を使って宝箱を開けました。宝物を手に入れました!"
        has_treasure=true
    else
        echo "宝箱は固く閉ざされています。鍵が必要なようです。"
    fi
    echo "1. 戻る"
    read -p "選択肢を入力してください(1): " choice
    case "$choice" in
        1) room2 ;;
        *)
            echo "無効な入力です。"
            room3 ;;
    esac
}

# 部屋4の処理
room4() {
    echo
    echo "部屋4:出口への通路です。扉があります。"
    if [ "$has_treasure" = true ]; then
        echo "宝物を持って脱出しました!おめでとうございます!"
        exit
    else
        echo "何か大切なものを忘れている気がします。"
        echo "1. 戻る"
        read -p "選択肢を入力してください(1): " choice
        case "$choice" in
            1) room2 ;;
            *)
                echo "無効な入力です。"
                room4 ;;
        esac
    fi
}

# ゲーム開始
start_game

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

1.シェバン行

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

2.プレイヤーの状態を初期化

# プレイヤーの状態を初期化
has_key=false
has_treasure=false
  • 目的:プレイヤーが特定のアイテム(鍵や宝物)を持っているかどうかを管理します。

3.ゲームの開始関数 start_game

start_game() {
    echo "あなたは暗い部屋で目を覚ましました。出口を見つけて脱出してください。"
    room1
}
  • 目的:ゲームの冒頭メッセージを表示し、最初の部屋へ進みます。

4.部屋1の処理関数 room1

room1() {
    echo
    echo "部屋1:暗い石の部屋です。扉が一つあります。"
    echo "1. 扉を開けて進む"
    echo "2. 部屋を調べる"
    read -p "選択肢を入力してください(1または2): " choice
    case "$choice" in
        1) room2 ;;
        2)
            echo "部屋を調べると、古い鍵を見つけました。"
            has_key=true
            room1 ;;
        *)
            echo "無効な入力です。"
            room1 ;;
    esac
}
  • 目的:プレイヤーに行動の選択肢を提示し、その選択に応じて次の処理を行います。
  • 解説
    • case 文でプレイヤーの選択を処理します。
    • 鍵を見つけた場合、has_keytrue に設定します。

5.部屋2の処理関数 room2

room2() {
    echo
    echo "部屋2:広いホールです。二つの扉があります。"
    echo "1. 左の扉を進む"
    echo "2. 右の扉を進む"
    read -p "選択肢を入力してください(1または2): " choice
    case "$choice" in
        1) room3 ;;
        2) room4 ;;
        *)
            echo "無効な入力です。"
            room2 ;;
    esac
}
  • 目的:プレイヤーに次の行動を選択させ、部屋3または部屋4へ進みます。

6.部屋3の処理関数 room3

room3() {
    echo
    echo "部屋3:宝物庫です。大きな宝箱があります。"
    if [ "$has_key" = true ]; then
        echo "鍵を使って宝箱を開けました。宝物を手に入れました!"
        has_treasure=true
    else
        echo "宝箱は固く閉ざされています。鍵が必要なようです。"
    fi
    echo "1. 戻る"
    read -p "選択肢を入力してください(1): " choice
    case "$choice" in
        1) room2 ;;
        *)
            echo "無効な入力です。"
            room3 ;;
    esac
}
  • 目的:宝物を手に入れるための部屋です。
  • 解説
    ・プレイヤーが鍵を持っている場合、宝物を取得できます。
    has_treasuretrue に設定します。

7.部屋4の処理関数 room4

room4() {
    echo
    echo "部屋4:出口への通路です。扉があります。"
    if [ "$has_treasure" = true ]; then
        echo "宝物を持って脱出しました!おめでとうございます!"
        exit
    else
        echo "何か大切なものを忘れている気がします。"
        echo "1. 戻る"
        read -p "選択肢を入力してください(1): " choice
        case "$choice" in
            1) room2 ;;
            *)
                echo "無効な入力です。"
                room4 ;;
        esac
    fi
}
  • 目的:ゲームのゴール地点です。
  • 解説
    ・宝物を持っている場合、ゲームクリアとなります。
    ・持っていない場合、戻る選択肢を提示します。

8.ゲームの開始

# ゲーム開始
start_game

解説

start_game 関数を呼び出してゲームを開始します。

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

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

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

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

スクリプトを実行して、テキストアドベンチャーゲームを開始します。

user01@ubuntu:~$ ./adventure.sh

実行例

あなたは暗い部屋で目を覚ましました。出口を見つけて脱出してください。

部屋1:暗い石の部屋です。扉が一つあります。
1. 扉を開けて進む
2. 部屋を調べる
選択肢を入力してください(1または2): 2
部屋を調べると、古い鍵を見つけました。

部屋1:暗い石の部屋です。扉が一つあります。
1. 扉を開けて進む
2. 部屋を調べる
選択肢を入力してください(1または2): 1

部屋2:広いホールです。二つの扉があります。
1. 左の扉を進む
2. 右の扉を進む
選択肢を入力してください(1または2): 1

部屋3:宝物庫です。大きな宝箱があります。
鍵を使って宝箱を開けました。宝物を手に入れました!
1. 戻る
選択肢を入力してください(1): 1

部屋2:広いホールです。二つの扉があります。
1. 左の扉を進む
2. 右の扉を進む
選択肢を入力してください(1または2): 2

部屋4:出口への通路です。扉があります。
宝物を持って脱出しました!おめでとうございます!

解説

  • プレイヤーは最初に部屋を調べ、鍵を入手します。
  • 次に、部屋2で左の扉を選択し、宝物庫で宝物を入手します。
  • 部屋2に戻り、右の扉を選択して出口に向かいます。
  • 宝物を持っているため、ゲームクリアとなります。

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

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

user01@ubuntu:~$ rm adventure.sh

まとめ

  • シェルスクリプトの応用:テキストアドベンチャーゲームを通じて、シェルスクリプトでのゲーム作成方法を学びました。
  • 関数の定義と利用:各部屋を関数として定義し、コードの可読性と再利用性を向上させました。
  • 条件分岐とループif 文や case 文を使って、ゲームの進行とロジックを制御しました。
  • ユーザー入力の処理read コマンドを使用してユーザーの入力を受け取りました。
  • 変数の活用:プレイヤーの状態を変数で管理し、ゲーム内の状態変化を追跡しました。

 シェルスクリプトは、システム管理以外にも多くの用途で活用できます。今回のテキストアドベンチャーゲームを基に、物語の拡張や新たな選択肢の追加、ランダムなイベントの導入など、さらなる機能拡張に挑戦してみてください。