シェルスクリプト:四択クイズゲーム

 四択クイズゲームは、ユーザーに対して複数の選択肢から正しい答えを選んでもらうシンプルで楽しいゲームです。本ゲームはシェルスクリプトを使用して作成されており、Linux環境で簡単に実行できます。ここでは、四択クイズゲームの概要、作成手順、スクリプトの詳細解説、実行方法、そしてゲームファイルの削除方法について説明します。

四択クイズゲームの概要

四択クイズゲームは、以下の特徴をもちます。

  • 質問数:複数の質問を順番に出題します。
  • 選択肢:各質問には4つの選択肢(A、B、C、D)があります。
  • スコアリング:正解するとスコアが加算され、最終的なスコアが表示されます。
  • ゲーム終了:全ての質問に回答するとゲームが終了し、スコアが表示されます。

クイズの構成

以下の表は、ゲーム内で使用される質問とその選択肢、正解をまとめたものです。

質問番号質問内容選択肢正解
1日本の首都はどこですか?A. 東京 B. 大阪 C. 京都 D. 名古屋A
2太陽系で最も大きな惑星は何ですか?A. 地球 B. 火星 C. 木星 D. 金星C
3シェルスクリプトで変数を定義する際に使う記号は?A. $ B. % C. @ D. #A
4水の化学式は何ですか?A. H2O B. CO2 C. O2 D. NaClA
5人間の体で最も大きな臓器は何ですか?A. 肝臓 B. 心臓 C. 皮膚 D. 脳C

四択クイズゲームの作成手順

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

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

まず、新しいシェルスクリプトファイル4quiz.shを作成します。

user01@ubuntu:~$ nano 4quiz.sh

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

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

#!/bin/bash

# 四択クイズゲーム

# クイズの質問と回答を配列で定義
questions=(
    "日本の首都はどこですか?"
    "太陽系で最も大きな惑星は何ですか?"
    "シェルスクリプトで変数を定義する際に使う記号は?"
    "水の化学式は何ですか?"
    "人間の体で最も大きな臓器は何ですか?"
)

options=(
    "A. 東京    B. 大阪    C. 京都    D. 名古屋"
    "A. 地球    B. 火星    C. 木星    D. 金星"
    "A. $    B. %    C. @    D. #"
    "A. H2O    B. CO2    C. O2    D. NaCl"
    "A. 肝臓    B. 心臓    C. 皮膚    D. 脳"
)

# 正解の選択肢を配列で定義
answers=("A" "C" "A" "A" "C")

# スコアの初期化
score=0

