シェルスクリプト:タイピング速度テストゲーム
シェルスクリプトは、システム管理だけでなく、テキストベースのゲームの作成にも活用できる強力なツールです。ここでは、シェルスクリプトを使って「タイピング速度テストゲーム」を作成し、その手順と詳細な解説を行います。この演習を通じて、シェルスクリプトの基本的な構文、ユーザー入力の処理、時間計測、条件分岐、ループなどの知識を総合的に学ぶことができます。
タイピング速度テストゲームの概要
ゲームの目的
- 提示された文章をできるだけ早く正確に入力し、自分のタイピング速度を測定します。
ゲームのルール
- ゲームの進行
・プレイヤーにはランダムな文章が提示されます。
・プレイヤーはその文章をできるだけ早く正確に入力します。
・入力が完了すると、タイピング速度(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
コマンドを組み合わせて、精密な時間計測を行いました。 - 計算と文字列操作:タイピング速度や正確性の計算で、算術計算と文字列操作を行いました。
- 条件分岐とループ:今回はループは使用していませんが、条件分岐を使って正確性の判定を行いました。
シェルスクリプトは、システム管理以外にも多くの用途で活用できます。今回のタイピング速度テストゲームを基に、複数の文章でテストを行うモードを追加したり、過去の記録を保存してランキングを作成したり、難易度別に文章を分類したりして、さらなる機能拡張に挑戦してみてください。