シェルスクリプト:じゃんけんゲーム拡張版(Rock-Paper-Scissors-Lizard-Spock)

 シェルスクリプトは、システム管理だけでなく、テキストベースのゲーム作成にも活用できる強力なツールです。ここでは、シェルスクリプトを使って「じゃんけんゲーム拡張版(Rock-Paper-Scissors-Lizard-Spock)」を作成し、その手順と詳細な解説を行います。このゲームは、従来のじゃんけんゲームに「リザード(トカゲ)」と「スポック」を追加したものです。この演習を通じて、シェルスクリプトの基本的な構文、条件分岐、ループ、配列、ユーザー入力の処理などの知識を総合的に学ぶことができます。

ゲームの概要

ゲームの目的

  • コンピュータと対戦し、じゃんけんの拡張版で勝利を目指します。

ゲームのルール

1.手の種類

プレイヤーとコンピュータは以下の5つの手から選択します。

  • Rock(グー)
  • Paper(パー)
  • Scissors(チョキ)
  • Lizard(リザード、トカゲ)
  • Spock(スポック)

2.勝敗の判定

各手の相性は以下の通りです。

勝つ相手負ける相手
RockScissors(チョキ)、Lizard(リザード)Paper(パー)、Spock(スポック)
PaperRock(グー)、Spock(スポック)Scissors(チョキ)、Lizard(リザード)
ScissorsPaper(パー)、Lizard(リザード)Rock(グー)、Spock(スポック)
LizardSpock(スポック)、Paper(パー)Rock(グー)、Scissors(チョキ)
SpockScissors(チョキ)、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 を導入したりして、さらなる機能拡張に挑戦してみてください。