# 質問数の取得
total=${#questions[@]}

# ゲームの開始メッセージ
start_game() {
    clear
    echo "=== 四択クイズゲームへようこそ! ==="
    echo "全${total}問のクイズに答えてください。"
    echo "正解するとスコアが加算されます。"
    echo ""
    press_enter
    run_quiz
}

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

# クイズを実行する関数
run_quiz() {
    for ((i=0; i<total; i++)); do
        clear
        echo "質問 $((i+1))/${total}:"
        echo "${questions[i]}"
        echo ""
        echo "${options[i]}"
        echo ""
        read -p "答えを入力してください(A, B, C, D): " user_answer

        # 入力を大文字に変換
        user_answer=$(echo "$user_answer" | tr 'a-d' 'A-D')

        # 正解かどうかをチェック
        if [[ "$user_answer" == "${answers[i]}" ]]; then
            echo "正解!"
            score=$((score + 1))
        else
            echo "不正解。正しい答えは ${answers[i]} です。"
        fi

        echo ""
        press_enter
    done

    show_score
}

# スコアを表示する関数
show_score() {
    clear
    echo "=== クイズ終了 ==="
    echo "あなたのスコア: $score / $total"
    echo ""

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

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

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

# ゲームの開始
start_game

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

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

1.シェバン行

user01@ubuntu:~$ nano quiz.sh
  • 目的:スクリプトがBashシェルで実行されることを指定します。

2.クイズの質問と選択肢の定義

# クイズの質問と回答を配列で定義
questions=(
    "日本の首都はどこですか?"
    "太陽系で最も大きな惑星は何ですか?"
    "シェルスクリプトで変数を定義する際に使う記号は?"
    "水の化学式は何ですか?"
    "人間の体で最も大きな臓器は何ですか?"
)

options=(
    "A. 東京    B. 大阪    C. 京都    D. 名古屋"
    "A. 地球    B. 火星    C. 木星    D. 金星"
    "A. $    B. %    C. @    D. #"
    "A. H2O    B. CO2    C. O2    D. NaCl"
    "A. 肝臓    B. 心臓    C. 皮膚    D. 脳"
)
  • 目的:クイズの質問とその選択肢を配列で定義します。
  • 解説
    questions配列には5つの質問が含まれています。
    options配列には各質問に対応する4つの選択肢が含まれています。

3.正解の選択肢の定義

# 正解の選択肢を配列で定義
answers=("A" "C" "A" "A" "C")
  • 目的:各質問に対する正解の選択肢を配列で定義します。
  • 解説
    ・1問目の正解は"A"?
    ・2問目の正解は"C"
    ・3問目の正解は"A"
    ・4問目の正解は"A"
    ・5問目の正解は"C"

4.スコアの初期化

# スコアの初期化
score=0
  • 目的:ユーザーのスコアを0に初期化します。

5.質問数の取得

# 質問数の取得
total=${#questions[@]}
  • 目的:クイズの総質問数を取得します。
  • 解説${#questions[@]}questions配列の要素数(質問数)を取得します。

6.ゲームの開始メッセージ関数 start_game

# ゲームの開始メッセージ
start_game() {
    clear
    echo "=== 四択クイズゲームへようこそ! ==="
    echo "全${total}問のクイズに答えてください。"
    echo "正解するとスコアが加算されます。"
    echo ""
    press_enter
    run_quiz
}
  • 目的:ゲームの導入部分を表示し、プレイヤーにゲーム開始の準備を促します。
  • 解説
    clearコマンドでターミナル画面をクリアします。
    ・ゲームのタイトルと概要を表示します。
    press_enter関数でエンターキー待ちを実装し、プレイヤーが準備できたらrun_quiz関数を呼び出します。

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

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

目的:プレイヤーがエンターキーを押すまで一時停止します。

解説readコマンドを使用して、プレイヤーの入力を待ちます。

8.クイズを実行する関数 run_quiz

# クイズを実行する関数
run_quiz() {
    for ((i=0; i<total; i++)); do
        clear
        echo "質問 $((i+1))/${total}:"
        echo "${questions[i]}"
        echo ""
        echo "${options[i]}"
        echo ""
        read -p "答えを入力してください(A, B, C, D): " user_answer

        # 入力を大文字に変換
        user_answer=$(echo "$user_answer" | tr 'a-d' 'A-D')

        # 正解かどうかをチェック
        if [[ "$user_answer" == "${answers[i]}" ]]; then
            echo "正解!"
            score=$((score + 1))
        else
            echo "不正解。正しい答えは ${answers[i]} です。"
        fi

        echo ""
        press_enter
    done

    show_score
}
  • 目的:クイズの各質問を順番に表示し、ユーザーの回答を処理します。
  • 解説
    forループを使用して、全ての質問を順番に表示します。
    ・各質問ごとに選択肢を表示し、ユーザーからの入力を受け取ります。
    ・ユーザーの入力を大文字に変換して正誤をチェックします。
    ・正解の場合はスコアを加算し、不正解の場合は正しい答えを表示します。
    ・各質問後にエンターキー待ちを行います。
    ・全ての質問が終了したらshow_score関数を呼び出します。

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

# スコアを表示する関数
show_score() {
    clear
    echo "=== クイズ終了 ==="
    echo "あなたのスコア: $score / $total"
    echo ""

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

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

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

10.ゲームの開始

# ゲームの開始
start_game
  • 目的:スクリプトの実行時にstart_game関数を呼び出し、ゲームを開始します。

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

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

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

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

スクリプトを実行して、四択クイズゲームを開始します。

user01@ubuntu:~$ ./quiz.sh

実行例

=== 四択クイズゲームへようこそ! ===
全5問のクイズに答えてください。
正解するとスコアが加算されます。

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

続けてEnterキーを押すと

質問 1/5:
日本の首都はどこですか?

A. 東京    B. 大阪    C. 京都    D. 名古屋

答えを入力してください(A, B, C, D): a
正解!

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

次の質問に進みます

質問 2/5:
太陽系で最も大きな惑星は何ですか?

A. 地球    B. 火星    C. 木星    D. 金星

答えを入力してください(A, B, C, D): c
正解!

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

全ての質問に回答後

=== クイズ終了 ===
あなたのスコア: 2 / 5

パーセンテージ: 40%

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

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

ステップ6:ここで作成したファイルの削除

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

user01@ubuntu:~$ rm 4quiz.sh

まとめ

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

  • 条件分岐if文やcase文を使用して、ユーザーの入力に応じた処理を実行します。
  • ループforループを使用して、複数の質問を順番に出題します。
  • 関数の定義:コードを整理し、再利用性を高めるために、機能ごとに関数を定義しました。
  • ユーザー入力の処理readコマンドを使用して、ユーザーからの入力を取得し、ゲームの進行に反映させました。
  • スコアリングシステムの実装:正解数に応じてスコアを加算し、最終的なスコアを表示する仕組みを構築しました。

さらに学ぶための提案

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

  1. クイズデータの外部化
    質問や選択肢、正解を外部ファイル(例:CSVファイル)に保存し、スクリプトから読み込むようにします。
  2. タイムリミットの設定
    各質問に回答するための時間制限を設け、時間内に回答しなかった場合は不正解とします。
  3. スコアの保存
    ゲーム終了時にスコアをファイルに保存し、過去の成績を参照できるようにします。
  4. 難易度の選択
    クイズの難易度を選択できるようにし、難易度に応じて質問の難易度や数を変更します。
  5. ランダムな質問の出題
    質問の順番をランダムにし、毎回異なるクイズ体験を提供します。
  6. 複数プレイヤー対応
    複数のプレイヤーが順番にクイズに回答できるようにします。
  7. 視覚的な改善
    色付けや装飾を追加して、視覚的に見やすくします。tputコマンドを使用すると便利です。

 これらの機能を追加することで、より高度で魅力的な四択クイズゲームを作成することができます。シェルスクリプトのスキルをさらに向上させるために、ぜひ挑戦してみてください。