シェルスクリプト:ルーレットゲーム

 ルーレットゲームは、プレイヤーが賭けた数字や色に基づいて結果が決まる、運試しのシンプルでエキサイティングなゲームです。本ゲームはシェルスクリプトを使用して作成されており、Linux環境で簡単に実行できます。ここでは、ルーレットゲームの概要、スクリプトの機能、作成手順、およびゲームの実行方法について詳しく解説します。

ルーレットゲームの概要

ゲームの目的

  • プレイヤーはルーレットの数字や色に賭けます。
  • システムがランダムにルーレットの結果を生成し、プレイヤーの予想と比較します。
  • 正解するとスコアが加算され、最終的なスコアが表示されます。

ゲームのルール

  1. 賭けの種類
    ・プレイヤーは「数字(0-36)」または「色(赤/黒)」に賭けます。
  2. ルーレットの回転
    ・システムがランダムに数字と色を選択します。
  3. 結果の判定
    ・プレイヤーの賭けが結果と一致すれば正解となり、スコアが加算されます。
    ・一致しなければ不正解となります。
  4. ゲームの終了
    ・プレイヤーが指定した回数ルーレットを回転させ終えるとゲームが終了し、最終スコアが表示されます。

ゲームの特徴

特徴説明
賭けの多様性数字や色など、複数の賭けの選択肢を提供
スコア管理正解ごとにスコアが加算され、最終的なスコアを表示
入力のバリデーションユーザーの入力を検証し、正しい選択肢のみ受け付ける
エンターキー待ち機能各ラウンド後にエンターキーを押すまで一時停止し、進行を制御
再挑戦機能ゲーム終了後に再度プレイするオプションを提供

ルーレットゲームのスクリプト内容

以下の表は、roulette.shスクリプトの主要な部分とその機能をまとめたものです。

スクリプト部分機能・役割
シバン行スクリプトがBashシェルで実行されることを指定
スコアの初期化スコア(score)を0に初期化
関数 get_total_roundsプレイヤーにルーレットを回転させる回数を入力させ、正の整数であることを確認
関数 press_enterプレイヤーがエンターキーを押すまで一時停止
関数 spin_rouletteランダムに0-36の数字と色(赤/黒)を生成
関数 run_game指定された回数だけルーレットを回転させ、プレイヤーの予想と結果を比較してスコアを管理
関数 show_scoreゲーム終了後に最終スコアとパーセンテージを表示し、成績に応じたメッセージを表示
スクリプトの実行get_total_rounds関数を呼び出してゲームを開始し、run_game関数でゲームを実行

ルーレットゲームの作成手順

以下の手順に従って、ルーレットゲームをシェルスクリプトで作成し、実行します。

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

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

user01@ubuntu:~$ nano roulette.sh

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

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

#!/bin/bash

# ルーレットゲーム

# スコアの初期化
score=0

# プレイヤーにルーレットを回転させる回数を入力させる関数
get_total_rounds() {
    echo "ルーレットゲームへようこそ!"
    read -p "何回ルーレットを回転させますか?: " total_rounds
    # 入力が正の整数か確認
    if ! [[ "$total_rounds" =~ ^[1-9][0-9]*$ ]]; then
        echo "無効な入力です。正の整数を入力してください。"
        get_total_rounds
    fi
}

# エンターキー待ち
press_enter() {
    read -p "続けるにはEnterキーを押してください..."
}

# ルーレットを回転させる関数
spin_roulette() {
    # 0から36までの数字をランダムに生成
    number=$(( RANDOM % 37 ))
    
    # 色をランダムに決定(赤/黒)
    if (( number == 0 )); then
        color="緑"
    elif (( number % 2 == 0 )); then
        color="黒"
    else
        color="赤"
    fi
    
    echo "$number $color"
}

