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

Linuxコマンドの基本:シェルスクリプト:ワードスクランブルゲーム

シェルスクリプト:ワードスクランブルゲーム

 シェルスクリプトは、システム管理やタスクの自動化だけでなく、ゲームやツールの作成にも活用できます。ここでは、シェルスクリプトを使って「ワードスクランブルゲーム」を作成し、その作成から実行までの手順と解説を行います。このゲームを通じて、シェルスクリプトの基本的な構文、配列、関数、ループ、条件分岐などの知識を総合的に学ぶことができます。

ワードスクランブルゲームの概要

  • 目的:コンピューターがランダムに選んだ単語の文字をシャッフルし、ユーザーが元の単語を当てるゲームです。
  • ルール
    ・コンピューターが単語を選び、その文字をランダムに並べ替えて表示します。
    ・ユーザーはシャッフルされた文字を元に、正しい単語を入力します。
    ・正解であればスコアが加算され、最終的に正解数を表示します。

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

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

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

user01@ubuntu:~$ nano word_scramble.sh

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

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

#!/bin/bash

# 単語のリストを配列で定義
words=("computer" "linux" "shell" "script" "terminal" "network" "variable" "function" "process" "command")

# スコアの初期化
score=0

echo "ワードスクランブルゲームへようこそ!シャッフルされた文字から元の単語を当ててください。"

# ゲームのメインループ
for i in {1..5}; do
    # ランダムに単語を選択
    index=$(( RANDOM % ${#words[@]} ))
    word=${words[$index]}

    # 文字をシャッフルする関数
    shuffle_word() {
        echo "$1" | awk 'BEGIN{srand()} {split($0,a,""); n=length($0); for(i=1;i<=n;i++) idx[i]=i; for(i=n;i>=1;i--){ r=int(rand()*i)+1; temp=idx[i]; idx[i]=idx[r]; idx[r]=temp; printf "%s",a[idx[i]] } }'
    }

    scrambled_word=$(shuffle_word "$word")

    echo
    echo "問題 $i: $scrambled_word"

    read -p "あなたの答え: " user_answer

    if [ "$user_answer" == "$word" ]; then
        echo "正解です!"
        score=$((score + 1))
    else
        echo "不正解です。正しい答えは '$word' でした。"
    fi
done

echo
echo "ゲームが終了しました。あなたの正解数は $score / 5 です。"

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

1.シェバン行

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

2.単語のリストを配列で定義

words=("computer" "linux" "shell" "script" "terminal" "network" "variable" "function" "process" "command")
  • ゲームで使用する単語を words 配列に格納しています。

3.スコアの初期化

score=0
  • ユーザーの正解数をカウントするための変数を初期化しています。

4.ゲーム開始のメッセージ表示

echo "ワードスクランブルゲームへようこそ!シャッフルされた文字から元の単語を当ててください。"
  • ゲームの開始をユーザーに知らせます。

5.ゲームのメインループ

for i in {1..5}; do
    # ゲームのロジック
done
  • 5回の問題を出題するため、for ループを使用しています。

6.ランダムに単語を選択

index=$(( RANDOM % ${#words[@]} ))
word=${words[$index]}
  • ${#words[@]} で配列の要素数を取得しています。
  • $RANDOM は0から32767の整数を返す特殊な変数です。
  • % 演算子で配列のインデックス範囲内のランダムな値を取得し、そのインデックスの単語を選択します。

7.文字をシャッフルする関数の定義

shuffle_word() {
    echo "$1" | awk 'BEGIN{srand()} {split($0,a,""); n=length($0); for(i=1;i<=n;i++) idx[i]=i; for(i=n;i>=1;i--){ r=int(rand()*i)+1; temp=idx[i]; idx[i]=idx[r]; idx[r]=temp; printf "%s",a[idx[i]] } }'
}
  • shuffle_word 関数は、与えられた文字列の文字をランダムに並べ替えて返します。
  • awk コマンドを使用して、文字列の文字を分割・シャッフルしています。

8.シャッフルされた単語の取得

scrambled_word=$(shuffle_word "$word")
  • 選択した単語を関数に渡し、シャッフルされた単語を取得します。

9.問題の出題

echo
echo "問題 $i: $scrambled_word"
  • シャッフルされた単語をユーザーに提示します。

10.ユーザーからの回答を受け取る

read -p "あなたの答え: " user_answer
  • ユーザーに回答を入力してもらいます。

11.答えの判定

if [ "$user_answer" == "$word" ]; then
    echo "正解です!"
    score=$((score + 1))
else
    echo "不正解です。正しい答えは '$word' でした。"
fi
  • ユーザーの回答と正解の単語を比較し、結果を表示します。
  • 正解の場合、スコアを1加算します。

12.最終結果の表示

echo
echo "ゲームが終了しました。あなたの正解数は $score / 5 です。"
  • 全ての問題が終了した後、正解数を表示します。

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

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

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

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

スクリプトを実行して、ワードスクランブルゲームを開始します。

user01@ubuntu:~$ ./word_scramble.sh

実行例

ワードスクランブルゲームへようこそ!シャッフルされた文字から元の単語を当ててください。

問題 1: oninuftc
あなたの答え: function
正解です!

問題 2: toiunnfc
あなたの答え: function
正解です!

問題 3: tpureomc
あなたの答え: computer
正解です!

問題 4: odcanmm
あなたの答え: command
正解です!

問題 5: unxli
あなたの答え: linux
正解です!

ゲームが終了しました。あなたの正解数は 5 / 5 です

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

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

user01@ubuntu:~$ rm word_scramble.sh

まとめ

  • シェルスクリプトの活用:シェルスクリプトを使って、ワードスクランブルゲームを作成しました。これにより、シェルスクリプトの基本的な構文や機能を実践的に学ぶことができます。
  • 配列の利用:単語のリストを配列として定義し、ランダムに単語を選択する方法を学びました。
  • 関数の定義と使用:文字列をシャッフルする関数を定義し、コードの再利用性を高めました。
  • ループと条件分岐for ループや if 文を使って、繰り返し処理と条件判定を実装しました。
  • コマンドの活用awk コマンドを使って文字列の操作を行う方法を学びました。

 このように、シェルスクリプトを活用すれば、様々なツールやゲームを簡単に作成することができます。今回のゲームを基に、単語のリストを増やしたり、難易度を調整したり、自分なりのカスタマイズを加えてみてください。