【Ruby】レッスン4-☆3:トランプ配布ゲームで配列とメソッドを実践しよう

一つ前のページではアラビア数字をローマ数字に変換するコードを書きました。
今回は トランプをランダムに配るコード を書いてみましょう。
Lesson1:基礎文法編
Lesson2:制御構造編
Lesson3:メソッド編
Lesson4:コレクション編
・Lesson4-1:配列の基本を理解しよう ◁今回はココ
・Lesson4-2:配列を操作しよう
・Lesson4-3:配列を調査しよう
・Lesson4-4:配列を並び替えよう
・Lesson4-5:eachメソッドを理解しよう
・Lesson4-6:mapメソッドを理解しよう
・Lesson4-7:filterメソッドを理解しよう
・Lesson4-8:ハッシュを理解しよう
・確認問題4-☆1:ナインゲームを作ろう
・確認問題4-☆2:アラビア数字をローマ数字に変換しよう
・確認問題4-☆3:トランプをランダムに配ろう
Lesson5:オブジェクト指向編
確認問題|配列とメソッドでトランプをシャッフル&配布しよう

ンプデッキを生成し、それをシャッフルしてカードを配る簡単なゲームを作成してみましょう。このゲームでは以下のような手順で進行します。
- トランプデッキを作成する。
- デッキをシャッフルする。
- シャッフルされたデッキから5枚のカードを配る。
- ゲームを繰り返すか終了するかを選択する。
この問題ではメソッドの定義と呼び出しについて学びます。
与えられた手順に従い、指定された機能を持つコードを完成させてください。
generate_deck
メソッドを定義し、以下の内容を持つトランプデッキを生成してください。- マークは「♠, ♥, ♦, ♣」の4種類。
- 数字は 2 から 10 までと、絵札(’J’, ‘Q’, ‘K’, ‘A’)を含む。
- 例:
♠2, ♥J
のような形式。
shuffle_deck
メソッドを定義し、トランプデッキをランダムに並び替えてください。deal_cards
メソッドを定義し、シャッフルされたデッキから上位5枚を取り出して返してください。start_game
メソッドを定義し、以下を実行してください。generate_deck
を呼び出してデッキを生成する。deal_cards
を呼び出して5枚のカードを取得する。- 配られたカードを画面に表示する。
- ユーザーが「終了」と入力するまでゲームを続けられるようにループを実装してください。
ただし、以下のような実行結果となること。
あなたに配られたカード: ♠A, ♥3, ♦J, ♣5, ♥K ゲームを続けますか?(続けるにはエンターキーを押してください。終了するには「終了」と入力してください。) (エンターキーを押す) あなたに配られたカード: ♣7, ♥9, ♦2, ♠Q, ♠6 ゲームを続けますか?(続けるにはエンターキーを押してください。終了するには「終了」と入力してください。) 終了 ゲームを終了します。
【ヒント】自力で解くのが難しい人へ
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
- ヒント1【コードの構成を見る】
-
正解のコードは上から順に以下のような構成となっています。
1:
generate_deck
メソッドを定義し、トランプデッキを生成
□ マークを格納する配列suits
を定義
□ 数字と絵札を格納する配列values
を定義
□product
メソッドを使用してマークと数字の組み合わせを生成
□map
メソッドを使用して各組み合わせを文字列形式に変換し、配列で返す
2:shuffle_deck
メソッドを定義し、デッキをシャッフル
□shuffle
メソッドを呼び出してデッキをランダムに並び替える
3:deal_cards
メソッドを定義し、カードを配る
□shuffle_deck
メソッドを呼び出してデッキをシャッフル
□take
メソッドを使用して上位5枚を配列として返す
4:start_game
メソッドを定義し、ゲームを開始
□generate_deck
メソッドを呼び出してデッキを生成
□deal_cards
メソッドを呼び出して5枚のカードを取得
□ 取得したカードをputs
メソッドで画面に表示
5:変数continue_game
を空文字列で初期化
6:while
ループを定義し、continue_game
が”終了”でない限り繰り返す
□start_game
メソッドを呼び出してゲームを開始
□ 「ゲームを続けますか?」のメッセージをputs
メソッドで表示
□gets.chomp
を使用してユーザー入力をcontinue_game
に代入
7:「ゲームを終了します。」をputs
メソッドで表示
- ヒント2【穴埋め問題にする】
-
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
# トランプデッキを生成するメソッド def generate_deck =begin 【穴埋め問題1】 ここでトランプデッキを生成し、配列として返すコードを書いてください。 =end end # デッキをシャッフルするメソッド def shuffle_deck(deck) =begin 【穴埋め問題2】 ここで引数として渡されたデッキをランダムに並び替えるコードを書いてください。 =end end # カードを配るメソッド def deal_cards(deck) =begin 【穴埋め問題3】 ここでシャッフルされたデッキから上位5枚を取り出し、配列として返すコードを書いてください。 =end end # ゲームを開始するメソッド def start_game =begin 【穴埋め問題4】 ここで以下を実施してください: 1. `generate_deck` メソッドを呼び出してデッキを生成する。 2. `deal_cards` メソッドを呼び出してカードを取得する。 3. 配られたカードを画面に表示する。 =end end # ゲームループ continue_game = "" while continue_game != "終了" =begin 【穴埋め問題5】 ここでゲームを開始するコードを書いてください。また、ループの最後でユーザーの入力を取得し、それを変数`continue_game`に代入してください。 =end end puts "ゲームを終了します。"
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
この問題の解答例と解説
この問題の正解コードとその解説は以下の通りです。
クリックして開いて確認してください。
- 正解コード
-
# トランプデッキを生成するメソッド def generate_deck suits = ['♠', '♥', '♦', '♣'] values = (2..10).to_a + ['J', 'Q', 'K', 'A'] suits.product(values).map { |suit, value| "#{suit}#{value}" } end # デッキをシャッフルするメソッド def shuffle_deck(deck) deck.shuffle end # カードを配るメソッド def deal_cards(deck) shuffle_deck(deck).take(5) end # ゲームを開始するメソッド def start_game deck = generate_deck cards = deal_cards(deck) puts "あなたに配られたカード: #{cards.join(', ')}" end # ゲームループ continue_game = "" while continue_game != "終了" start_game puts "ゲームを続けますか?(続けるにはエンターキーを押してください。終了するには「終了」と入力してください。)" continue_game = gets.chomp end puts "ゲームを終了します。"
- 正解コードの解説
-
コードをブロックごとに分割して解説します。
トランプデッキを生成するメソッド
def generate_deck suits = ['♠', '♥', '♦', '♣'] values = (2..10).to_a + ['J', 'Q', 'K', 'A'] suits.product(values).map { |suit, value| "#{suit}#{value}" } end
def generate_deck
ここではトランプデッキを作るメソッドを定義しています。メソッドはRubyでコードを再利用するための便利な機能です。suits
トランプのマーク(♠, ♥, ♦, ♣)を配列として定義しています。values
数字のカードと絵札(J, Q, K, A)を配列として定義しています。product
2つの配列からすべての組み合わせを生成します。例えば「♠2」「♠3」などのカードを作ります。map
各組み合わせを文字列形式に変換して、最終的なデッキを配列として返します。
デッキをシャッフルするメソッド
def shuffle_deck(deck) deck.shuffle end
def shuffle_deck
デッキをランダムに並び替えるメソッドです。shuffle
Rubyの組み込みメソッドで、配列の要素をランダムに並び替えます。
カードを配るメソッド
def deal_cards(deck) shuffle_deck(deck).take(5) end
shuffle_deck(deck)
デッキをシャッフルするメソッドを呼び出します。take(5)
配列の先頭から5枚のカードを取り出し、新しい配列として返します。
ゲームを開始するメソッド
def start_game deck = generate_deck cards = deal_cards(deck) puts "あなたに配られたカード: #{cards.join(', ')}" end
deck = generate_deck
トランプデッキを生成します。deal_cards(deck)
デッキから5枚のカードを配ります。puts
配られたカードを画面に表示します。join(', ')
を使って配列をカンマ区切りの文字列に変換しています。ゲームループ
continue_game = "" while continue_game != "終了" start_game puts "ゲームを続けますか?(続けるにはエンターキーを押してください。終了するには「終了」と入力してください。)" continue_game = gets.chomp end puts "ゲームを終了します。"
while continue_game != "終了"
ユーザーが「終了」と入力するまでゲームを繰り返します。gets.chomp
ユーザーからの入力を受け取り、余分な改行を削除します。puts
ゲーム終了時にメッセージを表示します。