【Ruby】確認問題4-☆3:トランプをランダムに配ろう

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

この記事の練習問題で使用する知識:
基礎文法(レッスン1)比較演算子と論理演算子while文による繰り返し処理メソッドの定義と呼出し例外処理配列の基本mapメソッド

Rubyのゲームコード一覧はこちら

<<前のページ 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からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

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

正解コードの解説

今回のRubyコードではトランプデッキを生成してシャッフルし、ランダムにカードを配るシンプルなゲームを実装しました。

このコードをブロックごとに分解し、詳しく解説していきます。

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

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記事一覧 次のページ>>

この記事への質問・コメント

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

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






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