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.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. ユーザーにゲームを続けるか確認し、終了するか判断
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
# トランプをランダムに配るゲームの実装 # トランプのシャッフル機能を定義するモジュール 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を活用しています。
問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。