このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Linuxコマンドの基本:シェルスクリプト:数字当てゲーム

シェルスクリプト:数字当てゲーム

 シェルスクリプトは、システム管理だけでなく、ちょっとしたゲームやツールを作成する際にも非常に有用です。ここでは、シェルスクリプトを使って「数字当てゲーム」を作成し、その作成から実行までの手順と解説を行います。

数字当てゲームの概要

  • 目的:コンピュータが1から100の間でランダムに選んだ数字をユーザーが当てるゲーム。
  • ルール
    ・ユーザーは数字を予想して入力します。
    ・コンピュータは予想した数字が正解より大きいか小さいかをヒントとして返します。
    ・正解すると試行回数と共にお祝いメッセージが表示されます。

スクリプトの作成と実行手順

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

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

user01@ubuntu:~$ nano number_guess.sh

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

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

#!/bin/bash

# 1から100までのランダムな数を生成
target=$(( RANDOM % 100 + 1 ))
attempts=0

echo "数字当てゲームへようこそ!1から100の数字を当ててください。"

while true; do
    read -p "あなたの予想を入力してください: " guess

    # 入力が数字かどうかをチェック
    if ! [[ "$guess" =~ ^[0-9]+$ ]]; then
        echo "エラー: 数字を入力してください。"
        continue
    fi

    attempts=$((attempts + 1))

    if [ "$guess" -lt "$target" ]; then
        echo "もっと大きい数字です。"
    elif [ "$guess" -gt "$target" ]; then
        echo "もっと小さい数字です。"
    else
        echo "正解です!${attempts}回目の試行で当てました。おめでとうございます!"
        break
    fi
done

スクリプトの解説

シェバン行

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

#!/bin/bash

ランダムな数の生成

  • target=$(( RANDOM % 100 + 1 )) は1から100の間のランダムな整数を生成します。
  • $RANDOM は0から32767までの整数を返します。
  • % 100 で0から99の範囲にし、+ 1 で1から100の範囲に調整します。
# 1から100までのランダムな数を生成
target=$(( RANDOM % 100 + 1 ))

試行回数の初期化

attempts=0 でユーザーの試行回数をカウントする変数を初期化します。

attempts=0

ゲーム開始メッセージ

 echo "数字当てゲームへようこそ!1から100の数字を当ててください。" でユーザーにゲームの開始を知らせます。

echo "数字当てゲームへようこそ!1から100の数字を当ててください。"

無限ループの開始

while true; do ... done でユーザーが正解するまでループを続けます。

while true; do
    # ゲームのロジック
done

ユーザーからの入力受付

read -p "あなたの予想を入力してください: " guess でユーザーの入力を受け取ります。

read -p "あなたの予想を入力してください: " guess

入力のバリデーション

  • if ! [[ "$guess" =~ ^[0-9]+$ ]]; then で入力が数字のみで構成されているかをチェックします。
  • ^ は行の先頭、[0-9]+ は1つ以上の数字、$ は行の終端を示します。
  • 数字でない場合、エラーメッセージを表示し、continue でループの先頭に戻ります。
if ! [[ "$guess" =~ ^[0-9]+$ ]]; then
    echo "エラー: 数字を入力してください。"
    continue
fi

試行回数の更新

attempts=$((attempts + 1)) で試行回数を1増やします。

attempts=$((attempts + 1))

予想と正解の比較

  • if [ "$guess" -lt "$target" ]; then ... で入力が正解より小さいかを判定します。
  • 小さい場合は「もっと大きい数字です。」と表示。
  • 大きい場合は「もっと小さい数字です。」と表示。
  • 正解の場合は「正解です!」のメッセージを表示し、break でループを抜けます。
if [ "$guess" -lt "$target" ]; then
    echo "もっと大きい数字です。"
elif [ "$guess" -gt "$target" ]; then
    echo "もっと小さい数字です。"
else
    echo "正解です!${attempts}回目の試行で当てました。おめでとうございます!"
    break
fi

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

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

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

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

スクリプトを実行してゲームを開始します。

user01@ubuntu:~$ ./number_guess.sh

実行例

数字当てゲームへようこそ!1から100の数字を当ててください。
あなたの予想を入力してください: 50
もっと小さい数字です。
あなたの予想を入力してください: 25
もっと大きい数字です。
あなたの予想を入力してください: 37
もっと小さい数字です。
あなたの予想を入力してください: 31
もっと大きい数字です。
あなたの予想を入力してください: 34
正解です!5回目の試行で当てました。おめでとうございます!

解説

  • ユーザーは数字を入力し、コンピュータはそれに応じたヒントを返します。
  • 正解すると試行回数と共にお祝いのメッセージが表示されます。

ステップ5:エラーハンドリングの確認

 数字以外を入力した場合の動作を確認します。数字以外の入力があった場合、エラーメッセージを表示し、再度入力を促します。

user01@ubuntu:~$ ./number_guess.sh
数字当てゲームへようこそ!1から100の数字を当ててください。
あなたの予想を入力してください: abc
エラー: 数字を入力してください。
あなたの予想を入力してください: 

ステップ6:作成したファイルを削除します

演習が終了したら、作成した number_guess.sh を削除します。

user01@ubuntu:~$ rm number_guess.sh

まとめ

  • シェルスクリプトの活用:シェルスクリプトを使って簡単なゲームを作成することで、スクリプトの基本構文や制御構造を学ぶことができます。
  • 制御構造の理解if 文や while ループを使用して、条件分岐や繰り返し処理を実装しました。
  • 入力のバリデーション:ユーザーからの入力を正規表現で検証し、エラーハンドリングを行いました。
  • ランダムな数の生成$RANDOM 変数を使用して、ランダムな数を生成しました。

 このように、シェルスクリプトを使えばちょっとしたゲームやツールを簡単に作成できます。ぜひ今回の内容を参考に、自分なりの機能を追加してみてください。