# ゲームを実行する関数
run_game() {
    for ((i=1; i<=total_rounds; i++)); do
        clear
        echo "=== ルーレットゲーム ==="
        echo "ラウンド $i/$total_rounds"
        echo "賭けを選んでください。"
        echo "1. 数字に賭ける"
        echo "2. 色に賭ける(赤/黒)"
        echo ""
        read -p "選択肢を入力してください(1, 2): " bet_type

        # 入力のバリデーション
        if [[ "$bet_type" != "1" && "$bet_type" != "2" ]]; then
            echo "無効な選択です。1か2を入力してください。"
            press_enter
            i=$((i-1)) # 同じラウンドを再度行う
            continue
        fi

        if [[ "$bet_type" == "1" ]]; then
            # 数字に賭ける場合
            read -p "賭ける数字を入力してください(0-36): " bet_number
            # 数字のバリデーション
            if ! [[ "$bet_number" =~ ^[0-9]{1,2}$ ]] || (( bet_number < 0 || bet_number > 36 )); then
                echo "無効な数字です。0から36の整数を入力してください。"
                press_enter
                i=$((i-1))
                continue
            fi
        else
            # 色に賭ける場合
            read -p "賭ける色を入力してください(赤/黒): " bet_color
            # 色のバリデーション
            if [[ "$bet_color" != "赤" && "$bet_color" != "黒" ]]; then
                echo "無効な色です。赤か黒を入力してください。"
                press_enter
                i=$((i-1))
                continue
            fi
        fi

        # ルーレットを回転させる
        result=$(spin_roulette)
        result_number=$(echo $result | awk '{print $1}')
        result_color=$(echo $result | awk '{print $2}')

        echo ""
        echo "ルーレットの結果: $result_number $result_color"
        echo ""

        # 勝敗の判定
        if [[ "$bet_type" == "1" ]]; then
            if [[ "$bet_number" == "$result_number" ]]; then
                echo "おめでとうございます!数字が一致しました。"
                score=$((score + 1))
            else
                echo "残念!数字が一致しませんでした。"
            fi
        else
            if [[ "$bet_color" == "$result_color" ]]; then
                echo "おめでとうございます!色が一致しました。"
                score=$((score + 1))
            else
                echo "残念!色が一致しませんでした。"
            fi
        fi

        echo ""
        press_enter
    done

    show_score
}

# スコアを表示する関数
show_score() {
    clear
    echo "=== ゲーム終了 ==="
    echo "あなたのスコア: $score / $total_rounds"
    echo ""

    # パーセンテージを計算
    percentage=$(( score * 100 / total_rounds ))
    echo "パーセンテージ: $percentage%"

    echo ""
    if (( percentage == 100 )); then
        echo "素晴らしい!全問正解です!"
    elif (( percentage >= 60 )); then
        echo "良い成績です!"
    else
        echo "もう少し頑張りましょう。"
    fi

    echo ""
    read -p "ゲームを終了するにはEnterキーを押してください..."
    exit 0
}

# ゲームの開始
get_total_rounds
run_game

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

以下に、作成したroulette.shスクリプトの各部分について詳しく解説します。

1.シェバン行

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

2.スコアの初期化

# スコアの初期化
score=0
  • 目的:プレイヤーのスコアを0に初期化します。

3.プレイヤーにルーレットを回転させる回数を入力させる関数 get_total_rounds

# プレイヤーにルーレットを回転させる回数を入力させる関数
get_total_rounds() {
    echo "ルーレットゲームへようこそ!"
    read -p "何回ルーレットを回転させますか?: " total_rounds
    # 入力が正の整数か確認
    if ! [[ "$total_rounds" =~ ^[1-9][0-9]*$ ]]; then
        echo "無効な入力です。正の整数を入力してください。"
        get_total_rounds
    fi
}
  • 目的:プレイヤーにルーレットを回転させる回数を入力させ、入力が正の整数であることを確認します。
  • 解説
    read -pでプレイヤーからの入力をtotal_roundsに格納。
    ・正規表現を用いて入力が1以上の整数であることをチェック。無効な場合は再度入力を促します。

4.エンターキー待ち関数 press_enter

# エンターキー待ち
press_enter() {
    read -p "続けるにはEnterキーを押してください..."
}
  • 目的:プレイヤーがエンターキーを押すまで一時停止します。
  • 解説read -pでプレイヤーの入力を待ちます。

5.ルーレットを回転させる関数 spin_roulette

# ルーレットを回転させる関数
spin_roulette() {
    # 0から36までの数字をランダムに生成
    number=$(( RANDOM % 37 ))
    
    # 色をランダムに決定(赤/黒)
    if (( number == 0 )); then
        color="緑"
    elif (( number % 2 == 0 )); then
        color="黒"
    else
        color="赤"
    fi
    
    echo "$number $color"
}
  • 目的:ルーレットをランダムに回転させ、結果の数字と色を生成します。
  • 解説
    $RANDOM変数を使用して0から36までの数字を生成。
    ・数字が0の場合は「緑」、偶数は「黒」、奇数は「赤」と色を決定。
    ・結果の数字と色をスペース区切りで出力します。

