シェルスクリプト:コインフリップゲーム

 コインフリップゲームは、プレイヤーがコインを投げて「表(Heads)」か「裏(Tails)」を当てるシンプルで楽しいゲームです。本ゲームはシェルスクリプトを使用して作成されており、Linux環境で簡単に実行できます。ここでは、コインフリップゲームの概要、スクリプトの機能、作成手順、およびゲームの実行方法について解説します。

コインフリップゲームの概要

ゲームの目的

  • プレイヤーは指定された回数だけコインを投げ、「表(H)」か「裏(T)」を当てます。
  • 正解するとスコアが加算され、最終的なスコアが表示されます。

ゲームのルール

  1. コインの投げ方
    ・プレイヤーは「表(H)」か「裏(T)」を選択します。
    ・システムがランダムにコインを投げ、結果を表示します。
  2. スコアリング
    ・正解するとスコアが1ポイント加算されます。
    ・不正解の場合はスコアの減点はありません。
  3. ゲームの終了
    ・プレイヤーが指定した回数コインを投げ終えるとゲームが終了し、最終スコアが表示されます。

ゲームの特徴

特徴説明
シンプルなルール簡単な「表」か「裏」の選択で遊べる
スコア管理正解ごとにスコアが加算され、最終的なスコアを表示
入力のバリデーションユーザーの入力を検証し、正しい選択肢のみ受け付ける

コインフリップゲームのスクリプト内容

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

スクリプト部分機能・役割
シバン行スクリプトがBashシェルで実行されることを指定
スコアの初期化スコア(score)を0に初期化
関数 get_total_flipsプレイヤーにコイン投げ回数を入力させ、正の整数であることを確認
関数 press_enterプレイヤーがエンターキーを押すまで一時停止
関数 flip_coinランダムに0または1を生成し、0なら「H」、1なら「T」を返す
関数 run_game指定された回数だけコイン投げを実行し、正誤を判定してスコアを管理
関数 show_scoreゲーム終了後に最終スコアとパーセンテージを表示し、成績に応じたメッセージを表示
スクリプトの実行get_total_flips関数を呼び出してゲームを開始し、run_game関数でゲームを実行

コインフリップゲームの作成手順

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

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

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

user01@ubuntu:~$ nano coinflip.sh

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

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

#!/bin/bash

# コインフリップゲーム

# スコアの初期化
score=0

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

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

# コインを投げる関数
flip_coin() {
    # 0または1をランダムに生成
    result=$(( RANDOM % 2 ))
    if [ $result -eq 0 ]; then
        echo "H"
    else
        echo "T"
    fi
}

# ゲームを実行する関数
run_game() {
    for ((i=1; i<=total_flips; i++)); do
        clear
        echo "=== コインフリップゲーム ==="
        echo "質問 $i/$total_flips"
        echo "表 (H) か 裏 (T) を選んでください。"
        read -p "選択肢を入力してください(H, T): " player_choice

        # 入力を大文字に変換
        player_choice=$(echo "$player_choice" | tr 'a-z' 'A-Z')

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

        # コインを投げる
        coin_result=$(flip_coin)

        # プレイヤーの選択と結果を比較
        if [[ "$player_choice" == "$coin_result" ]]; then
            echo "正解!"
            score=$((score + 1))
        else
            echo "不正解。正しい答えは $coin_result です。"
        fi

        echo ""
        press_enter
    done

    show_score
}

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

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

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

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

# ゲームの開始
get_total_flips
run_game

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

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

1.シェバン行

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

2.スコアの初期化

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

3.プレイヤーにコイン投げ回数を入力させる関数 get_total_flips

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

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

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

5.コインを投げる関数 flip_coin

flip_coin() {
    # 0または1をランダムに生成
    result=$(( RANDOM % 2 ))
    if [ $result -eq 0 ]; then
        echo "H"
    else
        echo "T"
    fi
}
  • 目的:ランダムにコインを投げ、「表(H)」か「裏(T)」の結果を返します。
  • 解説
    $RANDOM変数を使用して0または1を生成。
    ・0の場合は「H」、1の場合は「T」を返します。

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

run_game() {
    for ((i=1; i<=total_flips; i++)); do
        clear
        echo "=== コインフリップゲーム ==="
        echo "質問 $i/$total_flips"
        echo "表 (H) か 裏 (T) を選んでください。"
        read -p "選択肢を入力してください(H, T): " player_choice

        # 入力を大文字に変換
        player_choice=$(echo "$player_choice" | tr 'a-z' 'A-Z')

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

        # コインを投げる
        coin_result=$(flip_coin)

        # プレイヤーの選択と結果を比較
        if [[ "$player_choice" == "$coin_result" ]]; then
            echo "正解!"
            score=$((score + 1))
        else
            echo "不正解。正しい答えは $coin_result です。"
        fi

        echo ""
        press_enter
    done

    show_score
}
  • 目的:プレイヤーに指定された回数だけコインを投げさせ、正誤を判定してスコアを管理します。
  • 解説
    forループで指定回数だけ質問を繰り返します。
    ・各回でプレイヤーに「H」か「T」を選択させます。
    ・入力を大文字に変換し、バリデーションを行います。無効な場合は同じ質問を再度行います。
    flip_coin関数を呼び出し、コインの結果を取得。
    ・プレイヤーの選択と結果を比較し、正解ならスコアを加算、不正解なら正しい答えを表示します。
    ・各回終了後にエンターキー待ちを行います。

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

show_score() {
    clear
    echo "=== ゲーム終了 ==="
    echo "あなたのスコア: $score / $total_flips"
    echo ""

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

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

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

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

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

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

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

スクリプトを実行して、コインフリップゲームを開始します。

user01@ubuntu:~$ ./coinflip.sh

実行例

コインフリップゲームへようこそ!
何回コインを投げますか?: 3

続けて回数を入力

=== コインフリップゲーム ===
質問 1/3
表 (H) か 裏 (T) を選んでください。
選択肢を入力してください(H, T): H
不正解。正しい答えは T です。

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

次の質問に進みます

=== コインフリップゲーム ===
質問 2/3
表 (H) か 裏 (T) を選んでください。
選択肢を入力してください(H, T): T
正解!

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

最終質問後

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

パーセンテージ: 33%

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

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

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

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

user01@ubuntu:~$ rm coinflip.sh

まとめ

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

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

さらに学ぶための提案

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

  1. 連続正解ボーナス
    連続して正解した場合にボーナスポイントを加算します。
  2. ヒント機能
    プレイヤーが答えに迷ったときにヒントを提供します。
  3. 難易度の選択
    ゲームの難易度を選択できるようにし、難易度に応じてコインの結果の変化を調整します。
  4. グラフィカルな表示
    テキストの装飾や色付けを追加して、視覚的に見やすくします。tputコマンドやANSIエスケープシーケンスを使用すると便利です。
  5. スコアの保存
    ゲーム終了時にスコアをファイルに保存し、過去の成績を参照できるようにします。
  6. マルチプレイヤー対応
    複数のプレイヤーが交互にコインを投げてスコアを競うモードを追加します。

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