シェルスクリプト:じゃんけんゲーム拡張版(Rock-Paper-Scissors-Lizard-Spock)
シェルスクリプトは、システム管理だけでなく、テキストベースのゲーム作成にも活用できる強力なツールです。ここでは、シェルスクリプトを使って「じゃんけんゲーム拡張版(Rock-Paper-Scissors-Lizard-Spock)」を作成し、その手順と詳細な解説を行います。このゲームは、従来のじゃんけんゲームに「リザード(トカゲ)」と「スポック」を追加したものです。この演習を通じて、シェルスクリプトの基本的な構文、条件分岐、ループ、配列、ユーザー入力の処理などの知識を総合的に学ぶことができます。
ゲームの概要
ゲームの目的
- コンピュータと対戦し、じゃんけんの拡張版で勝利を目指します。
ゲームのルール
1.手の種類
プレイヤーとコンピュータは以下の5つの手から選択します。
- Rock(グー)
- Paper(パー)
- Scissors(チョキ)
- Lizard(リザード、トカゲ)
- Spock(スポック)
2.勝敗の判定
各手の相性は以下の通りです。
手 | 勝つ相手 | 負ける相手 |
---|---|---|
Rock | Scissors(チョキ)、Lizard(リザード) | Paper(パー)、Spock(スポック) |
Paper | Rock(グー)、Spock(スポック) | Scissors(チョキ)、Lizard(リザード) |
Scissors | Paper(パー)、Lizard(リザード) | Rock(グー)、Spock(スポック) |
Lizard | Spock(スポック)、Paper(パー) | Rock(グー)、Scissors(チョキ) |
Spock | Scissors(チョキ)、Rock(グー) | Paper(パー)、Lizard(リザード) |
3.ゲームの進行
- プレイヤーは手を選択し、コンピュータもランダムに手を選択します。
- 勝敗が判定され、結果が表示されます。
rpsls.sh
の作成から実行までの手順と解説
ステップ1:スクリプトファイルの作成
ターミナルで以下のコマンドを実行し、新しいスクリプトファイル rpsls.sh
を作成します。
user01@ubuntu:~$ nano rpsls.sh
ステップ2:スクリプトの内容を記述
エディタが開いたら、以下のコードをコピーして貼り付けます。
#!/bin/bash
# 手の定義
choices=("Rock" "Paper" "Scissors" "Lizard" "Spock")
# 勝敗の組み合わせを定義
declare -A win_rules
win_rules=(
["Rock"]="Scissors Lizard"
["Paper"]="Rock Spock"
["Scissors"]="Paper Lizard"
["Lizard"]="Spock Paper"
["Spock"]="Scissors Rock"
)
# ゲーム開始のメッセージ
echo "=== じゃんけんゲーム拡張版へようこそ! ==="
echo "以下の手から選んでください:"
echo "0) Rock(グー)"
echo "1) Paper(パー)"
echo "2) Scissors(チョキ)"
echo "3) Lizard(リザード)"
echo "4) Spock(スポック)"
# プレイヤーの選択を取得
read -p "あなたの手を番号で選んでください(0〜4): " player_choice
if ! [[ "$player_choice" =~ ^[0-4]$ ]]; then
echo "無効な入力です。ゲームを終了します。"
exit 1
fi
player_hand=${choices[$player_choice]}
echo "あなたの手:$player_hand"
# コンピュータの選択
computer_choice=$((RANDOM % 5))
computer_hand=${choices[$computer_choice]}
echo "コンピュータの手:$computer_hand"
# 勝敗の判定
if [ "$player_hand" == "$computer_hand" ]; then
echo "引き分けです!"
else
if [[ ${win_rules[$player_hand]} =~ $computer_hand ]]; then
echo "あなたの勝ちです!"
else
echo "あなたの負けです!"
fi
fi
ステップ3:スクリプトの内容の解説
1.シェバン行
#!/bin/bash
- スクリプトが Bash シェルで実行されることを指定します。
2.手の定義
choices=("Rock" "Paper" "Scissors" "Lizard" "Spock")
- 目的:ゲームで使用する手を配列として定義します。
3.勝敗の組み合わせを定義
declare -A win_rules
win_rules=(
["Rock"]="Scissors Lizard"
["Paper"]="Rock Spock"
["Scissors"]="Paper Lizard"
["Lizard"]="Spock Paper"
["Spock"]="Scissors Rock"
)
解説
連想配列 win_rules
を使用して、各手が勝つ相手を定義します。
4.ゲーム開始のメッセージ
echo "=== じゃんけんゲーム拡張版へようこそ! ==="
echo "以下の手から選んでください:"
echo "0) Rock(グー)"
echo "1) Paper(パー)"
echo "2) Scissors(チョキ)"
echo "3) Lizard(リザード)"
echo "4) Spock(スポック)"
- ゲームの開始を告げ、プレイヤーに手を選んでもらいます。
5.プレイヤーの選択を取得
read -p "あなたの手を番号で選んでください(0〜4): " player_choice
if ! [[ "$player_choice" =~ ^[0-4]$ ]]; then
echo "無効な入力です。ゲームを終了します。"
exit 1
fi
player_hand=${choices[$player_choice]}
echo "あなたの手:$player_hand"
解説
- プレイヤーからの入力を取得し、入力が有効かチェックします。
- 配列
choices
からプレイヤーの選んだ手を取得します。
6.コンピュータの選択
computer_choice=$((RANDOM % 5))
computer_hand=${choices[$computer_choice]}
echo "コンピュータの手:$computer_hand"
解説
$RANDOM
を使用して0〜4のランダムな数を生成し、コンピュータの手を決定します。
7.勝敗の判定
if [ "$player_hand" == "$computer_hand" ]; then
echo "引き分けです!"
else
if [[ ${win_rules[$player_hand]} =~ $computer_hand ]]; then
echo "あなたの勝ちです!"
else
echo "あなたの負けです!"
fi
fi
解説
- プレイヤーとコンピュータの手が同じ場合は引き分け。
- それ以外の場合、
win_rules
連想配列を参照して勝敗を判定します。 =~
演算子を使用して、プレイヤーの手が勝つ相手にコンピュータの手が含まれるかをチェックします。
ステップ4:スクリプトに実行権限を付与
スクリプトを保存してエディタを終了したら、実行権限を付与します。
user01@ubuntu:~$ chmod +x rpsls.sh
ステップ5:スクリプトの実行
スクリプトを実行して、じゃんけんゲーム拡張版を開始します。
user01@ubuntu:~$ ./rpsls.sh
実行例
=== じゃんけんゲーム拡張版へようこそ! ===
以下の手から選んでください:
0) Rock(グー)
1) Paper(パー)
2) Scissors(チョキ)
3) Lizard(リザード)
4) Spock(スポック)
あなたの手を番号で選んでください(0〜4): 2
あなたの手:Scissors
コンピュータの手:Paper
あなたの勝ちです!
別の実行例
=== じゃんけんゲーム拡張版へようこそ! ===
以下の手から選んでください:
0) Rock(グー)
1) Paper(パー)
2) Scissors(チョキ)
3) Lizard(リザード)
4) Spock(スポック)
あなたの手を番号で選んでください(0〜4): 4
あなたの手:Spock
コンピュータの手:Lizard
あなたの負けです!
解説
- プレイヤーは0〜4の番号で手を選択します。
- コンピュータもランダムに手を選択します。
- 勝敗が判定され、結果が表示されます。
ここで作成したファイルの削除
ゲームのテストが終了したら、作成した rpsls.sh
ファイルを削除します。
user01@ubuntu:~$ rm rpsls.sh
まとめ
- シェルスクリプトの応用:じゃんけんゲーム拡張版を通じて、シェルスクリプトでのゲーム作成方法を学びました。
- 配列と連想配列の操作:手の一覧を配列で管理し、勝敗の組み合わせを連想配列で定義しました。
- ランダム性の導入:
$RANDOM
変数を使用して、コンピュータの手をランダムに選択しました。 - 条件分岐とパターンマッチ:
if
文や[[ ]]
を使って、ゲームのロジックを制御しました。 - ユーザー入力の処理:
read
コマンドを使用してユーザーの入力を受け取り、入力のバリデーションを行いました。
シェルスクリプトは、システム管理以外にも多くの用途で活用できます。今回のじゃんけんゲーム拡張版を基に、得点を記録して複数回プレイできるようにしたり、対戦相手を増やしたり、GUI を導入したりして、さらなる機能拡張に挑戦してみてください。