シェルスクリプト:タイピング速度テストゲーム

 シェルスクリプトは、システム管理だけでなく、テキストベースのゲームの作成にも活用できる強力なツールです。ここでは、シェルスクリプトを使って「タイピング速度テストゲーム」を作成し、その手順と詳細な解説を行います。この演習を通じて、シェルスクリプトの基本的な構文、ユーザー入力の処理、時間計測、条件分岐、ループなどの知識を総合的に学ぶことができます。

タイピング速度テストゲームの概要

ゲームの目的

  • 提示された文章をできるだけ早く正確に入力し、自分のタイピング速度を測定します。

ゲームのルール

  • ゲームの進行
    ・プレイヤーにはランダムな文章が提示されます。
    ・プレイヤーはその文章をできるだけ早く正確に入力します。
    ・入力が完了すると、タイピング速度(WPM:Words Per Minute)が計測されます。
  • 勝利条件
    ・特に勝敗はありません。自分のタイピング速度を測定して楽しみます。

typing_game.shの作成から実行までの手順と解説

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

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

user01@ubuntu:~$ nano typing_game.sh

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

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

#!/bin/bash

# テスト用の文章リスト
texts=(
    "The quick brown fox jumps over the lazy dog."
    "She sells seashells by the seashore."
    "How can a clam cram in a clean cream can?"
    "I scream, you scream, we all scream for ice cream."
    "Six slimy snails sailed silently."
)

# ランダムな文章を選択
test_text=${texts[$RANDOM % ${#texts[@]}]}

# ゲーム開始のメッセージ
echo "=== タイピング速度テストゲームへようこそ! ==="
echo "以下の文章をできるだけ早く正確に入力してください。"
echo
echo "\"$test_text\""
echo
read -p "準備ができたらエンターキーを押してください。"

# タイマー開始
start_time=$(date +%s.%N)

# ユーザーの入力を受け取る
read -p "> " user_input

# タイマー終了
end_time=$(date +%s.%N)

# 入力時間を計算
elapsed_time=$(echo "$end_time - $start_time" | bc)

# 単語数を計算
word_count=$(echo $test_text | wc -w)

# タイピング速度(WPM)を計算
wpm=$(echo "scale=2; $word_count / ($elapsed_time / 60)" | bc)

# 正確性の判定
if [ "$user_input" == "$test_text" ]; then
    accuracy="100"
else
    # 正確な文字数を計算
    correct_chars=$(comm -12 <(echo "$test_text" | fold -w1 | sort) <(echo "$user_input" | fold -w1 | sort) | wc -l)
    total_chars=$(echo -n "$test_text" | wc -c)
    accuracy=$(echo "scale=2; ($correct_chars / $total_chars) * 100" | bc)
fi

# 結果を表示
echo
echo "結果:"
echo "タイピング時間:$elapsed_time 秒"
echo "タイピング速度:$wpm WPM"
echo "正確性:$accuracy %"

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

1.シェバン行

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

2.テスト用の文章リスト

texts=(
    "The quick brown fox jumps over the lazy dog."
    "She sells seashells by the seashore."
    "How can a clam cram in a clean cream can?"
    "I scream, you scream, we all scream for ice cream."
    "Six slimy snails sailed silently."
)
  • 目的:タイピングテストに使用する複数の文章を配列として定義します。

3.ランダムな文章を選択

test_text=${texts[$RANDOM % ${#texts[@]}]}

解説

$RANDOM を使用してランダムなインデックスを生成し、test_text に代入します。

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

echo "=== タイピング速度テストゲームへようこそ! ==="
echo "以下の文章をできるだけ早く正確に入力してください。"
echo
echo "\"$test_text\""
echo
read -p "準備ができたらエンターキーを押してください。"

解説

  • ゲームの説明とテスト文章を表示します。
  • エンターキーでタイピングを開始します。

5.タイマー開始

start_time=$(date +%s.%N)
  • 目的:現在の時刻を取得し、タイピング開始時刻として記録します。

6.ユーザーの入力を受け取る

read -p "> " user_input

解説

ユーザーがテスト文章を入力します。

7.タイマー終了と時間計算

end_time=$(date +%s.%N)
elapsed_time=$(echo "$end_time - $start_time" | bc)

解説

タイピング終了時刻を取得し、経過時間を計算します。

8.単語数とタイピング速度の計算

word_count=$(echo $test_text | wc -w)
wpm=$(echo "scale=2; $word_count / ($elapsed_time / 60)" | bc)

解説

  • テスト文章の単語数を計算します。
  • タイピング速度(WPM)を計算します。

9.正確性の判定

if [ "$user_input" == "$test_text" ]; then
    accuracy="100"
else
    # 正確な文字数を計算
    correct_chars=$(comm -12 <(echo "$test_text" | fold -w1 | sort) <(echo "$user_input" | fold -w1 | sort) | wc -l)
    total_chars=$(echo -n "$test_text" | wc -c)
    accuracy=$(echo "scale=2; ($correct_chars / $total_chars) * 100" | bc)
fi

解説

  • 入力が完全に一致すれば、正確性は100%です。
  • 一致しない場合、共通の文字数を計算して正確性を算出します。

10.結果の表示

echo
echo "結果:"
echo "タイピング時間:$elapsed_time 秒"
echo "タイピング速度:$wpm WPM"
echo "正確性:$accuracy %"

解説

タイピング時間、速度、正確性をユーザーに表示します。

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

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

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

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

スクリプトを実行して、タイピング速度テストゲームを開始します。

user01@ubuntu:~$ ./typing_game.sh

実行例

=== タイピング速度テストゲームへようこそ! ===
以下の文章をできるだけ早く正確に入力してください。

"I scream, you scream, we all scream for ice cream."

準備ができたらエンターキーを押してください。
> I scream, you scream, we all scream for ice cream.

結果:
タイピング時間:10.123456789 秒
タイピング速度:35.57 WPM
正確性:100 %

解説

  • プレイヤーは提示された文章を見て、エンターキーを押します。
  • タイマーが開始され、プレイヤーは文章を入力します。
  • 入力が完了すると、タイマーが停止し、タイピング時間が計測されます。
  • 文章の単語数と経過時間から、WPM(Words Per Minute)が計算されます。
  • 正確性が計算され、結果が表示されます。

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

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

user01@ubuntu:~$ rm typing_game.sh

まとめ

  • シェルスクリプトの応用:タイピング速度テストゲームを通じて、シェルスクリプトでのゲーム作成方法を学びました。
  • ユーザー入力の処理read コマンドを使用してユーザーの入力を受け取りました。
  • 時間の計測date コマンドと bc コマンドを組み合わせて、精密な時間計測を行いました。
  • 計算と文字列操作:タイピング速度や正確性の計算で、算術計算と文字列操作を行いました。
  • 条件分岐とループ:今回はループは使用していませんが、条件分岐を使って正確性の判定を行いました。

 シェルスクリプトは、システム管理以外にも多くの用途で活用できます。今回のタイピング速度テストゲームを基に、複数の文章でテストを行うモードを追加したり、過去の記録を保存してランキングを作成したり、難易度別に文章を分類したりして、さらなる機能拡張に挑戦してみてください。