【Ruby】確認問題3-☆2:丁半賭博ゲームを作ろう

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

この記事の練習問題で使用する知識:
基礎文法(レッスン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【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。
(※下記の□はコード内のインデントを表しています)

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メソッドの呼び出し

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

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

# 丁半賭博ゲーム

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文でchoice0(丁)または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までのランダムな整数を生成するメソッドで、サイコロの目を模しています。
  • dice1dice2に出目を代入し、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を活用しています。

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






    Rubyテキスト&問題集へ戻る
    トップページへ戻る