6.ゲームを実行する関数 run_game

# ゲームを実行する関数
run_game() {
    for ((i=1; i<=total_rounds; i++)); do
        clear
        echo "=== ルーレットゲーム ==="
        echo "ラウンド $i/$total_rounds"
        echo "賭けを選んでください。"
        echo "1. 数字に賭ける"
        echo "2. 色に賭ける(赤/黒)"
        echo ""
        read -p "選択肢を入力してください(1, 2): " bet_type

        # 入力のバリデーション
        if [[ "$bet_type" != "1" && "$bet_type" != "2" ]]; then
            echo "無効な選択です。1か2を入力してください。"
            press_enter
            i=$((i-1)) # 同じラウンドを再度行う
            continue
        fi

        if [[ "$bet_type" == "1" ]]; then
            # 数字に賭ける場合
            read -p "賭ける数字を入力してください(0-36): " bet_number
            # 数字のバリデーション
            if ! [[ "$bet_number" =~ ^[0-9]{1,2}$ ]] || (( bet_number < 0 || bet_number > 36 )); then
                echo "無効な数字です。0から36の整数を入力してください。"
                press_enter
                i=$((i-1))
                continue
            fi
        else
            # 色に賭ける場合
            read -p "賭ける色を入力してください(赤/黒): " bet_color
            # 色のバリデーション
            if [[ "$bet_color" != "赤" && "$bet_color" != "黒" ]]; then
                echo "無効な色です。赤か黒を入力してください。"
                press_enter
                i=$((i-1))
                continue
            fi
        fi

        # ルーレットを回転させる
        result=$(spin_roulette)
        result_number=$(echo $result | awk '{print $1}')
        result_color=$(echo $result | awk '{print $2}')

        echo ""
        echo "ルーレットの結果: $result_number $result_color"
        echo ""

        # 勝敗の判定
        if [[ "$bet_type" == "1" ]]; then
            if [[ "$bet_number" == "$result_number" ]]; then
                echo "おめでとうございます!数字が一致しました。"
                score=$((score + 1))
            else
                echo "残念!数字が一致しませんでした。"
            fi
        else
            if [[ "$bet_color" == "$result_color" ]]; then
                echo "おめでとうございます!色が一致しました。"
                score=$((score + 1))
            else
                echo "残念!色が一致しませんでした。"
            fi
        fi

        echo ""
        press_enter
    done

    show_score
}
  • 目的:指定された回数だけルーレットを回転させ、プレイヤーの賭けと結果を比較してスコアを管理します。
  • 解説
    forループで指定回数だけラウンドを繰り返します。
    ・各ラウンドでプレイヤーに賭けの種類(数字または色)を選択させます。
    ・賭けの選択に応じて、プレイヤーに数字または色の入力を促します。
    ・入力のバリデーションを行い、無効な場合は同じラウンドを再度行います。
    spin_roulette関数を呼び出してルーレットの結果を取得。
    ・プレイヤーの賭けと結果を比較し、正解ならスコアを加算、不正解なら通知します。
    ・各ラウンド終了後にエンターキー待ちを行います。
    ・全ラウンド終了後にshow_score関数を呼び出します。

7.スコアを表示する関数 show_score

# スコアを表示する関数
show_score() {
    clear
    echo "=== ゲーム終了 ==="
    echo "あなたのスコア: $score / $total_rounds"
    echo ""

    # パーセンテージを計算
    percentage=$(( score * 100 / total_rounds ))
    echo "パーセンテージ: $percentage%"

    echo ""
    if (( percentage == 100 )); then
        echo "素晴らしい!全問正解です!"
    elif (( percentage >= 60 )); then
        echo "良い成績です!"
    else
        echo "もう少し頑張りましょう。"
    fi

    echo ""
    read -p "ゲームを終了するにはEnterキーを押してください..."
    exit 0
}
# スコアを表示する関数
show_score() {
    clear
    echo "=== ゲーム終了 ==="
    echo "あなたのスコア: $score / $total_rounds"
    echo ""

    # パーセンテージを計算
    percentage=$(( score * 100 / total_rounds ))
    echo "パーセンテージ: $percentage%"

    echo ""
    if (( percentage == 100 )); then
        echo "素晴らしい!全問正解です!"
    elif (( percentage >= 60 )); then
        echo "良い成績です!"
    else
        echo "もう少し頑張りましょう。"
    fi

    echo ""
    read -p "ゲームを終了するにはEnterキーを押してください..."
    exit 0
}
  • 目的:ゲーム終了時にプレイヤーのスコアとパーセンテージを表示し、成績に応じたメッセージを提供します。
  • 解説
    ・プレイヤーのスコアと総ラウンド数を表示。
    ・パーセンテージを計算し、成績に応じたメッセージを表示します。
    ・エンターキー待ちを行い、ゲームを終了します。

