
シェルスクリプト:ルーレットゲーム
ルーレットゲームは、プレイヤーが賭けた数字や色に基づいて結果が決まる、運試しのシンプルでエキサイティングなゲームです。本ゲームはシェルスクリプトを使用して作成されており、Linux環境で簡単に実行できます。ここでは、ルーレットゲームの概要、スクリプトの機能、作成手順、およびゲームの実行方法について詳しく解説します。

ルーレットゲームの概要
ゲームの目的
- プレイヤーはルーレットの数字や色に賭けます。
- システムがランダムにルーレットの結果を生成し、プレイヤーの予想と比較します。
- 正解するとスコアが加算され、最終的なスコアが表示されます。
ゲームのルール
- 賭けの種類
・プレイヤーは「数字(0-36)」または「色(赤/黒)」に賭けます。 - ルーレットの回転
・システムがランダムに数字と色を選択します。 - 結果の判定
・プレイヤーの賭けが結果と一致すれば正解となり、スコアが加算されます。
・一致しなければ不正解となります。 - ゲームの終了
・プレイヤーが指定した回数ルーレットを回転させ終えるとゲームが終了し、最終スコアが表示されます。
ゲームの特徴
特徴 | 説明 |
---|---|
賭けの多様性 | 数字や色など、複数の賭けの選択肢を提供 |
スコア管理 | 正解ごとにスコアが加算され、最終的なスコアを表示 |
入力のバリデーション | ユーザーの入力を検証し、正しい選択肢のみ受け付ける |
エンターキー待ち機能 | 各ラウンド後にエンターキーを押すまで一時停止し、進行を制御 |
再挑戦機能 | ゲーム終了後に再度プレイするオプションを提供 |
ルーレットゲームのスクリプト内容
以下の表は、roulette.sh
スクリプトの主要な部分とその機能をまとめたものです。
スクリプト部分 | 機能・役割 |
---|---|
シバン行 | スクリプトがBashシェルで実行されることを指定 |
スコアの初期化 | スコア(score )を0に初期化 |
関数 get_total_rounds | プレイヤーにルーレットを回転させる回数を入力させ、正の整数であることを確認 |
関数 press_enter | プレイヤーがエンターキーを押すまで一時停止 |
関数 spin_roulette | ランダムに0-36の数字と色(赤/黒)を生成 |
関数 run_game | 指定された回数だけルーレットを回転させ、プレイヤーの予想と結果を比較してスコアを管理 |
関数 show_score | ゲーム終了後に最終スコアとパーセンテージを表示し、成績に応じたメッセージを表示 |
スクリプトの実行 | get_total_rounds 関数を呼び出してゲームを開始し、run_game 関数でゲームを実行 |
ルーレットゲームの作成手順
以下の手順に従って、ルーレットゲームをシェルスクリプトで作成し、実行します。
ステップ1:スクリプトファイルの作成
ターミナルで以下のコマンドを実行し、新しいスクリプトファイルroulette.sh
を作成します。
user01@ubuntu:~$ nano roulette.sh
ステップ2:スクリプトの内容を記述
エディタが開いたら、以下のコードをコピーして貼り付けます。
#!/bin/bash
# ルーレットゲーム
# スコアの初期化
score=0
# プレイヤーにルーレットを回転させる回数を入力させる関数
get_total_rounds() {
echo "ルーレットゲームへようこそ!"
read -p "何回ルーレットを回転させますか?: " total_rounds
# 入力が正の整数か確認
if ! [[ "$total_rounds" =~ ^[1-9][0-9]*$ ]]; then
echo "無効な入力です。正の整数を入力してください。"
get_total_rounds
fi
}
# エンターキー待ち
press_enter() {
read -p "続けるにはEnterキーを押してください..."
}
# ルーレットを回転させる関数
spin_roulette() {
# 0から36までの数字をランダムに生成
number=$(( RANDOM % 37 ))
# 色をランダムに決定(赤/黒)
if (( number == 0 )); then
color="緑"
elif (( number % 2 == 0 )); then
color="黒"
else
color="赤"
fi
echo "$number $color"
}
# ゲームを実行する関数
run_game() {
for ((i=1; i<=total_rounds; i++)); do
clear
echo "=== ルーレットゲーム ==="
echo "ラウンド $i/$total_rounds"
echo "賭けを選んでください。"
echo "1. 数字に賭ける"
echo "2. 色に賭ける(赤/黒)"
echo ""
read -p "選択肢を入力してください(1, 2): " bet_type
# 入力のバリデーション
if [[ "$bet_type" != "1" && "$bet_type" != "2" ]]; then
echo "無効な選択です。1か2を入力してください。"
press_enter
i=$((i-1)) # 同じラウンドを再度行う
continue
fi
if [[ "$bet_type" == "1" ]]; then
# 数字に賭ける場合
read -p "賭ける数字を入力してください(0-36): " bet_number
# 数字のバリデーション
if ! [[ "$bet_number" =~ ^[0-9]{1,2}$ ]] || (( bet_number < 0 || bet_number > 36 )); then
echo "無効な数字です。0から36の整数を入力してください。"
press_enter
i=$((i-1))
continue
fi
else
# 色に賭ける場合
read -p "賭ける色を入力してください(赤/黒): " bet_color
# 色のバリデーション
if [[ "$bet_color" != "赤" && "$bet_color" != "黒" ]]; then
echo "無効な色です。赤か黒を入力してください。"
press_enter
i=$((i-1))
continue
fi
fi
# ルーレットを回転させる
result=$(spin_roulette)
result_number=$(echo $result | awk '{print $1}')
result_color=$(echo $result | awk '{print $2}')
echo ""
echo "ルーレットの結果: $result_number $result_color"
echo ""
# 勝敗の判定
if [[ "$bet_type" == "1" ]]; then
if [[ "$bet_number" == "$result_number" ]]; then
echo "おめでとうございます!数字が一致しました。"
score=$((score + 1))
else
echo "残念!数字が一致しませんでした。"
fi
else
if [[ "$bet_color" == "$result_color" ]]; then
echo "おめでとうございます!色が一致しました。"
score=$((score + 1))
else
echo "残念!色が一致しませんでした。"
fi
fi
echo ""
press_enter
done
show_score
}
# スコアを表示する関数
show_score() {
clear
echo "=== ゲーム終了 ==="
echo "あなたのスコア: $score / $total_rounds"
echo ""
# パーセンテージを計算
percentage=$(( score * 100 / total_rounds ))
echo "パーセンテージ: $percentage%"
echo ""
if (( percentage == 100 )); then
echo "素晴らしい!全問正解です!"
elif (( percentage >= 60 )); then
echo "良い成績です!"
else
echo "もう少し頑張りましょう。"
fi
echo ""
read -p "ゲームを終了するにはEnterキーを押してください..."
exit 0
}
# ゲームの開始
get_total_rounds
run_game
ステップ3:スクリプトの内容の解説
以下に、作成したroulette.sh
スクリプトの各部分について詳しく解説します。
1.シェバン行
#!/bin/bash
- 目的:スクリプトがBashシェルで実行されることを指定します。
2.スコアの初期化
# スコアの初期化
score=0
- 目的:プレイヤーのスコアを0に初期化します。
3.プレイヤーにルーレットを回転させる回数を入力させる関数 get_total_rounds
# プレイヤーにルーレットを回転させる回数を入力させる関数
get_total_rounds() {
echo "ルーレットゲームへようこそ!"
read -p "何回ルーレットを回転させますか?: " total_rounds
# 入力が正の整数か確認
if ! [[ "$total_rounds" =~ ^[1-9][0-9]*$ ]]; then
echo "無効な入力です。正の整数を入力してください。"
get_total_rounds
fi
}
- 目的:プレイヤーにルーレットを回転させる回数を入力させ、入力が正の整数であることを確認します。
- 解説:
・read -p
でプレイヤーからの入力をtotal_rounds
に格納。
・正規表現を用いて入力が1以上の整数であることをチェック。無効な場合は再度入力を促します。
4.エンターキー待ち関数 press_enter
# エンターキー待ち
press_enter() {
read -p "続けるにはEnterキーを押してください..."
}
- 目的:プレイヤーがエンターキーを押すまで一時停止します。
- 解説:
read -p
でプレイヤーの入力を待ちます。
5.ルーレットを回転させる関数 spin_roulette
# ルーレットを回転させる関数
spin_roulette() {
# 0から36までの数字をランダムに生成
number=$(( RANDOM % 37 ))
# 色をランダムに決定(赤/黒)
if (( number == 0 )); then
color="緑"
elif (( number % 2 == 0 )); then
color="黒"
else
color="赤"
fi
echo "$number $color"
}
- 目的:ルーレットをランダムに回転させ、結果の数字と色を生成します。
- 解説:
・$RANDOM
変数を使用して0から36までの数字を生成。
・数字が0の場合は「緑」、偶数は「黒」、奇数は「赤」と色を決定。
・結果の数字と色をスペース区切りで出力します。
6.ゲームを実行する関数 run_game
# ゲームを実行する関数
run_game() {
for ((i=1; i<=total_rounds; i++)); do
clear
echo "=== ルーレットゲーム ==="
echo "ラウンド $i/$total_rounds"
echo "賭けを選んでください。"
echo "1. 数字に賭ける"
echo "2. 色に賭ける(赤/黒)"
echo ""
read -p "選択肢を入力してください(1, 2): " bet_type
# 入力のバリデーション
if [[ "$bet_type" != "1" && "$bet_type" != "2" ]]; then
echo "無効な選択です。1か2を入力してください。"
press_enter
i=$((i-1)) # 同じラウンドを再度行う
continue
fi
if [[ "$bet_type" == "1" ]]; then
# 数字に賭ける場合
read -p "賭ける数字を入力してください(0-36): " bet_number
# 数字のバリデーション
if ! [[ "$bet_number" =~ ^[0-9]{1,2}$ ]] || (( bet_number < 0 || bet_number > 36 )); then
echo "無効な数字です。0から36の整数を入力してください。"
press_enter
i=$((i-1))
continue
fi
else
# 色に賭ける場合
read -p "賭ける色を入力してください(赤/黒): " bet_color
# 色のバリデーション
if [[ "$bet_color" != "赤" && "$bet_color" != "黒" ]]; then
echo "無効な色です。赤か黒を入力してください。"
press_enter
i=$((i-1))
continue
fi
fi
# ルーレットを回転させる
result=$(spin_roulette)
result_number=$(echo $result | awk '{print $1}')
result_color=$(echo $result | awk '{print $2}')
echo ""
echo "ルーレットの結果: $result_number $result_color"
echo ""
# 勝敗の判定
if [[ "$bet_type" == "1" ]]; then
if [[ "$bet_number" == "$result_number" ]]; then
echo "おめでとうございます!数字が一致しました。"
score=$((score + 1))
else
echo "残念!数字が一致しませんでした。"
fi
else
if [[ "$bet_color" == "$result_color" ]]; then
echo "おめでとうございます!色が一致しました。"
score=$((score + 1))
else
echo "残念!色が一致しませんでした。"
fi
fi
echo ""
press_enter
done
show_score
}
- 目的:指定された回数だけルーレットを回転させ、プレイヤーの賭けと結果を比較してスコアを管理します。
- 解説:
・for
ループで指定回数だけラウンドを繰り返します。
・各ラウンドでプレイヤーに賭けの種類(数字または色)を選択させます。
・賭けの選択に応じて、プレイヤーに数字または色の入力を促します。
・入力のバリデーションを行い、無効な場合は同じラウンドを再度行います。
・spin_roulette
関数を呼び出してルーレットの結果を取得。
・プレイヤーの賭けと結果を比較し、正解ならスコアを加算、不正解なら通知します。
・各ラウンド終了後にエンターキー待ちを行います。
・全ラウンド終了後にshow_score
関数を呼び出します。
7.スコアを表示する関数 show_score
# スコアを表示する関数
show_score() {
clear
echo "=== ゲーム終了 ==="
echo "あなたのスコア: $score / $total_rounds"
echo ""
# パーセンテージを計算
percentage=$(( score * 100 / total_rounds ))
echo "パーセンテージ: $percentage%"
echo ""
if (( percentage == 100 )); then
echo "素晴らしい!全問正解です!"
elif (( percentage >= 60 )); then
echo "良い成績です!"
else
echo "もう少し頑張りましょう。"
fi
echo ""
read -p "ゲームを終了するにはEnterキーを押してください..."
exit 0
}
# スコアを表示する関数
show_score() {
clear
echo "=== ゲーム終了 ==="
echo "あなたのスコア: $score / $total_rounds"
echo ""
# パーセンテージを計算
percentage=$(( score * 100 / total_rounds ))
echo "パーセンテージ: $percentage%"
echo ""
if (( percentage == 100 )); then
echo "素晴らしい!全問正解です!"
elif (( percentage >= 60 )); then
echo "良い成績です!"
else
echo "もう少し頑張りましょう。"
fi
echo ""
read -p "ゲームを終了するにはEnterキーを押してください..."
exit 0
}
- 目的:ゲーム終了時にプレイヤーのスコアとパーセンテージを表示し、成績に応じたメッセージを提供します。
- 解説:
・プレイヤーのスコアと総ラウンド数を表示。
・パーセンテージを計算し、成績に応じたメッセージを表示します。
・エンターキー待ちを行い、ゲームを終了します。
8.ゲームの開始
# ゲームの開始
get_total_rounds
run_game
- 目的:ゲームの開始プロセスを実行します。
- 解説:
・get_total_rounds
関数を呼び出して、プレイヤーにルーレットを回転させる回数を入力させます。
・run_game
関数を呼び出して、ゲームを実行します。
ステップ4:スクリプトに実行権限を付与
スクリプトを保存してエディタを終了したら、以下のコマンドでスクリプトに実行権限を付与します。
user01@ubuntu:~$ chmod +x roulette.sh
ステップ5:スクリプトの実行
スクリプトを実行して、ルーレットゲームを開始します。
user01@ubuntu:~$ ./roulette.sh
実行例
ルーレットゲームへようこそ!
何回ルーレットを回転させますか?: 3
続けて回数を入力
=== ルーレットゲーム ===
ラウンド 1/3
賭けを選んでください。
1. 数字に賭ける
2. 色に賭ける(赤/黒)
選択肢を入力してください(1, 2): 1
賭ける数字を入力してください(0-36): 17
ルーレットの結果: 8 黒
残念!数字が一致しませんでした。
続けるにはEnterキーを押してください...
次のラウンドに進みます
=== ルーレットゲーム ===
ラウンド 2/3
賭けを選んでください。
1. 数字に賭ける
2. 色に賭ける(赤/黒)
選択肢を入力してください(1, 2): 2
賭ける色を入力してください(赤/黒): 赤
ルーレットの結果: 3 赤
おめでとうございます!色が一致しました。
続けるにはEnterキーを押してください...
最終ラウンド後
=== ゲーム終了 ===
あなたのスコア: 1 / 3
パーセンテージ: 33%
もう少し頑張りましょう。
ゲームを終了するにはEnterキーを押してください...
ここで作成したファイルの削除
ゲームのテストが終了したら、作成したroulette.sh
ファイルを削除します。
user01@ubuntu:~$ rm roulette.sh
まとめ
ルーレットゲームをシェルスクリプトで作成することで、以下のスキルを習得できます:
- 条件分岐:
if
文やelif
文を使用して、プレイヤーの選択とゲームの結果に応じた処理を実行します。 - ループ:
for
ループを使用して、指定した回数だけルーレットを回転させます。 - 関数の定義:コードを整理し、再利用性と可読性を高めるために、機能ごとに関数を定義しました。
- ユーザー入力の処理:
read
コマンドを使用して、プレイヤーからの入力を取得し、ゲームの進行に反映させました。 - ランダム数の生成:
$RANDOM
変数を使用してランダムなルーレットの結果を生成しました。 - スコアリングシステムの実装:正解数に応じてスコアを加算し、最終的なスコアを表示する仕組みを構築しました。
さらに学ぶための提案
本スクリプトは基本的なルーレットゲームを実装していますが、以下のような機能を追加することで、より複雑で面白いゲームに拡張できます。
- 追加の賭けオプション
ストレート、スプリット、ストリートなど、ルーレットのさまざまな賭け方を追加します。 - マルチプレイヤー対応
複数のプレイヤーが順番に賭けを行い、スコアを競うモードを追加します。 - 賭け金の導入
各賭けに対して賭け金を設定し、資金管理を導入します。 - グラフィカルな表示
テキストの装飾や色付けを追加して、視覚的に見やすくします。tput
コマンドやANSIエスケープシーケンスを使用すると便利です。 - スコアの保存
ゲーム終了時にスコアをファイルに保存し、過去の成績を参照できるようにします。 - 音声の追加
echo
コマンドにエスケープシーケンスを使用して、簡単な音声フィードバックを追加します。 - ゲームの難易度設定
ルーレットの回転速度や結果の確率を調整し、難易度を選択できるようにします。
これらの機能を追加することで、シェルスクリプトのスキルをさらに向上させ、より魅力的なルーレットゲームを作成することができます。シェルスクリプトはシステム管理だけでなく、ゲーム開発やその他のインタラクティブなアプリケーションの作成にも有用です。ぜひ、今回のルーレットゲームを基に、さらなる挑戦をしてみてください。