Ruby練習問題1-☆2:丁半賭博ゲームを作ろう

記事内に商品プロモーションを含む場合があります

Rubyの初心者向け問題1-☆2:丁半賭博ゲームを作ろう

この問題を解くために必要な知識:
【レベル1の知識】
コメントの書き方、変数と定数、基本データ型、四則演算と演算子、入力と出力、文字列操作、分岐処理(if、if~else、elsif、case)、繰り返し処理(for、while、until、each)、範囲(Range)、例外処理(begin-rescue-end)、

<<前の問題 問題集Top 次の問題>>

Ruby練習問題1-☆2:丁半賭博ゲームを作ろう

簡単な丁半賭博ゲームのプログラムを作成しましょう。

このゲームではユーザーが最初に100円を持っており、その中から掛け金を決め、出目が「丁」か「半」かを予想します。

その後でコンピュータがサイコロを2つ振り、ユーザーの予想が当たっていたかを判定します。

予想が当たっていた場合、掛け金が2倍になってユーザーに戻り、間違っていた場合は掛け金はなくなります。

この問題の要件

以下の要件に従ってコードを完成させてください。

  • ユーザーは最初に100円持っています。
  • 掛け金を決め、「丁」か「半」かを予想します。
  • コンピュータがサイコロを2つ振り、出た目の合計が偶数か奇数かを判定します。
  • ユーザーの予想が当たっていたら掛け金が2倍になって戻ります。間違っていたら掛け金はなくなります。
  • ユーザーがゲームを続けたい限り繰り返します。
  • ランダムなサイコロの目を生成するために rand メソッドを使用すること。
  • ユーザーの入力を正しく受け取るために例外処理を使用すること。

ただし、以下のような実行結果となること。

----- ↓出力される結果の例↓ -----

あなたの所持金:100円
掛け金を入力してください:
20
丁か半かを予想してください(丁:偶数、半:奇数)。
1: 丁, 2: 半
1
サイコロの目は 3 と 4 でした。合計は 7 です。
残念!予想が外れました。掛け金はなくなります。
ゲームを続けますか?(1: はい, 2: いいえ)
1
...

----- ↑出力される結果の例↑ -----

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。

1.初期設定
 1-1. money = 100でユーザーの所持金を100円に初期化

2.ゲームループの開始
 2-1. while money > 0で、所持金が0円以上の場合にゲームを繰り返すループを開始

3.プレイヤーの入力処理
 3-1. 掛け金の入力受付
  3-1-1. gets.chomp.to_iでユーザーが入力した掛け金を整数としてbetに格納
 3-2. 入力された掛け金の検証
  3-2-1. 掛け金が所持金を超えていないか、または正の数であるかをチェックするif
  3-2-2. 条件を満たさない場合、再入力を促し、nextでループの最初に戻る

4.丁半の予想と入力受付
 4-1. プレイヤーに丁(偶数)か半(奇数)を予想させ、gets.chomp.to_iで入力を取得
 4-2. 入力値が1または2でない場合、無効な入力とみなして再入力を促す

5.サイコロを振って結果を表示
 5-1. rand(1..6)を使用して、2つのサイコロの目をランダムに生成し、合計をsumに格納
 5-2. サイコロの目と合計値を表示

6.勝敗の判定
 6-1. if文で、サイコロの合計が偶数でプレイヤーの予想が「丁」か、奇数で予想が「半」であれば勝利と判定し、所持金に掛け金を加える
 6-2. 予想が外れた場合、所持金から掛け金を減らす

7.ゲームの継続確認
 7-1. ゲームを続けるかどうかをユーザーに確認し、入力が「1: はい」でない場合はゲームを終了

8.エラーハンドリング
 8-1. rescueで例外処理を行い、エラーメッセージを表示

9.ゲーム終了メッセージ
 9-1. putsで、最終所持金を表示してゲーム終了

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

# 丁半賭博ゲーム

# ユーザーの所持金を初期化
money = 100

# ゲームループ
while money > 0
  begin
    puts "あなたの所持金:#{money}円"
    puts "掛け金を入力してください:"
    bet = gets.chomp.to_i

    =begin
    【穴埋め問題1】
    ここに、掛け金が所持金を超えていないかチェックするコードを書いてください。
    =end

    puts "丁か半かを予想してください(丁:偶数、半:奇数)。"
    puts "1: 丁, 2: 半"
    prediction = gets.chomp.to_i

    if prediction != 1 && prediction != 2
      puts "無効な入力です。もう一度入力してください。"
      next
    end

    # サイコロを2つ振る
    dice1 = rand(1..6)
    dice2 = rand(1..6)
    sum = dice1 + dice2

    puts "サイコロの目は #{dice1} と #{dice2} でした。合計は #{sum} です。"

    =begin
    【穴埋め問題2】
    ここに、プレイヤーの予想とサイコロの目の合計を比較し、勝敗を判定するコードを書いてください。
    =end

    # ゲームを続けるか確認
    puts "ゲームを続けますか?(1: はい, 2: いいえ)"
    continue = gets.chomp.to_i
    break if continue != 1

  rescue StandardError => e
    puts "エラーが発生しました: #{e.message}"
  end
end

puts "ゲーム終了。あなたの最終所持金は#{money}円です。"

 

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。