8.ゲームの開始

# ゲームの開始
get_total_rounds
run_game
  • 目的:ゲームの開始プロセスを実行します。
  • 解説
    get_total_rounds関数を呼び出して、プレイヤーにルーレットを回転させる回数を入力させます。
    run_game関数を呼び出して、ゲームを実行します。

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

スクリプトを保存してエディタを終了したら、以下のコマンドでスクリプトに実行権限を付与します。

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

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

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

user01@ubuntu:~$ ./roulette.sh

実行例

ルーレットゲームへようこそ!
何回ルーレットを回転させますか?: 3

続けて回数を入力

=== ルーレットゲーム ===
ラウンド 1/3
賭けを選んでください。
1. 数字に賭ける
2. 色に賭ける(赤/黒)

選択肢を入力してください(1, 2): 1
賭ける数字を入力してください(0-36): 17

ルーレットの結果: 8 黒

残念!数字が一致しませんでした。

続けるにはEnterキーを押してください...

次のラウンドに進みます

=== ルーレットゲーム ===
ラウンド 2/3
賭けを選んでください。
1. 数字に賭ける
2. 色に賭ける(赤/黒)

選択肢を入力してください(1, 2): 2
賭ける色を入力してください(赤/黒): 赤

ルーレットの結果: 3 赤

おめでとうございます!色が一致しました。

続けるにはEnterキーを押してください...

最終ラウンド後

=== ゲーム終了 ===
あなたのスコア: 1 / 3

パーセンテージ: 33%

もう少し頑張りましょう。

ゲームを終了するにはEnterキーを押してください...

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

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

user01@ubuntu:~$ rm roulette.sh

まとめ

ルーレットゲームをシェルスクリプトで作成することで、以下のスキルを習得できます:

  • 条件分岐if文やelif文を使用して、プレイヤーの選択とゲームの結果に応じた処理を実行します。
  • ループforループを使用して、指定した回数だけルーレットを回転させます。
  • 関数の定義:コードを整理し、再利用性と可読性を高めるために、機能ごとに関数を定義しました。
  • ユーザー入力の処理readコマンドを使用して、プレイヤーからの入力を取得し、ゲームの進行に反映させました。
  • ランダム数の生成$RANDOM変数を使用してランダムなルーレットの結果を生成しました。
  • スコアリングシステムの実装:正解数に応じてスコアを加算し、最終的なスコアを表示する仕組みを構築しました。

さらに学ぶための提案

 本スクリプトは基本的なルーレットゲームを実装していますが、以下のような機能を追加することで、より複雑で面白いゲームに拡張できます。

  1. 追加の賭けオプション
    ストレート、スプリット、ストリートなど、ルーレットのさまざまな賭け方を追加します。
  2. マルチプレイヤー対応
    複数のプレイヤーが順番に賭けを行い、スコアを競うモードを追加します。
  3. 賭け金の導入
    各賭けに対して賭け金を設定し、資金管理を導入します。
  4. グラフィカルな表示
    テキストの装飾や色付けを追加して、視覚的に見やすくします。tputコマンドやANSIエスケープシーケンスを使用すると便利です。
  5. スコアの保存
    ゲーム終了時にスコアをファイルに保存し、過去の成績を参照できるようにします。
  6. 音声の追加
    echoコマンドにエスケープシーケンスを使用して、簡単な音声フィードバックを追加します。
  7. ゲームの難易度設定
    ルーレットの回転速度や結果の確率を調整し、難易度を選択できるようにします。

 これらの機能を追加することで、シェルスクリプトのスキルをさらに向上させ、より魅力的なルーレットゲームを作成することができます。シェルスクリプトはシステム管理だけでなく、ゲーム開発やその他のインタラクティブなアプリケーションの作成にも有用です。ぜひ、今回のルーレットゲームを基に、さらなる挑戦をしてみてください。