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

50110130

一つ前のページではアラビア数字をローマ数字に変換するコードを書きました。

今回は トランプをランダムに配るコード を書いてみましょう。

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:オブジェクト指向編

<<前のページ

Rubyの記事一覧

次のページ>>

確認問題|配列とメソッドでトランプをシャッフル&配布しよう

ンプデッキを生成し、それをシャッフルしてカードを配る簡単なゲームを作成してみましょう。このゲームでは以下のような手順で進行します。

  1. トランプデッキを作成する。
  2. デッキをシャッフルする。
  3. シャッフルされたデッキから5枚のカードを配る。
  4. ゲームを繰り返すか終了するかを選択する。

この問題ではメソッドの定義と呼び出しについて学びます。

与えられた手順に従い、指定された機能を持つコードを完成させてください。

  1. generate_deck メソッドを定義し、以下の内容を持つトランプデッキを生成してください。
    • マークは「♠, ♥, ♦, ♣」の4種類。
    • 数字は 2 から 10 までと、絵札(’J’, ‘Q’, ‘K’, ‘A’)を含む。
    • 例: ♠2, ♥J のような形式。
  2. shuffle_deck メソッドを定義し、トランプデッキをランダムに並び替えてください。
  3. deal_cards メソッドを定義し、シャッフルされたデッキから上位5枚を取り出して返してください。
  4. start_game メソッドを定義し、以下を実行してください。
    • generate_deck を呼び出してデッキを生成する。
    • deal_cards を呼び出して5枚のカードを取得する。
    • 配られたカードを画面に表示する。
  5. ユーザーが「終了」と入力するまでゲームを続けられるようにループを実装してください。

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

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

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

ゲームを終了します。

【ヒント】自力で解くのが難しい人へ

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

Q
ヒント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メソッドで表示

Q
ヒント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 "ゲームを終了します。"

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

この問題の解答例と解説

この問題の正解コードとその解説は以下の通りです。

クリックして開いて確認してください。

Q
正解コード
# トランプデッキを生成するメソッド
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 "ゲームを終了します。"
Q
正解コードの解説

コードをブロックごとに分割して解説します。

トランプデッキを生成するメソッド

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
ゲーム終了時にメッセージを表示します。

もっと分かりやすいサイトにするために

この記事を読んで「ここが分かりにくかった」「ここが難しかった」等の意見を募集しています。

世界一わかりやすいRuby学習サイトにするため、ぜひ 問い合わせフォーム からご意見下さい。

<<前のページ

Rubyの記事一覧

次のページ>>

記事URLをコピーしました