解答例と解説

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

********************

# 丁半賭博ゲーム

# ユーザーの所持金を初期化
money = 100

# ゲームループ
while money > 0
  begin
    puts "あなたの所持金:#{money}円"
    puts "掛け金を入力してください:"
    bet = gets.chomp.to_i

    # 掛け金が所持金を超えていないかチェック
    if bet > money
      puts "所持金を超える掛け金は設定できません。もう一度入力してください。"
      next
    elsif bet <= 0
      puts "掛け金は正の数でなければなりません。もう一度入力してください。"
      next
    end

    puts "丁か半かを予想してください(丁:偶数、半:奇数)。"
    puts "1: 丁, 2: 半"
    prediction = gets.chomp.to_i

    if prediction != 1 && prediction != 2
      puts "無効な入力です。もう一度入力してください。"
      next
    end

    # サイコロを2つ振る
    dice1 = rand(1..6)
    dice2 = rand(1..6)
    sum = dice1 + dice2

    puts "サイコロの目は #{dice1} と #{dice2} でした。合計は #{sum} です。"

    # 勝敗の判定
    if (sum.even? && prediction == 1) || (sum.odd? && prediction == 2)
      money += bet
      puts "おめでとうございます!予想が当たりました。掛け金が2倍になって戻ります。"
    else
      money -= bet
      puts "残念!予想が外れました。掛け金はなくなります。"
    end

    # ゲームを続けるか確認
    puts "ゲームを続けますか?(1: はい, 2: いいえ)"
    continue = gets.chomp.to_i
    break if continue != 1

  rescue StandardError => e
    puts "エラーが発生しました: #{e.message}"
  end
end

puts "ゲーム終了。あなたの最終所持金は#{money}円です。"

********************

コードの解説

このRubyコードは、シンプルな「丁半賭博」ゲームをシミュレートしています。

プレイヤーはサイコロの合計が「丁(偶数)」か「半(奇数)」かを予測し、予想が当たれば所持金が増え、外れれば掛け金が減る仕組みです。

ここでは、コードをブロックごとに分けて詳しく解説します。

ユーザーの所持金を初期化

money = 100

ゲーム開始時の所持金を 100 に設定しています。この money 変数はプレイヤーの残りの所持金を管理するために使います。

ゲームループの開始

while money > 0

所持金が0円以上である限り、ゲームは続行されます。

この部分は while ループを使っており、条件が true の間(ここでは money > 0 の間)ループを繰り返します。

つまり、プレイヤーの所持金がなくなるまでゲームが続きます。

掛け金の入力

puts "掛け金を入力してください:"
bet = gets.chomp.to_i

ここではユーザーに掛け金の入力を求め、その値を bet 変数に保存しています。

gets.chomp.to_i は、ユーザーが入力した文字列を数値に変換するメソッドです。

掛け金のバリデーション

if bet > money
  puts "所持金を超える掛け金は設定できません。もう一度入力してください。"
  next
elsif bet <= 0
  puts "掛け金は正の数でなければなりません。もう一度入力してください。"
  next
end

ユーザーが掛け金を設定すると、それが有効かどうかを確認します。

もし掛け金が所持金を超えていたり、0円以下だった場合はエラーメッセージを表示して再度入力を求めます。

このような「バリデーション」は、予期しない不正な値が使われないようにするために重要です。

ユーザーの予想入力

puts "丁か半かを予想してください(丁:偶数、半:奇数)。"
puts "1: 丁, 2: 半"
prediction = gets.chomp.to_i

ここでは、ユーザーに「丁」か「半」かを予測させ、その選択を prediction 変数に保存しています。

1を選択すれば「丁」、2を選択すれば「半」となります。

サイコロを振る

dice1 = rand(1..6)
dice2 = rand(1..6)
sum = dice1 + dice2

rand(1..6) は、1から6までのランダムな数字(サイコロの目)を生成します。

2つのサイコロを振り、その合計を sum 変数に保存しています。

勝敗の判定

if (sum.even? && prediction == 1) || (sum.odd? && prediction == 2)
  money += bet
  puts "おめでとうございます!予想が当たりました。掛け金が2倍になって戻ります。"
else
  money -= bet
  puts "残念!予想が外れました。掛け金はなくなります。"
end

サイコロの合計が「偶数(丁)」なら sum.even?true になり、奇数(半)なら sum.odd?true になります。

プレイヤーの予想と一致していれば所持金が増え、外れれば所持金が減る仕組みです。

ゲームの続行確認

puts "ゲームを続けますか?(1: はい, 2: いいえ)"
continue = gets.chomp.to_i
break if continue != 1

プレイヤーにゲームを続けるか確認しています。1を入力すれば続行、その他の値ならゲームを終了します。

エラー処理

rescue StandardError => e
  puts "エラーが発生しました: #{e.message}"

万が一、入力の際に予期しないエラーが発生した場合に備えて、エラーメッセージを表示する処理を追加しています。これはプログラムの「例外処理」です。

最終メッセージの表示

puts "ゲーム終了。あなたの最終所持金は#{money}円です。"

ゲームが終了したときに、最終的な所持金を表示します。

<<前の問題 問題集Top 次の問題>>

この問題への質問・コメント

この問題を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    Ruby練習問題集へ戻る
    トップページへ戻る