
シェルスクリプト:コインフリップゲーム
コインフリップゲームは、プレイヤーがコインを投げて「表(Heads)」か「裏(Tails)」を当てるシンプルで楽しいゲームです。本ゲームはシェルスクリプトを使用して作成されており、Linux環境で簡単に実行できます。ここでは、コインフリップゲームの概要、スクリプトの機能、作成手順、およびゲームの実行方法について解説します。

コインフリップゲームの概要
ゲームの目的
- プレイヤーは指定された回数だけコインを投げ、「表(H)」か「裏(T)」を当てます。
- 正解するとスコアが加算され、最終的なスコアが表示されます。
ゲームのルール
- コインの投げ方
・プレイヤーは「表(H)」か「裏(T)」を選択します。
・システムがランダムにコインを投げ、結果を表示します。 - スコアリング
・正解するとスコアが1ポイント加算されます。
・不正解の場合はスコアの減点はありません。 - ゲームの終了
・プレイヤーが指定した回数コインを投げ終えるとゲームが終了し、最終スコアが表示されます。
ゲームの特徴
特徴 | 説明 |
---|---|
シンプルなルール | 簡単な「表」か「裏」の選択で遊べる |
スコア管理 | 正解ごとにスコアが加算され、最終的なスコアを表示 |
入力のバリデーション | ユーザーの入力を検証し、正しい選択肢のみ受け付ける |
コインフリップゲームのスクリプト内容
以下の表は、coinflip.sh
スクリプトの主要な部分とその機能をまとめたものです。
スクリプト部分 | 機能・役割 |
---|---|
シバン行 | スクリプトがBashシェルで実行されることを指定 |
スコアの初期化 | スコア(score )を0に初期化 |
関数 get_total_flips | プレイヤーにコイン投げ回数を入力させ、正の整数であることを確認 |
関数 press_enter | プレイヤーがエンターキーを押すまで一時停止 |
関数 flip_coin | ランダムに0または1を生成し、0なら「H」、1なら「T」を返す |
関数 run_game | 指定された回数だけコイン投げを実行し、正誤を判定してスコアを管理 |
関数 show_score | ゲーム終了後に最終スコアとパーセンテージを表示し、成績に応じたメッセージを表示 |
スクリプトの実行 | get_total_flips 関数を呼び出してゲームを開始し、run_game 関数でゲームを実行 |
コインフリップゲームの作成手順
以下の手順に従って、コインフリップゲームをシェルスクリプトで作成し、実行します。
ステップ1:スクリプトファイルの作成
ターミナルで以下のコマンドを実行し、新しいスクリプトファイルcoinflip.sh
を作成します。
user01@ubuntu:~$ nano coinflip.sh
ステップ2:スクリプトの内容を記述
エディタが開いたら、以下のコードをコピーして貼り付けます。
#!/bin/bash
# コインフリップゲーム
# スコアの初期化
score=0
# プレイヤーにコイン投げ回数を入力させる関数
get_total_flips() {
echo "コインフリップゲームへようこそ!"
read -p "何回コインを投げますか?: " total_flips
# 入力が正の整数か確認
if ! [[ "$total_flips" =~ ^[1-9][0-9]*$ ]]; then
echo "無効な入力です。正の整数を入力してください。"
get_total_flips
fi
}
# エンターキー待ち
press_enter() {
read -p "続けるにはEnterキーを押してください..."
}
# コインを投げる関数
flip_coin() {
# 0または1をランダムに生成
result=$(( RANDOM % 2 ))
if [ $result -eq 0 ]; then
echo "H"
else
echo "T"
fi
}
# ゲームを実行する関数
run_game() {
for ((i=1; i<=total_flips; i++)); do
clear
echo "=== コインフリップゲーム ==="
echo "質問 $i/$total_flips"
echo "表 (H) か 裏 (T) を選んでください。"
read -p "選択肢を入力してください(H, T): " player_choice
# 入力を大文字に変換
player_choice=$(echo "$player_choice" | tr 'a-z' 'A-Z')
# 入力のバリデーション
if [[ "$player_choice" != "H" && "$player_choice" != "T" ]]; then
echo "無効な選択です。HかTを入力してください。"
press_enter
i=$((i-1)) # 同じ質問を再度行う
continue
fi
# コインを投げる
coin_result=$(flip_coin)
# プレイヤーの選択と結果を比較
if [[ "$player_choice" == "$coin_result" ]]; then
echo "正解!"
score=$((score + 1))
else
echo "不正解。正しい答えは $coin_result です。"
fi
echo ""
press_enter
done
show_score
}
# スコアを表示する関数
show_score() {
clear
echo "=== ゲーム終了 ==="
echo "あなたのスコア: $score / $total_flips"
echo ""
# パーセンテージを計算
percentage=$(( score * 100 / total_flips ))
echo "パーセンテージ: $percentage%"
echo ""
if (( percentage == 100 )); then
echo "素晴らしい!全問正解です!"
elif (( percentage >= 60 )); then
echo "良い成績です!"
else
echo "もう少し頑張りましょう。"
fi
echo ""
read -p "ゲームを終了するにはEnterキーを押してください..."
exit 0
}
# ゲームの開始
get_total_flips
run_game
ステップ3:スクリプトの内容の解説
以下に、作成したcoinflip.sh
スクリプトの各部分について詳しく解説します。
1.シェバン行
#!/bin/bash
- 目的:スクリプトがBashシェルで実行されることを指定します。
2.スコアの初期化
# スコアの初期化
score=0
- 目的:プレイヤーのスコアを0に初期化します。
3.プレイヤーにコイン投げ回数を入力させる関数 get_total_flips
get_total_flips() {
echo "コインフリップゲームへようこそ!"
read -p "何回コインを投げますか?: " total_flips
# 入力が正の整数か確認
if ! [[ "$total_flips" =~ ^[1-9][0-9]*$ ]]; then
echo "無効な入力です。正の整数を入力してください。"
get_total_flips
fi
}
- 目的:プレイヤーにコインを投げる回数を入力させ、入力が正の整数であることを確認します。
- 解説:
・read -p
でプレイヤーからの入力をtotal_flips
に格納。
・正規表現を用いて入力が1以上の整数であることをチェック。無効な場合は再度入力を促します。
4.エンターキー待ち関数 press_enter
press_enter() {
read -p "続けるにはEnterキーを押してください..."
}
- 目的:プレイヤーがエンターキーを押すまで一時停止します。
- 解説:
read -p
でプレイヤーの入力を待ちます。
5.コインを投げる関数 flip_coin
flip_coin() {
# 0または1をランダムに生成
result=$(( RANDOM % 2 ))
if [ $result -eq 0 ]; then
echo "H"
else
echo "T"
fi
}
- 目的:ランダムにコインを投げ、「表(H)」か「裏(T)」の結果を返します。
- 解説:
・$RANDOM
変数を使用して0または1を生成。
・0の場合は「H」、1の場合は「T」を返します。
6.ゲームを実行する関数 run_game
run_game() {
for ((i=1; i<=total_flips; i++)); do
clear
echo "=== コインフリップゲーム ==="
echo "質問 $i/$total_flips"
echo "表 (H) か 裏 (T) を選んでください。"
read -p "選択肢を入力してください(H, T): " player_choice
# 入力を大文字に変換
player_choice=$(echo "$player_choice" | tr 'a-z' 'A-Z')
# 入力のバリデーション
if [[ "$player_choice" != "H" && "$player_choice" != "T" ]]; then
echo "無効な選択です。HかTを入力してください。"
press_enter
i=$((i-1)) # 同じ質問を再度行う
continue
fi
# コインを投げる
coin_result=$(flip_coin)
# プレイヤーの選択と結果を比較
if [[ "$player_choice" == "$coin_result" ]]; then
echo "正解!"
score=$((score + 1))
else
echo "不正解。正しい答えは $coin_result です。"
fi
echo ""
press_enter
done
show_score
}
- 目的:プレイヤーに指定された回数だけコインを投げさせ、正誤を判定してスコアを管理します。
- 解説:
・for
ループで指定回数だけ質問を繰り返します。
・各回でプレイヤーに「H」か「T」を選択させます。
・入力を大文字に変換し、バリデーションを行います。無効な場合は同じ質問を再度行います。
・flip_coin
関数を呼び出し、コインの結果を取得。
・プレイヤーの選択と結果を比較し、正解ならスコアを加算、不正解なら正しい答えを表示します。
・各回終了後にエンターキー待ちを行います。
7.スコアを表示する関数 show_score
show_score() {
clear
echo "=== ゲーム終了 ==="
echo "あなたのスコア: $score / $total_flips"
echo ""
# パーセンテージを計算
percentage=$(( score * 100 / total_flips ))
echo "パーセンテージ: $percentage%"
echo ""
if (( percentage == 100 )); then
echo "素晴らしい!全問正解です!"
elif (( percentage >= 60 )); then
echo "良い成績です!"
else
echo "もう少し頑張りましょう。"
fi
echo ""
read -p "ゲームを終了するにはEnterキーを押してください..."
exit 0
}
- 目的:ゲーム終了時にプレイヤーのスコアとパーセンテージを表示し、成績に応じたメッセージを提供します。
- 解説:
・プレイヤーのスコアと総質問数を表示。
・パーセンテージを計算し、成績に応じたメッセージを表示します。
・エンターキー待ちを行い、ゲームを終了します。
ステップ4:スクリプトに実行権限を付与
スクリプトを保存してエディタを終了したら、以下のコマンドでスクリプトに実行権限を付与します。
user01@ubuntu:~$ chmod +x coinflip.sh
ステップ5:スクリプトの実行
スクリプトを実行して、コインフリップゲームを開始します。
user01@ubuntu:~$ ./coinflip.sh
実行例
コインフリップゲームへようこそ!
何回コインを投げますか?: 3
続けて回数を入力
=== コインフリップゲーム ===
質問 1/3
表 (H) か 裏 (T) を選んでください。
選択肢を入力してください(H, T): H
不正解。正しい答えは T です。
続けるにはEnterキーを押してください...
次の質問に進みます
=== コインフリップゲーム ===
質問 2/3
表 (H) か 裏 (T) を選んでください。
選択肢を入力してください(H, T): T
正解!
続けるにはEnterキーを押してください...
最終質問後
=== ゲーム終了 ===
あなたのスコア: 1 / 3
パーセンテージ: 33%
もう少し頑張りましょう。
ゲームを終了するにはEnterキーを押してください...
ここで作成したファイルの削除
ゲームのテストが終了したら、作成したcoinflip.sh
ファイルを削除します。
user01@ubuntu:~$ rm coinflip.sh
まとめ
コインフリップゲームをシェルスクリプトで作成することで、以下のスキルを習得できます:
- 条件分岐:
if
文やelif
文を使用して、プレイヤーの選択とゲームの結果に応じた処理を実行します。 - ループ:
for
ループを使用して、指定した回数だけコイン投げを繰り返します。 - 関数の定義:コードを整理し、再利用性と可読性を高めるために、機能ごとに関数を定義しました。
- ユーザー入力の処理:
read
コマンドを使用して、プレイヤーからの入力を取得し、ゲームの進行に反映させました。 - ランダム数の生成:
$RANDOM
変数を使用してランダムなコインの結果を生成しました。 - スコアリングシステムの実装:正解数に応じてスコアを加算し、最終的なスコアを表示する仕組みを構築しました。
さらに学ぶための提案
本スクリプトは基本的なコインフリップゲームを実装していますが、以下のような機能を追加することで、より複雑で面白いゲームに拡張できます。
- 連続正解ボーナス
連続して正解した場合にボーナスポイントを加算します。 - ヒント機能
プレイヤーが答えに迷ったときにヒントを提供します。 - 難易度の選択
ゲームの難易度を選択できるようにし、難易度に応じてコインの結果の変化を調整します。 - グラフィカルな表示
テキストの装飾や色付けを追加して、視覚的に見やすくします。tput
コマンドやANSIエスケープシーケンスを使用すると便利です。 - スコアの保存
ゲーム終了時にスコアをファイルに保存し、過去の成績を参照できるようにします。 - マルチプレイヤー対応
複数のプレイヤーが交互にコインを投げてスコアを競うモードを追加します。
これらの機能を追加することで、シェルスクリプトのスキルをさらに向上させ、より魅力的なコインフリップゲームを作成することができます。シェルスクリプトはシステム管理だけでなく、ゲーム開発やその他のインタラクティブなアプリケーションの作成にも有用です。ぜひ、今回のコインフリップゲームを基に、さらなる挑戦をしてみてください。