Ruby練習問題3-☆3:トランプをランダムに配ろう

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

Rubyの初心者向け問題3-☆3:トランプをランダムに配ろう

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

【レベル3の知識】
メソッドの定義と呼び出し、メソッドの戻り値、クラスの定義と使用、コンストラクタ、クラスの継承、モジュールの定義と使用、ミックスイン

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

Ruby練習問題3-☆3:トランプをランダムに配ろう

トランプをランダムに配るプログラムを作成しましょう。

52枚のトランプのデッキをシャッフルし、プレイヤーに5枚のカードを配ります。

モジュールとミックスインを使用して、シャッフル機能を実装しましょう。

この問題の要件

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

  • 52枚のトランプのデッキを作成すること。
  • トランプのデッキをシャッフルすること。
  • プレイヤーに5枚のカードを配ること。
  • モジュールを使ってシャッフル機能をミックスインすること。

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

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

あなたに配られたカード: ♥5, ♠10, ♦K, ♣3, ♠J
ゲームを続けますか?(続けるにはエンターキーを押してください。終了するには「終了」と入力してください。)

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

この問題を解くヒント

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

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

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

1.Shuffleモジュールの定義
 1-1. shuffle_deck メソッドの定義(デッキをシャッフルする機能)

2.Deckクラスの定義
 2-1. Shuffleモジュールのミックスイン
 2-2. initialize メソッド
  2-2-1. @cards インスタンス変数にトランプデッキを生成する
 2-3. generate_deck メソッド(トランプデッキを生成)
  2-3-1. スート(マーク)と値(カードのランク)を組み合わせてデッキを作成
 2-4. shuffle メソッド
  2-4-1. Shuffleモジュールの shuffle_deck メソッドを呼び出してデッキをシャッフル
 2-5. deal_cards メソッド
  2-5-1. シャッフルされたデッキから5枚のカードを配る

3.ShuffleGameクラスの定義
 3-1. initialize メソッド
  3-1-1. Deckクラスのインスタンスを生成し @deck に格納
 3-2. start メソッド
  3-2-1. deal_cards メソッドを使ってカードを5枚配る
  3-2-2. 配られたカードを出力する

4.ゲームの開始ループ
 4-1. 無限ループの開始
  4-1-1. ShuffleGameクラスのインスタンスを作成し、ゲームを開始
  4-1-2. ユーザーにゲームを続けるか確認し、終了するか判断

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

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

# トランプをランダムに配るゲームの実装

# トランプのシャッフル機能を定義するモジュール
module Shuffle
  =begin
  【穴埋め問題1】
  ここにshuffleメソッドを定義し、deckをシャッフルするコードを書いてください。
  ヒント: shuffleメソッドを使います。
  =end
end

# トランプデッキクラス
class Deck
  include Shuffle  # Shuffleモジュールをミックスイン

  def initialize
    =begin
    【穴埋め問題2】
    ここにデッキを生成するためのコードを書いてください。
    generate_deckメソッドを呼び出して、@cardsに結果を格納してください。
    =end
  end

  # デッキを生成するメソッド
  def generate_deck
    suits = ['♠', '♥', '♦', '♣']
    values = (2..10).to_a + ['J', 'Q', 'K', 'A']
    =begin
    【穴埋め問題3】
    ここにsuitsとvaluesを使ってデッキを生成するコードを書いてください。
    productメソッドを使ってカードの組み合わせを生成し、それを文字列に変換して返してください。
    =end
  end

  # デッキをシャッフルするメソッド
  def shuffle
    =begin
    【穴埋め問題4】
    ここにshuffle_deckメソッドを呼び出して、デッキをシャッフルするコードを書いてください。
    @cardsを引数として渡してください。
    =end
  end

  # カードを配るメソッド
  def deal_cards
    =begin
    【穴埋め問題5】
    シャッフルしたデッキからカードを5枚取り出して返すコードを書いてください。
    takeメソッドを使用します。
    =end
  end
end

# ゲームクラス
class ShuffleGame
  def initialize
    =begin
    【穴埋め問題6】
    Deckクラスのインスタンスを作成して@deckに格納するコードを書いてください。
    =end
  end

  # ゲームを開始するメソッド
  def start
    =begin
    【穴埋め問題7】
    deckからdeal_cardsメソッドを使ってカードを配り、それを表示するコードを書いてください。
    =end
  end
end

