この記事の練習問題で使用する知識:
基礎文法(レッスン1)、比較演算子と論理演算子、if文による分岐処理、while文による繰り返し処理、繰り返しの制御、メソッドの定義と呼出し、メソッドの戻り値、真偽値を返すメソッド
Rubyのゲームコード一覧はこちら
<<前のページ | Ruby記事一覧 |
次のページ>> |
確認問題:丁半賭博ゲームを作ろう
簡単な丁半賭博ゲームのプログラムを作成しましょう。
このゲームではユーザーが最初に100円を持っており、その中から掛け金を決め、出目が「丁」か「半」かを予想します。
その後でコンピュータがサイコロを2つ振り、ユーザーの予想が当たっていたかを判定します。
予想が当たっていた場合、掛け金が2倍になってユーザーに戻り、間違っていた場合は掛け金はなくなります。
この問題の要件
以下の要件に従ってコードを完成させてください。
- ユーザーは最初に100円持っています。
- 掛け金を決め、「丁」か「半」かを予想します。
- コンピュータがサイコロを2つ振り、出た目の合計が偶数か奇数かを判定します。
- ユーザーの予想が当たっていたら掛け金が2倍になって戻ります。間違っていたら掛け金はなくなります。
- ユーザーがゲームを続けたい限り繰り返します。
- ランダムなサイコロの目を生成するために
rand
メソッドを使用すること。 - ユーザーの入力を正しく受け取るために例外処理を使用すること。
ただし、以下のような実行結果となること。
----- ↓出力される結果の例↓ -----
丁半賭博ゲームを始めます! プレイヤーの所持金:1000円 いくらかけますか? ⇒ 300 丁か半か?(丁:0,半:1) ⇒ 0 サイコロの目:4, 2 ⇒ 丁 あなたの勝ち!賞金は300円 続けますか?(はい:0,いいえ:1) ⇒ 1 最終所持金は1300円でした。丁半賭博ゲームを終わります。
この問題を解くヒント
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
正解のコードは上から順に以下のような構成となっています。
(※下記の□はコード内のインデントを表しています)
1:get_betメソッドの定義
□ while文で無限ループを開始
□ □ 「いくらかけますか? ⇒ 」と出力
□ □ ユーザーの入力を整数に変換してbet変数に代入
□ □ if文でbetが0より大きく、かつmoney以下かを判定
□ □ □ 条件を満たす場合、betを返す
□ □ else
□ □ □ 「無効な入力です!所持金以内の正しい金額を入力してください。」と出力
2:get_choiceメソッドの定義
□ while文で無限ループを開始
□ □ 「丁か半か?(丁:0,半:1) ⇒ 」と出力
□ □ ユーザーの入力を整数に変換してchoice変数に代入
□ □ if文でchoiceが0または1かを判定
□ □ □ 条件を満たす場合、choiceを返す
□ □ else
□ □ □ 「無効な入力です!0か1を入力してください。」と出力
3:roll_diceメソッドの定義
□ dice1に1から6までのランダムな整数を代入
□ dice2に1から6までのランダムな整数を代入
□ dice1とdice2を返す
4:ask_continueメソッドの定義
□ while文で無限ループを開始
□ □ 「続けますか?(はい:0,いいえ:1) ⇒ 」と出力
□ □ ユーザーの入力を整数に変換してcontinue_game変数に代入
□ □ if文でcontinue_gameが0または1かを判定
□ □ □ 条件を満たす場合、continue_gameを返す
□ □ else
□ □ □ 「無効な入力です!0か1を入力してください。」と出力
5:cho_han_gameメソッドの定義
□ 「丁半賭博ゲームを始めます!」と出力
□ money変数に1000を代入
□ while文でmoneyが0より大きい間ループ
□ □ 「プレイヤーの所持金:#{money}円」と出力
□ □ get_betメソッドを呼び出し、戻り値をbetに代入
□ □ get_choiceメソッドを呼び出し、戻り値をchoiceに代入
□ □ roll_diceメソッドを呼び出し、戻り値をdice1とdice2に代入
□ □ dice1とdice2の和をdice_sumに代入
□ □ if文でdice_sumが偶数かを判定
□ □ □ 条件を満たす場合、resultに”丁”を代入
□ □ else
□ □ □ resultに”半”を代入
□ □ 「サイコロの目:#{dice1}, #{dice2} ⇒ #{result}」と出力
□ □ if文で勝敗を判定
□ □ □ 条件を満たす場合、「あなたの勝ち!賞金は#{bet}円」と出力し、moneyにbetを加算
□ □ else
□ □ □ 「あなたの負け!#{bet}円没収!」と出力し、moneyからbetを減算
□ □ break文でループ終了条件を判定し、moneyが0以下またはask_continueメソッドの戻り値が1であればループを終了
□ 「最終所持金は#{money}円でした。丁半賭博ゲームを終わります。」と出力
6:cho_han_gameメソッドの呼び出し
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
# 丁半賭博ゲーム def get_bet(money) while true print "いくらかけますか? ⇒ " =begin 【穴埋め問題1】 ここでユーザーの入力を整数に変換して変数betに代入するコードを書いてください。 =end if bet > 0 && bet <= money return bet else puts "無効な入力です!所持金以内の正しい金額を入力してください。" end end end def get_choice while true print "丁か半か?(丁:0,半:1) ⇒ " =begin 【穴埋め問題2】 ここでユーザーの入力を整数に変換して変数choiceに代入するコードを書いてください。 =end if choice == 0 || choice == 1 return choice else puts "無効な入力です!0か1を入力してください。" end end end def roll_dice =begin 【穴埋め問題3】 ここで1から6の間のランダムな整数を生成し、それぞれ変数dice1とdice2に代入するコードを書いてください。 =end return dice1, dice2 end def ask_continue while true print "続けますか?(はい:0,いいえ:1) ⇒ " =begin 【穴埋め問題4】 ここでユーザーの入力を整数に変換して変数continue_gameに代入するコードを書いてください。 =end if continue_game == 0 || continue_game == 1 return continue_game else puts "無効な入力です!0か1を入力してください。" end end end def cho_han_game puts "丁半賭博ゲームを始めます!" money = 1000 while money > 0 puts "プレイヤーの所持金:#{money}円" bet = get_bet(money) choice = get_choice dice1, dice2 = roll_dice dice_sum = dice1 + dice2 =begin 【穴埋め問題5】 ここでサイコロの目の合計が偶数か奇数かを判定し、結果を変数resultに「丁」または「半」として代入するif文を書いてください。 =end puts "サイコロの目:#{dice1}, #{dice2} ⇒ #{result}" =begin 【穴埋め問題6】 ここで勝敗を判定し、勝った場合はmoneyにbetを加算し、負けた場合はbetを減算するif文を書いてください。 =end break if money <= 0 || ask_continue == 1 end puts "最終所持金は#{money}円でした。丁半賭博ゲームを終わります。" end # ゲーム開始 cho_han_game
この問題の穴埋めコードは以上です。
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
Rubyの丁半賭博ゲームの正解コードと解説
この問題の一つの正解例とそのコードの解説を以下に示します。
正解コードの例
例えば以下のようなプログラムが考えられます。
# プレイヤーが賭ける金額を入力し、所持金の範囲内か確認するメソッド def get_bet(money) while true print "いくらかけますか? ⇒ " bet = gets.to_i if bet > 0 && bet <= money return bet else puts "無効な入力です!所持金以内の正しい金額を入力してください。" end end end # プレイヤーが「丁」または「半」を選択するメソッド def get_choice while true print "丁か半か?(丁:0,半:1) ⇒ " choice = gets.to_i if choice == 0 || choice == 1 return choice else puts "無効な入力です!0か1を入力してください。" end end end # サイコロを2つ振り、それぞれの出目を返すメソッド def roll_dice dice1 = rand(1..6) dice2 = rand(1..6) return dice1, dice2 end # ゲームを続けるか終了するかをプレイヤーに尋ねるメソッド def ask_continue while true print "続けますか?(はい:0,いいえ:1) ⇒ " continue_game = gets.to_i if continue_game == 0 || continue_game == 1 return continue_game else puts "無効な入力です!0か1を入力してください。" end end end # 丁半賭博ゲームのメインメソッド。ゲームの進行を制御し、勝敗や賞金計算を行う def cho_han_game puts "丁半賭博ゲームを始めます!" money = 1000 while money > 0 puts "プレイヤーの所持金:#{money}円" bet = get_bet(money) choice = get_choice dice1, dice2 = roll_dice dice_sum = dice1 + dice2 if dice_sum.even? result = "丁" else result = "半" end puts "サイコロの目:#{dice1}, #{dice2} ⇒ #{result}" if (dice_sum.even? && choice == 0) || (!dice_sum.even? && choice == 1) puts "あなたの勝ち!賞金は#{bet}円" money += bet else puts "あなたの負け!#{bet}円没収!" money -= bet end break if money <= 0 || ask_continue == 1 end puts "最終所持金は#{money}円でした。丁半賭博ゲームを終わります。" end # ゲーム開始 cho_han_game
正解コードの解説
今回のRubyコードは「丁半賭博」というシンプルな賭博ゲームを実装したものです。
サイコロの目の合計が「丁(偶数)」か「半(奇数)」かを予想して賭け、所持金を増やしたり減らしたりします。
以下に各部分について解説していきます。
get_bet
メソッド
def get_bet(money) while true print "いくらかけますか? ⇒ " bet = gets.to_i if bet > 0 && bet <= money return bet else puts "無効な入力です!所持金以内の正しい金額を入力してください。" end end end
get_bet
メソッドは賭ける金額をプレイヤーに入力させます。print
メソッドで賭け金の入力を求め、gets.to_i
で入力された文字列を整数に変換してbet
に格納します。if
文を使ってbet
が1以上かつmoney
以下であればbet
を返します。条件に合わない場合、エラーメッセージを表示して再入力を求めます。while true
ループにより正しい入力がされるまで繰り返されます。
get_choice
メソッド
def get_choice while true print "丁か半か?(丁:0,半:1) ⇒ " choice = gets.to_i if choice == 0 || choice == 1 return choice else puts "無効な入力です!0か1を入力してください。" end end end
get_choice
メソッドはプレイヤーに「丁」または「半」の選択を求めます。print
でメッセージを表示しgets.to_i
で整数に変換した入力をchoice
に代入します。if
文でchoice
が0
(丁)または1
(半)であればその値を返し、不正な入力にはエラーメッセージを表示して再入力させます。
roll_dice
メソッド
def roll_dice dice1 = rand(1..6) dice2 = rand(1..6) return dice1, dice2 end
roll_dice
メソッドはサイコロを2回振って、それぞれの出目を返します。rand(1..6)
は1から6までのランダムな整数を生成するメソッドで、サイコロの目を模しています。dice1
とdice2
に出目を代入し、2つの値を返します。
ask_continue
メソッド
def ask_continue while true print "続けますか?(はい:0,いいえ:1) ⇒ " continue_game = gets.to_i if continue_game == 0 || continue_game == 1 return continue_game else puts "無効な入力です!0か1を入力してください。" end end end
ask_continue
メソッドはゲームを続けるかどうかをプレイヤーに尋ねます。print
でメッセージを表示しgets.to_i
で入力された値を整数としてcontinue_game
に代入します。if
文で0
(はい)または1
(いいえ)ならその値を返します。それ以外の場合は再度入力を促します。
cho_han_game
メソッド
def cho_han_game puts "丁半賭博ゲームを始めます!" money = 1000 while money > 0 puts "プレイヤーの所持金:#{money}円" bet = get_bet(money) choice = get_choice dice1, dice2 = roll_dice dice_sum = dice1 + dice2 result = dice_sum.even? ? "丁" : "半" puts "サイコロの目:#{dice1}, #{dice2} ⇒ #{result}" if (dice_sum.even? && choice == 0) || (!dice_sum.even? && choice == 1) puts "あなたの勝ち!賞金は#{bet}円" money += bet else puts "あなたの負け!#{bet}円没収!" money -= bet end break if money <= 0 || ask_continue == 1 end puts "最終所持金は#{money}円でした。丁半賭博ゲームを終わります。" end
cho_han_game
はゲームのメインメソッドです。ゲームの進行と勝敗判定を管理します。money
変数を1000
で初期化し、プレイヤーの所持金を設定します。while money > 0
のループでゲームを繰り返し、get_bet
で賭け金、get_choice
で選択を取得します。roll_dice
でサイコロを振り、合計値を計算しdice_sum
に代入します。- 三項演算子
result = dice_sum.even? ? "丁" : "半"
を使い、合計が偶数なら「丁」、奇数なら「半」と表示します。 - 勝敗を判定し、勝てば賭け金を増やし、負ければ減らします。
- 所持金がなくなるか、
ask_continue
で「いいえ」を選択するとゲームを終了します。
まとめ
このプログラムではサイコロの出目と条件分岐を使って簡単な賭博ゲームを実装しています。
このコードを通してRubyの基本的な文法を学ぶことができます。
コードを少しずつ変えて、自分なりにアレンジしてみるとさらに理解が深まるでしょう。
Rubyのゲームコード一覧はこちら
<<前のページ |
Ruby記事一覧 |
次のページ>> |
この問題への質問・コメント
この問題を作成するにあたりAIを活用しています。
問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。