シェルスクリプト:サイモンゲーム
シェルスクリプトは、システム管理だけでなく、ゲームの作成にも活用できる強力なツールです。ここでは、シェルスクリプトを使って「サイモンゲーム」を作成し、その手順と詳細な解説を行います。この演習を通じて、シェルスクリプトの基本的な構文、配列の操作、条件分岐、ループ、ユーザー入力の処理などの知識を総合的に学ぶことができます。
サイモンゲームの概要
ゲームの目的
- 提示された色のシーケンスを覚え、同じ順番で入力します。
ゲームのルール
- ゲームの進行
・ゲームは複数のラウンドで構成されます。
・各ラウンドの開始時に、色のシーケンスが提示されます。
・シーケンスはラウンドごとに1つずつ増えていきます。
・プレイヤーは提示されたシーケンスを覚え、同じ順番で入力します。 - 勝利条件
・プレイヤーが間違えるまでゲームは続きます。
・連続して何回正解できるかを競います。
使用する色
色 | 頭文字 | 色名(英語) |
---|---|---|
赤 | R | Red |
青 | B | Blue |
緑 | G | Green |
黄 | Y | Yellow |
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
を使用してユーザーの入力を受け取り、配列に変換し、大文字に統一しました。 - 文字列操作:シーケンスの表示や比較において、文字列の操作を行いました。
シェルスクリプトは、システム管理以外にも多くの用途で活用できます。今回のサイモンゲームを基に、色の種類を増やしたり、難易度調整を行ったり、スコアを保存してランキングを作成したりして、さらなる機能拡張に挑戦してみてください。