# ゲームの開始
loop do
  =begin
  【穴埋め問題8】
  ShuffleGameクラスのインスタンスを作成してstartメソッドを呼び出すコードを書いてください。
  =end
  puts "ゲームを続けますか?(続けるにはエンターキーを押してください。終了するには「終了」と入力してください。)"
  continue_game = gets.chomp
  break if continue_game == "終了"
end

puts "ゲームを終了します。"

 

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



解答例と解説

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

正解コードの例

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

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

# トランプをランダムに配るゲームの実装

# トランプのシャッフル機能を定義するモジュール
module Shuffle
  def shuffle_deck(deck)
    deck.shuffle
  end
end

# トランプデッキクラス
class Deck
  include Shuffle  # Shuffleモジュールをミックスイン

  def initialize
    @cards = generate_deck
  end

  # デッキを生成するメソッド
  def generate_deck
    suits = ['♠', '♥', '♦', '♣']
    values = (2..10).to_a + ['J', 'Q', 'K', 'A']
    suits.product(values).map { |suit, value| "#{suit}#{value}" }
  end

  # デッキをシャッフルするメソッド
  def shuffle
    shuffle_deck(@cards)
  end

  # カードを配るメソッド
  def deal_cards
    shuffle.take(5)
  end
end

# ゲームクラス
class ShuffleGame
  def initialize
    @deck = Deck.new
  end

  # ゲームを開始するメソッド
  def start
    cards = @deck.deal_cards
    puts "あなたに配られたカード: #{cards.join(', ')}"
  end
end

# ゲームの開始
loop do
  game = ShuffleGame.new
  game.start
  puts "ゲームを続けますか?(続けるにはエンターキーを押してください。終了するには「終了」と入力してください。)"
  continue_game = gets.chomp
  break if continue_game == "終了"
end

puts "ゲームを終了します。"

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

コードの解説

このプログラムでは、トランプをランダムにシャッフルして、5枚のカードをプレイヤーに配るゲームを実装しています。

Rubyの基本的なクラスやメソッド、モジュールの使い方を学ぶことができる内容です。

Shuffle モジュール

モジュールは、クラスに共通の機能を追加したいときに使用します。

このプログラムでは、トランプをシャッフルする機能を Shuffle モジュールで定義しています。

module Shuffle
  def shuffle_deck(deck)
    deck.shuffle
  end
end

shuffle_deck メソッドは、受け取ったデッキ(カードの配列)を shuffle メソッドを使ってランダムに並び替えます。

これで、トランプのシャッフル機能をクラスに追加できます。

Deck クラス

Deck クラスはトランプのデッキを管理します。

Deck クラスでは、トランプのデッキを生成し、シャッフルするメソッドが含まれています。

class Deck
  include Shuffle  # Shuffleモジュールをミックスイン

include Shuffle で、Shuffle モジュールの機能をこのクラスに組み込みます。これにより、Deck クラス内で shuffle_deck メソッドが使えるようになります。

generate_deck メソッド

このメソッドは、トランプの全カードを作成するために使用されます。suits はトランプの4つのスート(マーク)を定義し、values はカードの数字と絵札を表しています。

suits = ['♠', '♥', '♦', '♣']
values = (2..10).to_a + ['J', 'Q', 'K', 'A']
suits.product(values).map { |suit, value| "#{suit}#{value}" }

suits.product(values) は、スートと値を組み合わせたすべてのカードを生成します。

map を使って、それらの組み合わせを文字列に変換し、カードのデッキを作成します。

ShuffleGame クラス

このクラスは、ゲームの全体の流れを管理します。start メソッドで、シャッフルされたカードをプレイヤーに配る処理が実行されます。

class ShuffleGame
  def initialize
    @deck = Deck.new
  end

  def start
    cards = @deck.deal_cards
    puts "あなたに配られたカード: #{cards.join(', ')}"
  end
end

@deck = Deck.new で新しいデッキを作成し、@deck.deal_cards でシャッフルされたカードから5枚をランダムに配ります。

ループでゲームを続行

最後に、ゲームがループして続けられるようになっています。loop でゲームを繰り返し実行し、「終了」と入力されるとゲームが終了します。

loop do
  game = ShuffleGame.new
  game.start
  puts "ゲームを続けますか?(続けるにはエンターキーを押してください。終了するには「終了」と入力してください。)"
  continue_game = gets.chomp
  break if continue_game == "終了"
end

ここでは、プレイヤーに「ゲームを続けるかどうか」を確認し、「終了」と入力するとループが終了してゲームが終わります。

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

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

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

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






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