シェルスクリプト:サイモンゲーム

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

サイモンゲームの概要

ゲームの目的

  • 提示された色のシーケンスを覚え、同じ順番で入力します。

ゲームのルール

  • ゲームの進行
    ・ゲームは複数のラウンドで構成されます。
    ・各ラウンドの開始時に、色のシーケンスが提示されます。
    ・シーケンスはラウンドごとに1つずつ増えていきます。
    ・プレイヤーは提示されたシーケンスを覚え、同じ順番で入力します。
  • 勝利条件
    ・プレイヤーが間違えるまでゲームは続きます。
    ・連続して何回正解できるかを競います。

使用する色

頭文字色名(英語)
RRed
BBlue
GGreen
YYellow

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

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

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

user01@ubuntu:~$ nano simon_game.sh
user01@ubuntu:~$ nano simon_game.sh

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

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

#!/bin/bash

# 使用する色の定義
colors=("R" "B" "G" "Y")
color_names=("Red" "Blue" "Green" "Yellow")

# ゲーム開始のメッセージ
echo "=== サイモンゲームへようこそ! ==="
echo "提示された色のシーケンスを覚え、同じ順番で入力してください。"
echo "色の頭文字を使用します:R(赤)、B(青)、G(緑)、Y(黄)"

# シーケンスを保持する配列
sequence=()

# スコアの初期化
score=0

# メインループ
while true; do
    # 新しい色をシーケンスに追加
    new_color=${colors[$RANDOM % ${#colors[@]}]}
    sequence+=("$new_color")
    
    # シーケンスを表示
    echo
    echo "シーケンス:"
    for color in "${sequence[@]}"; do
        case "$color" in
            "R") echo -n "赤 " ;;
            "B") echo -n "青 " ;;
            "G") echo -n "緑 " ;;
            "Y") echo -n "黄 " ;;
        esac
        sleep 0.5
    done
    echo
    sleep 1

    # シーケンスを隠すために画面をクリア
    clear

    # プレイヤーの入力を受け取る
    echo "シーケンスを入力してください(例:R B G):"
    read -p "> " user_input

    # 入力を配列に変換し、大文字に変換
    IFS=' ' read -r -a user_sequence <<< "$user_input"
    for i in "${!user_sequence[@]}"; do
        user_sequence[$i]=${user_sequence[$i]^^}
    done

    # シーケンスの比較
    correct=true
    for i in "${!sequence[@]}"; do
        if [ "${sequence[$i]}" != "${user_sequence[$i]}" ]; then
            correct=false
            break
        fi
    done

    if [ "$correct" = true ]; then
        echo "正解です!"
        score=$((score + 1))
    else
        echo "不正解です。ゲームオーバー。"
        echo "あなたのスコア:$score"
        exit
    fi
done

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

1.シェバン行

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

2.使用する色の定義

colors=("R" "B" "G" "Y")
color_names=("Red" "Blue" "Green" "Yellow")
  • 目的:ゲームで使用する色を配列として定義します。

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

echo "=== サイモンゲームへようこそ! ==="
echo "提示された色のシーケンスを覚え、同じ順番で入力してください。"
echo "色の頭文字を使用します:R(赤)、B(青)、G(緑)、Y(黄)"
  • ゲームの開始を告げ、ルールを説明します。

4.シーケンスとスコアの初期化

sequence=()
score=0
  • 目的:提示する色のシーケンスを保持する配列と、プレイヤーのスコアを初期化します。

5.メインループ

while true; do
    # 省略
done
  • ゲームが終了するまで繰り返します。

6.シーケンスに新しい色を追加

new_color=${colors[$RANDOM % ${#colors[@]}]}
sequence+=("$new_color")
  • 解説$RANDOM を使用してランダムな色を選択し、sequence 配列に追加します。

7.シーケンスを表示

echo
echo "シーケンス:"
for color in "${sequence[@]}"; do
    case "$color" in
        "R") echo -n "赤 " ;;
        "B") echo -n "青 " ;;
        "G") echo -n "緑 " ;;
        "Y") echo -n "黄 " ;;
    esac
    sleep 0.5
done
echo
sleep 1
  • 解説sequence 配列をループし、各色を日本語で表示します。

8.シーケンスを隠す

clear
  • 目的:シーケンスを隠すために画面をクリアします。

9.プレイヤーの入力を受け取る

echo "シーケンスを入力してください(例:R B G):"
read -p "> " user_input
  • 解説:プレイヤーにシーケンスを入力してもらいます。

10.入力を配列に変換し、大文字に変換

IFS=' ' read -r -a user_sequence <<< "$user_input"
for i in "${!user_sequence[@]}"; do
    user_sequence[$i]=${user_sequence[$i]^^}
done
  • 解説:入力された文字列をスペースで区切り、user_sequence 配列に格納し、全て大文字に変換します。これにより、小文字で入力された場合でも正しく判定できます。

11. シーケンスの比較

correct=true
for i in "${!sequence[@]}"; do
    if [ "${sequence[$i]}" != "${user_sequence[$i]}" ]; then
        correct=false
        break
    fi
done

if [ "$correct" = true ]; then
    echo "正解です!"
    score=$((score + 1))
else
    echo "不正解です。ゲームオーバー。"
    echo "あなたのスコア:$score"
    exit
fi
  • 解説sequence 配列と user_sequence 配列を比較し、一致するかを判定します。

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

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

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

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

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

user01@ubuntu:~$ ./simon_game.sh

実行例

=== サイモンゲームへようこそ! ===
提示された色のシーケンスを覚え、同じ順番で入力してください。
色の頭文字を使用します:R(赤)、B(青)、G(緑)、Y(黄)

シーケンス:
赤 

シーケンスを入力してください(例:R B G):
> r
正解です!

シーケンス:
赤 青 

シーケンスを入力してください(例:R B G):
> r b
正解です!

シーケンス:
赤 青 緑 

シーケンスを入力してください(例:R B G):
> R b g
正解です!

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

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

user01@ubuntu:~$ rm simon_game.sh

まとめ

  • シェルスクリプトの応用:サイモンゲームを通じて、シェルスクリプトでのゲーム作成方法を学びました。
  • 配列の操作:提示するシーケンスやプレイヤーの入力を配列で管理し、効率的にデータを扱いました。
  • ランダム性の導入$RANDOM 変数を使用して、シーケンスにランダムな色を追加しました。
  • 条件分岐とループif 文や while ループを使って、ゲームの進行とロジックを制御しました。
  • ユーザー入力の処理read コマンドと IFS を使用してユーザーの入力を受け取り、配列に変換し、大文字に統一しました。
  • 文字列操作:シーケンスの表示や比較において、文字列の操作を行いました。

 シェルスクリプトは、システム管理以外にも多くの用途で活用できます。今回のサイモンゲームを基に、色の種類を増やしたり、難易度調整を行ったり、スコアを保存してランキングを作成したりして、さらなる機能拡張に挑戦してみてください。